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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились:...
C++ Здравствуйте! Не могу поместить class в один файл с программой. file.hpp #include "Cat.hpp" // здесь классы "2)" Cat::Cat(int initialAge) { itsAge = initialAge; } Cat::~Cat() { http://www.cyberforum.ru/cpp-beginners/thread41186.html
Массивы строк C++
Привет всем! Задан массив строк. Как узнать который символ встечаетса найбольшое количество раз в етом массиве?
C++ вывод на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер
Please, help me!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) ...
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; ... подробнее

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18036 / 6268 / 428
Регистрация: 30.03.2009
Сообщений: 17,244
Записей в блоге: 28
20.08.2009, 16:57
Цитата Сообщение от #pragma Посмотреть сообщение
Я,конечно,растянул написание своей программы неимоверно долго,всё это можно было написать намного быстрее,я полагаю...
Интерпретатор - это всё-таки сложная программа. То, что ты растянул во времени - это не страшно. Объём большой, а в голове, не имея соотвествующего опыта, уложить всё сразу сложно. Главное - всё-таки дописать его до такого состояния, когда реально будет видно, что дальнейшее наращивание языка - это тупое добавление кода, а вся структура уже будет в устаканенном состоянии. Исходники выложу чуть позже (комментарии допишу)

Оговорю сразу несколько моментов, которые у меня пока не сделаны:
  • Нет нормальной поддержки условных выражений. Пока на их месте используются обычные арифметические, если там ненулевое значение, то считаем true, если нулевое false.
  • Метки и GOTO пока не делал
  • Ошибки, возникающие в момент интерпретации представления пока выдаются без привязки к исходнику
  • Список операторов сделал более похожим на Q-Basic: т.е. не с фигрными скобками, а через двоеточие
  • EOL считается концом оператора, т.е. у меня пока нельзя альтернативы THEN размазывать по нескольким строкам. Я пока не пытался строго поддержать синтаксис. В первую очередь хотелпоказать пример того, как работать с промежуточным представлением
  • PRINT пока кастрированный, в качестве параметра принимает только одно выражение

Если какие-то косяки найдёшь - говори. Если будет время - попробую впараллель с тобой писать. Так проще будет твои проблемы понимать.

Чтобы было перед глазами - кладу исходник и отладочную печатьпромежуточного представления (думаю, без комментариев будет понятно)

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
' Простая арифметика
LET A1 = 10 : LET A2 = 100
LET B1 = A1 + 5 * A2 - 50
PRINT B1
 
' Условное исполнение
' Пока сделано коряво. Как таковых операций сравнения просто нет, а потому
' на позиции условного выражения пока присутсвует фрифметическое выражение,
' а дпльше смотрим 0 (false) или не 0 (true)
IF B1 THEN LET C=1: LET D=2 ELSE LET C=10: LET D=20
PRINT C
PRINT D
 
' Повторяем предыдущий код, но с таким условием, чтобы исполнилось ELSE
IF B1-460 THEN LET C=1: LET D=2 ELSE LET C=10: LET D=20
PRINT C
PRINT D
 
' Считаем сумму чисел от 1 до 100
LET COUNT=0
LET SUM=0
WHILE COUNT-100 DO LET COUNT=COUNT+1: LET SUM=SUM+COUNT
PRINT COUNT
PRINT SUM
Код
s1. LET        A1 = i:10
s2. LET        A2 = i:100
s3. LET        B1 = ((A1 + (i:5 * A2)) - i:50)
s4. PRINT      B1
s8. CBRANCH    B1 -> t=s5 f=s6
s5. LABEL      #then
s9. LET        C = i:1
s10. LET       D = i:2
s11. BRANCH    -> s7
s6. LABEL      #else
s12. LET       C = i:10
s13. LET       D = i:20
s7. LABEL      #finish
s14. PRINT     C
s15. PRINT     D
s19. CBRANCH   (B1 - i:460) -> t=s16 f=s17
s16. LABEL     #then
s20. LET       C = i:1
s21. LET       D = i:2
s22. BRANCH    -> s18
s17. LABEL     #else
s23. LET       C = i:10
s24. LET       D = i:20
s18. LABEL     #finish
s25. PRINT     C
s26. PRINT     D
s27. LET       COUNT = i:0
s28. LET       SUM = i:0
s29. LABEL     #start
s32. CBRANCH   (COUNT - i:100) -> t=s30 f=s31
s30. LABEL     #loop
s33. LET       COUNT = (COUNT + i:1)
s34. LET       SUM = (SUM + COUNT)
s35. BRANCH    -> s29
s31. LABEL     #finish
s36. PRINT     COUNT
s37. PRINT     SUM
ну и результат исполнения

Код
460
1
2
10
20
100
5050
Добавлено через 15 минут 4 секунды
Вот исходники. interp.rar - в KOI-8, interp_w.rar - в WIN1251 (с виндовыми энтерами)

Трассировочные макросы:
lex.c - LEX_TRACE_TOKEN
statement.c - STMT_TRACE
interp.c - INTERP_TRACE

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

Добавлено через 1 минуту 25 секунд
В печати промежуточного представления надо смотреть именнопорядок, в котором всё печатается. То, что номера печатаются не по порядку - это фича, связанная с механизмом создания меток для переходов вперёд
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru