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

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

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

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

20.06.2009, 20:03. Просмотров 190345. Ответов 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++
Я хочу написать свой чекер, но не знаю с чего начать? Кто знает основные принцип работы чекеров прошу объясните.

пишем свой троян с нуля - C++
Всем привет)))соглашусь, что изобретаю велосипед, но хочется сделать все своими ручками не прибегая к open source и т.п. для повышения...

Пишем свой класс, спецификатор доступа protected - C++
Всем привет! Из книги Р. Лафоре относительно спецификатора доступа protected: Далее пишется следующее: Возникает вопросы:...

Не удается откомпилировать интерпретатор М-языка - C++
Задача: взять интерпретатор М-языка на сайте http://cmcmsu.no-ip.info/2course/model.lang.parser.sample.htm и переработать его, добавив в...

Интерпретатор небольшого языка программирования на С++ - C++
Здравствуйте, уважаемые форумчане! Я тут где-то год назад прочитал тему Evg и #pragma о создании интерпретатора, меня эта тема очень...

Написать Интерпретатор Программного Языка(собственного) - C++
Здраствуйте! Кто знает C++ помогите пожалуйста с реализацией данного задания!!! Пожалуйста, очень надо. сроки поджимают. Есть...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
25.10.2009, 21:06 #211
Цитата Сообщение от #pragma Посмотреть сообщение
Так что теперь,получается,на RedHat и других системах это вообще не поставится?
Да всё поставится, только уметь надо. У меня вот вечные проблемы с тем, чтобы что-нибудь настроить и установить. У меня убунту
niXman
Эксперт C++
3134 / 1446 / 49
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
25.10.2009, 21:07 #212
Цитата Сообщение от Evg Посмотреть сообщение
У меня убунту
C
1
sudo apt-get install libsdl-dev
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
25.10.2009, 21:14 #213
niXman, а саму libsdl?

В общем в итоге всё поставил, как водится, через ж..у. Скачал бинарники в виде rpm'ов, то скачал установил rpm, ручками оттуда выдрал файлы и ручками скопировал

Добавлено через 16 секунд
В итоге чёрный экран-таки вылез

Добавлено через 1 минуту
По поводу autotools. Специально для этого со многими библиотеками ставится специальная программа. В данном случае имеется sdl-config, которая выдаст конфигурацию, где установлена libsdl (где библиотеки, где инклюды) с тем, чтобы нужный набор опций воткнуть в Makefile
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.10.2009, 04:39  [ТС] #214
Добавил PRESET(ревизия 43),пока по умолчанию рисует на экране точку зелёным цветом,завтра займусь цветами уже.Но уже можно,даже не имея LINE,разрисовать экран линиями ))
Вот этот исходник уже работает
PureBasic
1
2
3
4
5
6
SCREEN 12
FOR i=5 TO 640 STEP 5
   FOR j=1 TO 480
     PRESET (i,j)
   NEXT j
NEXT i
Только в глазах рябит от линий
Правда у меня там получается небольшая свалка в .h файле,я попробовал как-то сделать так,чтобы graphics.h не подключала value_class.h,конечно,нужно просто передавать массив из int-ов просто,я же сделал шаблоны,сам не знаю зачем,но я переделаю потом,уж больно не терпелось сделать хоть что-то..

Кстати,насчёт отображения всего дерева - я уже забыл,но ведь давно уже сделана отладка,просто заглянуть в debugger.h и поменять на DEBUG 1 и ещё STATEMENT_DBG 1
и тогда увидим дерево в файле data_file.dat или если SILENT 0 то в консоли.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
26.10.2009, 08:30 #215
А что такое PRESET? Точку рисует вроде бы оператор PSET

> Кстати,насчёт отображения всего дерева - я уже забыл,но ведь давно уже сделана отладка,просто заглянуть в debugger.h и поменять на DEBUG 1 и ещё STATEMENT_DBG 1

Там вроде бы только имена statement'ов печатались

Добавлено через 3 минуты
> Вот этот исходник уже работает

Только как-то он очень неторопливо работает....
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
26.10.2009, 12:10 #216
На работе возникают warning'и (gcc-4.1.2)

Код
parser.cpp: In function 'parser_TokenType parser_CheckNumInStr(std::string)':
parser.cpp:465: warning: converting to 'size3' from 'double'
Код
function.cpp: In function 'Value func_Calculate(const expr_Node_t*, val_Arr_t*)':
function.cpp:184: warning: passing '_float_t' for argument 1 to '_char_t* c_itoa(_int_t, _char_t*)'
function.cpp:186: warning: passing '_float_t' for argument 1 to '_char_t* c_itoa(_int_t, _char_t*)'
function.cpp: In function 'Value func_Calculate(const stmt_Node_t*, val_Arr_t*)':
function.cpp:351: warning: passing '_float_t' for argument 1 to '_char_t* c_itoa(_int_t, _char_t*)'
function.cpp:353: warning: passing '_float_t' for argument 1 to '_char_t* c_itoa(_int_t, _char_t*)'
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.10.2009, 17:43  [ТС] #217
>А что такое PRESET? Точку рисует вроде бы оператор PSET
Есть такой оператор-и разница между PRESET и PSET только в выборе цвета по умолчанию

>Там вроде бы только имена statement'ов печатались
Да,верно,но можно ещё включить EXPRESSION_DBG 1 тогда уже будет видно более подробно.

>Только как-то он очень неторопливо работает....
Ну да,наверное,ведь всё это написано начинающим,да и рисовать линию приходится по точкам,там же промежуточный процесс-каждый раз заново вычисляются параметры и вызывается 61440 раз функция graphics_PRESET,если бы,например,рисовать линию сразу,то вызывалась бы только одна функция-graphics_LINE и она уже вызывала рисование попиксельно.Я просто не знаю,как в SDL рисовать вырожденные полигоны с заданным углом наклона,попиксельно конечно будет медленнее.Так получается,что функция graphics_PRESET для этого исходника вызывается 61440 раз(если не ошибся)

Насчёт варнингов-функцию c_itoa нужно ещё доделывать,она умеет работать только с int-ами..
Код
parser.cpp: In function 'parser_TokenType parser_CheckNumInStr(std::string)':
parser.cpp:465: warning: converting to 'size3' from 'double'
А это я гляну.Просто я заметил такую штуку,что под виндой вылазят варнинги,которых не было под Линуксом,а доступ к винде не всегда есть
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
26.10.2009, 20:02 #218
Цитата Сообщение от #pragma Посмотреть сообщение
Ну да,наверное,ведь всё это написано начинающим,да и рисовать линию приходится по точкам,там же промежуточный процесс-каждый раз заново вычисляются параметры и вызывается 61440 раз функция graphics_PRESET,если бы,например,рисовать линию сразу,то вызывалась бы только одна функция-graphics_LINE и она уже вызывала рисование попиксельно.Я просто не знаю,как в SDL рисовать вырожденные полигоны с заданным углом наклона,попиксельно конечно будет медленнее.Так получается,что функция graphics_PRESET для этого исходника вызывается 61440 раз(если не ошибся)
Я исходники не смотрел, но пока видится, что для начала в этом надо разобраться. А в чём официальный смысл SDL, если даже линию без поллитры не нарисуешь?

Добавлено через 8 минут
Цитата Сообщение от #pragma Посмотреть сообщение
>Там вроде бы только имена statement'ов печатались
Да,верно,но можно ещё включить EXPRESSION_DBG 1 тогда уже будет видно более подробно.
Что-то больше ясности не стало. Хотел посмотреть, как же у тебя представление выглядит. Ну да фиг с ним
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.10.2009, 20:22  [ТС] #219
>Я исходники не смотрел, но пока видится, что для начала в этом надо разобраться. А в чём официальный смысл SDL, если даже линию без поллитры не нарисуешь?
Да и сам не знаю,уверен что там всё можно,там и с OpenGl работа есть,просто нужно постоянно разбираться с библиотекой.По незнанию предмета я мог и не то что нужно выбрать.На официальном сайте пишут
Код
Simple DirectMedia Layer is a cross-platform multimedia library designed to provide low level access to audio, keyboard, mouse, joystick, 3D hardware via OpenGL, and 2D video framebuffer
Низкоуровневый доступ.Значит ли это,что всё придётся писать самому?Поворот предметов в 2-х мерном пространстве и т.д.Если так,то математику я не помню,или придётся вспоминать,или искать что-то более готовое.
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
26.10.2009, 21:13 #220
Если низкоуровневый - то скорее всего самому. Но всё равно как-то медленно. В общем ты хотел что-то новенького - ты его получил Может заодно и полезное руководство по SDL напишешь
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
26.10.2009, 22:34  [ТС] #221
Да,вот интересно,под виндой работает намного быстрее,причём только в полноэкранном режиме,хотя и не дотягивает до натурального QBASIC-а.
Возможно,тут уже ничего не сделаешь,это уже библиотека так работает видимо,но всё же со временем надо будет попытаться ускорить хоть чуть-чуть.
Небольшое напутствие,если делать линию через цикл от края до края,то почему-то нельзя указывать размер границы,видимо происходит выход запределы экрана и программа падает(скорее всего это в самой SDL)
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
26.10.2009, 23:29 #222
Со скоростью сделать можно, надо только разобраться. На SDL'е написан FreeCraft - по сути переделка 2-го warcraft'а под линух. Всё там шустро бегало. Надо только разобраться, как эта бодяга работает
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
28.10.2009, 06:55  [ТС] #223
Попробовал улучшить немного со скоростью,так,по мелочи поменял,но вроде эффект есть.Вот можешь проверить таким вот тестом.Алгоритм аппроксимации(так вроде?) линии содрал прямо с вики,там используется битовая арифметика,я пока не очень понимаю,зачем там сдвиги на 12 позиций и прочее,надеюсь потом пойму.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
   SCREEN 12
   FOR i=5 TO 639 STEP 20
      FOR j=1 TO 479
        PRESET (i,j),3
       NEXT j
   NEXT i 
   FOR i=5 TO 479 STEP 20
      FOR j=1 TO 639
        PRESET (j,i),3
     NEXT j
   NEXT i
   LET k=1
   FOR i=20 TO 420 STEP 10
      FOR j=20 TO 420 STEP 10
         LINE (i,j)-(j,i+k),14 
         LET k=k+1
      NEXT j
      LET k=0
   NEXT i
Evg
Эксперт CАвтор FAQ
17633 / 5857 / 377
Регистрация: 30.03.2009
Сообщений: 16,154
Записей в блоге: 26
28.10.2009, 09:56 #224
Ты заметил, что когда рисуешь по точкам через PRESET, то тормозит, а когда через LINE - то практически мгновенно. Т.е. проблему я вижу в концепции SDL. Насколько я понимаю, подобные библиотеки работают через некий виртуальный монитор. Т.е. все точки ты сначала наносишь в этот монитор (который попросту лежит в обычной памяти), и эти операции являются быстрыми. Затем ты этот монитор отображаешь в реальную картинку. Делается это путём ПОЛНОГО обновления виртуального монитора на реальную картинку. Этот процесс уже "медленный" (по сравнению с помещением точки в виртуальный монитор)

В случае, когда ты рисуешь по точкам, получается, что для происовки линии из 100 точек тебе нужно 100 раз обновить экран. Когда ты рисуешь линию, то сначала все 100 точек линии отображаются в виртуальный монитор, и затем один раз обновляются. Т.е. в теории нарисовать линию из 100 точек работает в 100 раз быстрее, чем рисовать 100 точек

Библиотека видно написана всё-таки для игрушек. Поскольку игрушки как правило отображают экран по тикам. Т.е. (к примеру) 60 раз в секунду рассчитывается картинка, при этом она сначала рисуется по точкам в виртуальный монитор (т.к. эти операции быстрые), а затем картинка отрисовывается на экран (медленная операция, но 60 раз в секунду успевает).

Для интерпретатора такое поведение неудобно, потому что у тебя нет точек привязки, по которым можно отображать картинку из виртуального монитора на реальный. В качестве эксперимента можешь ввести дополнительный оператор в бэйсике, который перенесёт виртуальный монитор на реальную картинку, а все точки ставить строго в виртуальном мониторе. Этот эксперимент нужен лишь для того, чтобы проверить догадку. Если она оправдается, то надо придумать механизм, как это работало бы нормально. Т.е. видимо всегда всё будет рисоваться в виртуальный монитор, при этом асинхронно по таймеру виртуальный монитор будет отображаться в картинку

Добавлено через 5 минут
Ещё надо какую-нить операцию для паузы (опять-таки можно врЕменную), чтобы картинка не удалялась. А то если вставить бесконечный цикл, то программу только по kill -9 смог убить. INPUT так и не понял, как правильно писать
#pragma
Временно недоступен
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
28.10.2009, 18:40  [ТС] #225
Насчёт обновления картинки ты прав на все 100.Прямо в точку.Подозрение пало как раз на функцию SDL_UpdateRect(x,y,w,h) и я прочитал в интернете как многие жаловались на медленную работу графики с этой функцией.

В качестве средства предлагалось добавить флаг SDL_DOUBLEBUF при выставлении режима видео,а также создавать поверхность не в системной памяти,а в видеопамяти.После чего просто использовать функцию SDL_Flip,которая делает замену между первым и вторым буфером,происходит это довольно быстро.Но всё же она ждёт вертикальной синхронизации,и в некоторых случаях SDL_UpdateRect может работать быстрее. Но самое правильное-это таймер.

В общем пока для пикселей используется SDL_UpdateRect и обновляет только один пиксель,который рисуется,а для линий тоже SDL_UpdateRect ,только обновляется только четырёхугольник,диагональю которого является рисуемая линия.

Но ты всё правильно сказал-нужен таймер,чтобы обновлял всю картинку с помощью SDL_Flip с постоянной частотой,например 30-35 кадров в секунду,и сделать это следует безусловно,иначе графика попиксельно(да и вообще)будет относительно тормознутой.Благо таймер в SDL существует как отдельная подсистема,и его можно просто подключить.
Насчёт паузы после рисования-в самом QBASIC-е после рисования картинки появляется надпись "Нажмите любую клавишу для продолжения",поэтому надо будет как-то писать текст внизу поверх картинки или что-то такое.

Добавлено через 19 минут
А ещё забыл сказать:дело ещё не только в этом - как оказалось,у меня почему-то режим с глубиной цвета 16бит(слабо представляю,что это вообще) жутко тормозит,а когда делаешь 32бит,то всё намного быстрее.Так вот я добавил флаг SDL_ANYFORMAT,так что теперь есть предпочтение на 16бит,но если в силу каких-либо причин этот режим не очень подходит,библиотека сама подберёт лучший режим.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.10.2009, 18:40
Привет! Вот еще темы с ответами:

Написать интерпретатор программного языка -помощь - C++
Здраствуйте! Ребят, кто хорошо разбирается в C++ помогите пожалуйста с реализацией данного задания или хотя бы подтолкните к решению,...

Интерпретатор/компилятор ассемблер-подобного языка - C++
Привет! Чую, что изобрёл велисипед, даже скорее велопарк, но всё же, поделюсь: Некоторое время назад начал изучать кресты, в целом...

Интерпретатор музыки стандарта BASIC PLAY на С++ - C++
У кого нибудь есть функция или класс, который сможет воспроизводить в С++ напрямую музыкальные строки, записанные в стандарте оператора...

Задание: разработать "Интерпретатор языка". С чего начать? - C++
Здравствуйте, вручили темку на курсовик, ну точнее как вручили, не успел взять то, что хотел - пришлось брать то, что осталось. Плоховато...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
28.10.2009, 18:40
Закрытая тема Создать тему
Опции темы

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