Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 1509, средняя оценка - 4.80
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
#1

Пишем свой интерпретатор языка BASIC - C++

20.06.2009, 20:03. Просмотров 189727. Ответов 464
Метки нет (Все метки)

*****************
Благодаря форуму и Evg в частности интерпретатор развивается, потихоньку превращаясь в простенький интерпретатор QBASIC.
Некоторые из самых старых версий сохранились в теме и ссылки на них будут добавлены в это сообщение,а также ссылки на другие темы,связанные с этой.

Репозиторий с проектом находится тут, там же есть возможность в браузере посмотреть историю ревизий (английский в логах весьма примитивен,комментарии и рекомендации можете писать в личку),а также скачать самый последний архив репозитория в формате .tar.gz
Если кто-то пользуется Subversion,скачать исходники можно так:
Код
svn co https://basin.svn.sourceforge.net/svnroot/basin basin
Эти темы возникли в результате моих вопросов по ходу написания:
Технический приём для формирования согласованных данных
Makefile: как с использованием gcc строить автоматические зависимости от .h файлов?
Вопрос по svn (Subversion)
Создание системы тестирования ПО.
Вопрос про разные реализации бэйсиков
Можно ли выразить порядковый номер элемента массива через индексы?
[C++] Какие флаги указать линкеру для компиляции программы?
Как можно определить переменную в файле configure.in,чтобы её можно было использовать в Makefile?
Странный SIGSEGV, или что зависит от порядка написания интерфейса класса
[C++]Можно ли как-то указать в Makefile,чтобы часть файлов компилировал компилятор C?
Альтернативная версия интерпретатора от Evg на C
Это простая реализация разбора выражений, написанная Evg на C:
Представление выражения в двоичном дереве
*****************
Первое сообщение:
*****************
Задание(Страуструп,из книги,по готовому коду): Введите программу калькулятора и заставьте её работать.Например,при вводе
C++
1
2
r = 2.5
area = pi*r*r
Программа калькулятора выведет:
C++
1
2
2.5
19.635
Получили такой код:
LexicalAnalyzer.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// LexicalAnalyzer.h
#ifndef LEXICALANALYZER_H_INCLUDED
#define LEXICALANALYZER_H_INCLUDED
 
#include <cctype>
#include <string>
#include <map>
#include <iostream>
 
enum Token_value {
    NAME,       NUMBER,      END,
    PLUS = '+', MINUS = '-', MUL = '*', DIV = '/',
    PRINT = ';',ASSIGN = '=',LP = '(',  RP = ')'
};
extern Token_value curr_tok;
extern std::map<std::string,double>table;
extern int no_of_errors;
 
Token_value get_token();
 
double expr(bool);
double term (bool);
double prim (bool);
int error(const std::string&);
 
#endif // LEXICALANALYZER_H_INCLUDED

LexicalAnalyzer.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
// LexicalAnalyzer.cpp
#include "LexicalAnalyzer.h"
 
 
std::map<std::string,double>table;
Token_value curr_tok=PRINT;
 
double expr (bool get)
{
    double left = term(get);
 
    for (;;)
        switch (curr_tok) {
            case PLUS:
                 left += term(true);
            break;
            case MINUS:
                 left-= term(true);
            break;
            default:
                 return left;
        }
}
 
double term (bool get)
{
    double left = prim (get);
 
    for (;;)
        switch (curr_tok) {
            case MUL:
                 left*=prim(true);
            break;
            case DIV:
                 if (double d = prim (true)) {
                     left /= prim (true);
                     break;
                 }
                 return error("Деление на ноль");
            default:
                 return left;
        }
}
 
double number_value;
std::string string_value;
 
double prim (bool get)
{
    if (get) get_token();
    switch (curr_tok){
        case NUMBER:{
            double& v = number_value;
            get_token();
            return v;
        }
        case NAME:{
            double& v = table[string_value];
            if (get_token()==ASSIGN) v = expr(true);
            return v;
        }
        case MINUS:
            return -prim(true);
        case LP:{
            double e = expr(true);
            if (curr_tok!=RP) return error("Ожидалась )");
            get_token();
            return e;
        }
        default:
            return error("Ожидалось первичное выражение");
    }
}
 
Token_value get_token()
{
    char ch = 0;
 
    do {
        if (!std::cin.get(ch)) return curr_tok = END;
    } while (ch!='\n'&&isspace(ch));
 
    switch (ch) {
        case 0:
             return curr_tok = END;
        case ';':case '\n':
             return curr_tok = PRINT;
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return Token_value(ch);
        case '0':case '1':case '2':case '3':case '4' :
        case '5':case '6':case '7':case '8':case '9':case '.':
             std::cin.putback(ch);
             std::cin>>number_value;
             return curr_tok=NUMBER;
        default:
             if (isalpha(ch)) {
                 string_value = ch;
                 while (std::cin.get(ch)&&isalnum(ch)) string_value.push_back(ch);
                 std::cin.putback(ch);
                 return curr_tok = NAME;
             }
             error ("Неправильная лексема");
             return curr_tok = PRINT;
    }
}
int no_of_errors=0;
int error (const std::string& s)
{
    no_of_errors++;
    std::cerr<<"Ошибка: "<<s<<'\n';
    return no_of_errors;
}

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// main.cpp
#include "LexicalAnalyzer.h"
 
 
int main()
{
    table["pi"]=3.1415926535897932385;
    table["e"]=2.7182818284590452354;
    while (std::cin) {
        get_token();
        if (curr_tok==END) break;
        if (curr_tok==PRINT) continue;
        std::cout<<expr(false)<<'\n';
    }
    return no_of_errors;
}

Анализатор-то работает,но конечное значение не вычисляется.Более того,если вводим
C++
1
a = 3 + 6
,то получаем "a", равное первому элементу в выражении,то есть 3.В чём логическая ошибка данной программы?С этими каскадными вызовами она слегка запутана.Уверен,что кто-то уже делал это задание.

Добавлено через 2 часа 5 минут 30 секунд
Пришлось решать влоб с дебаггером.У Страуструпа опечатка (или намеренная ошибка,что более вероятно ) Вот в этом куске кода в функции get_token():
C++
1
2
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return Token_value(ch);
Нехватает смены значения curr_tok,что и приводит к ошибочной работе.
C++
1
2
        case '*':case'/':case '+':case '-':case '(':case ')':case '=':
             return curr_tok=Token_value(ch);
Теперь всё пашет,всем спасибо,вопрос можно считать закрытым,но есть вопрос поважнее: В функциях prim и term возвращается int при ошибке,но ведь они имеют тип double,как вообще это работает?Происходит неявное преобразование типа,так?Мне интересно,почему Страуструп прибег к такому способу,это распространённая практика?

Добавлено через 16 минут 19 секунд
И ещё опечатка была
C++
1
2
3
                 if (double d = prim (true)) {
                     left /= d;// было left /= prim (true)
                     break;
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.06.2009, 20:03     Пишем свой интерпретатор языка BASIC
Посмотрите здесь:
Пишем свой чекер C++
C++ пишем свой троян с нуля
Пишем свой класс, спецификатор доступа protected C++
C++ Интерпретатор небольшого языка программирования на С++
Не удается откомпилировать интерпретатор М-языка C++
Написать Интерпретатор Программного Языка(собственного) C++
Интерпретатор/компилятор ассемблер-подобного языка C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
19.10.2009, 01:17  [ТС]     Пишем свой интерпретатор языка BASIC #196
Есть только печать дерева при исполнении,то есть видишь не всё построение,а только ветки,по которым идёт программа.Делается или OPTION TRACE TREE 1 в начале исходника,или --trace-tree из консоли.Печатать всё дерево не вижу смысла,если только для себя.То есть конечно для пользователя удобнее смотреть печать только тех инструкций,которые исполняются,навроде отладочного средства,но всё дерево печатать наверное не нужно?

>Ну и как я об этом мог догадаться? Правда для пользовательской опции такое поведение несколько нелогично, ну да фиг с ним пока

А мне,наоборот кажется это весьма логичным:представь,что пользователь рисует что нибудь-такая печать будет мешать процессу отладки,ломая изображение.Или данные печатаются в виде таблицы,да мало ли чего.Другое дело,надо это где-то явно указать,куда пишется отладка.Например,перед началом запуска программы пользователь получает сообщение на экране,о том куда будут записаны данные в случае печати в файл.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
19.10.2009, 12:41     Пишем свой интерпретатор языка BASIC #197
Цитата Сообщение от #pragma Посмотреть сообщение
Есть только печать дерева при исполнении,то есть видишь не всё построение,а только ветки,по которым идёт программа.Делается или OPTION TRACE TREE 1 в начале исходника,или --trace-tree из консоли.Печатать всё дерево не вижу смысла,если только для себя.То есть конечно для пользователя удобнее смотреть печать только тех инструкций,которые исполняются,навроде отладочного средства,но всё дерево печатать наверное не нужно?
Естественно, это нужно как внутреннее отладочное средство (т.е. НЕ для пользователя). Хороший набор отладочных средств в большинстве случаев позволяет найти ошибку только глядя на отладочные печати и трассы и не прибегать к отладчику

Цитата Сообщение от #pragma Посмотреть сообщение
А мне,наоборот кажется это весьма логичным:представь,что пользователь рисует что нибудь-такая печать будет мешать процессу отладки,ломая изображение
Правильно

Цитата Сообщение от #pragma Посмотреть сообщение
Или данные печатаются в виде таблицы,да мало ли чего.Другое дело,надо это где-то явно указать,куда пишется отладка.Например,перед началом запуска программы пользователь получает сообщение на экране,о том куда будут записаны данные в случае печати в файл.
Не надо за пользователя что-то решать. Это дурной тон в стиле микрософта. Пользователь должен иметь набор инструментов для того, чтобы саму решать что и как делать. В данном случае нужна пользовательская опция, чтобы задать, куда сливается вся трассировочная печать. Нормальным поведением было бы по опции --trace-tree печатать в stdout (т.е. туда же, куда и PRINT) - тогда будет чёткое представление что и как запускается относительно пользовательских PRINT'ов. По дополнительной опции (либо в случае, если задано --trace-tree=<file>) сливать печать в файл, указанный пользователю. Точно так же все имена файлов можно настраивать через OPTION. Т.е. предоставить набор средств, предоставляющий пользователю полную свободу выбора: "хочешь - мороженное, хочешь - пирожное" (c)

Добавлено через 13 минут
И что немаловажно - выбор настроек по умолчанию. Т.е. при просто поданной опции правильным (на мой взгляд) считается печатать в stdout, ибо увидев эту опцию в help'е и начав проверять"методом тыка", увидев лишнюю печать на экране пользователь хоятбы поймёт, что эта функциональность реально работает и что оно делает
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
22.10.2009, 00:02  [ТС]     Пишем свой интерпретатор языка BASIC #198
Вот касательно этого созрел вопрос.
Цитата Сообщение от Evg Посмотреть сообщение
3. А теперь самое интересное. Заводим в function.cpp некую внутреннюю функцию "__print". "Внутреннюю" в том смысле, что пользователь напрямую её вызвать не может. Далее в процессе разбора синтаксиса вместо оператора SK_PRINT строим некий фиктивный оператор CALL (который по сути то же самое, что ты сейчас с делал в выражении) и будем строить операцию вызова процедуры "__print" и формировать список параметров к ней. Такое поведение даёт тебе тот же самый бонус, что и в пункте 1: по сути поведение PRINT'а у тебя настраивается только "сверху" и "снизу", а вся "серёдка" остаётся без изменений.
Функции ведь возвращают какое-то значение,хотя и не всегда.Так сложилось исторически,что у меня при интерпретации кажая функция,обрабатывающая statement,возвращает указатель на следующую инструкцию в списке.А как ты видишь вариант с функциями? Я так немного прикинул,что будет функция interp_stmtCALL(stmt),и есть некий контейнер,в котором хранятся последние вычисленные значения функций.Но это всё же видится как костыль.Или нет? То есть если функция может выполнять роль инструкции(то есть быть не в выражении,а просто в программе) ,тогда нужно где-то хранить возвращаемое значение? Просто я начал перенос PRINT и в голову пришла такая мысль...
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
22.10.2009, 09:46     Пишем свой интерпретатор языка BASIC #199
В моём пониятии вызов функции - это всё-таки expr, а не statement. В случае print'а мы имеем statement с именем call, который внутри себя содержит expr с именем call. У себя я буду делать так, что все функции (__print, __line и т.п.) на вход будут понимать список value'ов (или масив - не суть) и возвращать value. Внутри выражений будет всё считаться точно так же, как и, например, для операции сложения - отдаём куда-то значения, а то, что нам возвращается, отдаём наверх.

Только вот с такой позиции пока не совсем понятно, как делать INPUT. Т.е. он содержит имя переменной, которую надо передавать НЕ как value, а наоборот, как адрес. Теоретически это рулится элементарно тем, что заводится value, означающее адрес на переменную. Но в моём варианте интерпретатора нет нигде взятие адреса на переменную, т.к. мне не хотелось выставлять в интерфейс прямой доступ к месту, где хранится value внутри переменной, но по ходу дела придётся

Исходя из такой концепции можно и арифметические выражения удалять и реализовывать их в виде функций. Таким образом промежуточное представление будет состоять по большому счёту из одних операций call. Единственное, я пока не уверен, а не будет ли это слишком большим извратом.

Добавлено через 22 минуты
Хотя с INPUT'ом я что-то торможу. Процедура __input возвращает в виде строкового value то, что введено с клавиатуры. А дальше просто строится операция присваивания с корректным учётом типа
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
25.10.2009, 20:00  [ТС]     Пишем свой интерпретатор языка BASIC #200
Сделал инструкцию SCREEN(ревизия 42),пока только в одном варианте,так как там куча всяких режимов,я даже не знаю,получится ли все их сделать,библиотеки разные,выбрал наиболее подходящий.(640 на 480,глубина цвета 16 бит,страница создаётся в системной памяти)
В-общем,если интересно попробовать(в принципе там ничего пока не увидишь,только чёрный экран с курсором),то тогда нужно указать режим возврата(то есть твой режим видео) а то экран так и останется в 640Х480,а мне даже понравилось,некоторые старые игрушки,Homm 3 например,не растягиваются у меня на полный экран,так как у меня widescreen,а это способ,возможно,насильно растянуть картинку как хочешь.
Менять нужно в файле graphics.h вот эти два enum'a
C++
1
2
3
4
5
6
7
8
9
10
11
  enum ScreenModeW { // Screen width
     x640  = 640,
     x800  = 800,
     x1400 = 1400
  };
/* -------------------------------------------------------------------------- */
  enum ScreenModeH { // Screen height
     x480 = 480,
     x600 = 600,
     x900 = 900
  };
и функцию
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
  template <class T> void graphics_SetSCREEN (T params)
  {
     switch (params->at(0)->Get_ival())
     {
        case 12: // SCREEN 12
           if (!graphics.isinit())
              if (SDL_Init( SDL_INIT_VIDEO ) < 0)
                 error(CANNOT_INIT_VIDEO_SUBSYS);
           Gr_Surface_t *display;
           if (SDL_VideoModeOK(ScreenModeW(x640),ScreenModeH(x480),
                                               BitDepth(_16bit),SDL_SWSURFACE|
                                                                SDL_FULLSCREEN))
              display = SDL_SetVideoMode (ScreenModeW(x640),ScreenModeH(x480),
                                               BitDepth(_16bit),SDL_SWSURFACE|
                                                                SDL_FULLSCREEN);
 
           else error(CANNOT_SET_DISPLAY);
           // TODO Just for test,need to be removed later
           sleep(2);
           if (SDL_VideoModeOK(ScreenModeW(x1400),ScreenModeH(x900),
                                               BitDepth(_32bit),SDL_SWSURFACE|
                                                                SDL_FULLSCREEN))
              display = SDL_SetVideoMode (ScreenModeW(x1400),ScreenModeH(x900),
                                               BitDepth(_32bit),SDL_SWSURFACE|
                                                                SDL_FULLSCREEN);
           //////////////////////////////////////////////
           assert (display);
           graphics.set_last_display(display);
        break;
        default: error(UNKNOWN_VIDEO_MODE);
     }
  }
Как раз после // TODO,просто прописать новые значения из перечислений.
И ксатати,если не нужно полный экран,то просто убрать " | SDL_FULLSCREEN"
Насчёт линий и прочего я не нашёл специальных функций,но зато обнаружил пример рисования пикселя на экране.Причём функцию нужно писать самому.Но главное нарисовать точку,а там уже "да здравствует математика".
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 20:06     Пишем свой интерпретатор языка BASIC #201
Ребята, а исходники сего дела где-то есть?

Добавлено через 38 секунд
Сорри, нашел.

Добавлено через 1 минуту
Тут: http://www.cyberforum.ru/misc.php?do...hments&t=41218
Но он там не один. Какой из них?
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
25.10.2009, 20:12  [ТС]     Пишем свой интерпретатор языка BASIC #202
Ненене,это уже в прошлом давно,вот где лежат последние версии(/thread41218-page6.html#post252723) Пишем свой интерпретатор языка BASIC там всё написано,можно просто скачать архив в формате .tar http://basin.svn.sourceforge.net/vie...ar.gz?view=tar И этот архив и будет самой последней версии,так как я не часто просто релизю архив на главной странице.
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
25.10.2009, 20:19     Пишем свой интерпретатор языка BASIC #203
А где качать SDL и как её устанавливать? А то оно уже не компилится без этого

Добавлено через 1 минуту
Цитата Сообщение от #pragma Посмотреть сообщение
Ненене,это уже в прошлом давно,вот где лежат последние версии(/thread41218-page6.html#post252723) Пишем свой интерпретатор языка BASIC там всё написано,можно просто скачать архив в формате .tar http://basin.svn.sourceforge.net/vie...ar.gz?view=tar И этот архив и будет самой последней версии,так как я не часто просто релизю архив на главной странице.
Для порядку надо видимо ревизию 41 качать, где ещё без графики
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
25.10.2009, 20:26  [ТС]     Пишем свой интерпретатор языка BASIC #204
Отсюда качаются исходники http://www.libsdl.org/ бинарники для винды тоже есть,а если доступен репозиторий,то нужно просто найти пакет libsdl1.2-dev или что-то похожее.Ну и конечно если на винде,то нужно в опциях линкера указать путь к нужному .dll или что-то вроде(сам не пробовал)
Может,сделать компиляцию графики как опцию препроцессора,чтобы кому не надо графику,не парились и не качали пакеты?
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 20:34     Пишем свой интерпретатор языка BASIC #205
#pragma, Может задам тупой вопрос, но для чего интерпретатору SDL ?
п.с.
нужно прочитать все страницы этой темы
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
25.10.2009, 20:42  [ТС]     Пишем свой интерпретатор языка BASIC #206
Цитата Сообщение от niXman Посмотреть сообщение
#pragma, Может задам тупой вопрос, но для чего интерпретатору SDL ?
Чтобы как-то работать с графикой.И желательно кроссплатформенное решение.Перечитав про разные библиотеки,остановился на этой.Вспомни,ведь есть же в QBASIC и SCREEN,и LINE,и т.д. и тут вот и нужна графическая библиотека.

P.S Да,кстати,вот тут уже самое место подумать о GNU Autotools?Чтобы юзер получил все сообщения,чего не хватает..
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 20:43     Пишем свой интерпретатор языка BASIC #207
#pragma, Приблизительно понял...
Evg
Эксперт CАвтор FAQ
17547 / 5785 / 370
Регистрация: 30.03.2009
Сообщений: 15,934
Записей в блоге: 26
25.10.2009, 20:55     Пишем свой интерпретатор языка BASIC #208
Цитата Сообщение от #pragma Посмотреть сообщение
P.S Да,кстати,вот тут уже самое место подумать о GNU Autotools?Чтобы юзер получил все сообщения,чего не хватает..
В этом месте об этом уже надо думать. Но я этим сам никогда не пользовался, так что конструктивных советов наврядли дам

Добавлено через 4 минуты
Цитата Сообщение от #pragma Посмотреть сообщение
Отсюда качаются исходники http://www.libsdl.org/ бинарники для винды тоже есть,а если доступен репозиторий,то нужно просто найти пакет libsdl1.2-dev или что-то похожее.Ну и конечно если на винде,то нужно в опциях линкера указать путь к нужному .dll или что-то вроде(сам не пробовал)
А как ты это ставил? Потому что rpm не поставился, ибо там миллион зависимостей надо, а из исходников у меня не скомилилось, т.к. требует какие-то X'овые инклюды, которые у меня не установлены

Цитата Сообщение от #pragma Посмотреть сообщение
Может,сделать компиляцию графики как опцию препроцессора,чтобы кому не надо графику,не парились и не качали пакеты?
Это уже можно через Autotools сделать
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
25.10.2009, 21:00  [ТС]     Пишем свой интерпретатор языка BASIC #209
У меня система основана на Debian,я просто нашёл в репозитории пакет libsdl1.2-dev,и все сделал в файле
#include <SDL/SDL.h> ,ну и линкеру путь указал.Ещё раз убеждаюсь,что нужно переделать структуру с Autotools.

>Это уже можно через Autotools сделать
Я тоже не знаю Autotools,придётся как-то разбираться.

>Потому что rpm не поставился, ибо там миллион зависимостей надо, а из исходников у меня не скомилилось, т.к. требует какие-то X'овые инклюды, которые у меня не установлены

Так что теперь,получается,на RedHat и других системах это вообще не поставится?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.10.2009, 21:06     Пишем свой интерпретатор языка BASIC
Еще ссылки по теме:
C++ Написать интерпретатор программного языка -помощь
C++ Интерпретатор музыки стандарта BASIC PLAY на С++
Задание: разработать "Интерпретатор языка". С чего начать? C++
C++ Перепишите пожалуйста код программы с языка Visual Basic в C++
По русскому названию языка программирования определить английское название этого языка C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 21:06     Пишем свой интерпретатор языка BASIC #210
Серьезно поработали, респект!
Yandex
Объявления
25.10.2009, 21:06     Пишем свой интерпретатор языка BASIC
Закрытая тема Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru