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

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

Восстановить пароль Регистрация
Другие темы раздела
C++ Меню и список http://www.cyberforum.ru/cpp-beginners/thread41194.html
Здравствуйте форумчане. Помоги пожалуйста в следующем вопросе: У меня есть 2связный список, написано меню. Но в моменте когда написано make a list и delete custom необходимо чтобы выводились: Введите элемент и номер. вот сам код: #ifndef __list_h #define __list_h #include <iostream>
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!!! Вот текст программы, которая выводит на экран набор треугольников и квадратов, которые произвольно двигаются и меняют размер только квадратов. Проблема в том, что необходимо исправить код, чтоб фигуры не исчезали за экран (т.е. 640х460) и были компактным набором, т.е. двигались неменяя своего положения относительно друг друга и стукаясь об стенку экрана меняли свое...
C++ Округление дробного числа до целого в большую сторону. http://www.cyberforum.ru/cpp-beginners/thread41139.html
Доброго дня. Я новичок в программирование на Visual C++. Проблема такая программа должна считать кол-во месяцев, если числа целые то программа шла дальше, если дробное то (например 3.33333) программа не округляет это число (в большую сторону) до 4. Перелопатил тонны литературы, но пропустил или не нашёл этого, большая просьба написать функцию которая могла бы это делать, или способ какой.
C++ Код из Delphi в C++ Нужно написать курсовую на C++. Сам я в программировании плохо шарю (не программист). Попросил у народу помощи, помогли. Но решение на Delphi: {$APPTYPE CONSOLE} type byteset=set of byte; var d:array of longint; procedure c; var a,b,i:longint; подробнее

Показать сообщение отдельно
Evg
Эксперт С++Автор FAQ
 Аватар для Evg
16935 / 5340 / 328
Регистрация: 30.03.2009
Сообщений: 14,352
Записей в блоге: 26
20.08.2009, 16:57     Пишем свой интерпретатор языка BASIC
Цитата Сообщение от #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 секунд
В печати промежуточного представления надо смотреть именнопорядок, в котором всё печатается. То, что номера печатаются не по порядку - это фича, связанная с механизмом создания меток для переходов вперёд
 
Текущее время: 12:32. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru