Форум программистов, компьютерный форум 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
Эксперт CАвтор FAQ
17389 / 5627 / 351
Регистрация: 30.03.2009
Сообщений: 15,410
Записей в блоге: 26
05.08.2009, 09:40     Пишем свой интерпретатор языка BASIC
Цитата Сообщение от #pragma Посмотреть сообщение
Да,это я заметил и мне это тоже очень не нравится.Вывод-интерпретатор должен только проверять синтаксис,но не выполнять саму программу,а переносить её в некое промежуточное состояние,уже после которого программа выполняется.
Да ты уже и сам всё знаешь

Цитата Сообщение от #pragma Посмотреть сообщение
То есть получается,что весь подход изначально был неверный?
Подход был верный, но была неверная реализация. Я уже писал о том, что намеренно тебя веду по тому пути, что потом будем переделывать. Причин для этого несколько (о некоторых я уже писал):
  • Для написания некоторой начальной стадии компилятора тебе уже приходится одновременно решать несколько проблем: изучать технику работы Си++, учиться строить многомодульное приложение, одновременно реализовывать новые для себя вещи - значение, переменная, лексический анализатор, синтаксический парсер. Дополнительный большой геморрой в виде промежуточного представления сльно бы усложнил задачу
  • Изначально у тебя не было понимания того, как ведётся синтаксический разбор. Я мог бы тебе сразу предложить работать с промежуточным представлением, но это было бы как по книжке - тупо делаешь так, как написано и не задумываешься о том, а почему же надо по другому. Сейчас ты это ощутил на своей шкуре, а потому у тебя уже есть собственное понимание того, когда интерпретатор может работать непосредственно, а когда нужно промежуточное представление
  • Хотелось показать живой пример, когда программа должна менять структуру, а общая (или бОльшая часть) схема работы не меняется. Сейчас это именно тот случай. Синтаксический разбор на самом деле остаётся точно таким же по схеме, просто меняется начинка

Цитата Сообщение от #pragma Посмотреть сообщение
Интерпретатор,получается,должен только проверять синтаксис и выдавать ошибки,параллельно с написанием промежуточного кода,и после того,как пройдётся по всему коду,передавать управление следующему блоку?
Интерпретатор на первом проходе делает полный синтаксический разбор и строит отображение исходника в некое промежуточное представление, которое затем в удобном виде интерпретируется (а в далёком будущем ещё и возможна пошаговая отладка)

Цитата Сообщение от #pragma Посмотреть сообщение
Со скриптами придётся почитать маны,я умею делать простейшие скрипты для загрузки,но что-то более сложное пока не пробовал.
Прежде чем заняться переделками интерпретатора, предлагаю наладить систему тестирования. По крайней мере будет какой-то механизм, позволяющий быстро оценитьнадёжность работы интерпретатора. Ну и заодно появится небольшая тестовая база. В процессе написания тестов ты уже будешь понимать, как эти тесты будут парситься, а потому параллельно в голове начнёт устаканиваться дальнейшая структура.

Чтобы было понятно, вкратце схематично опишу, что из себя приблизительно представляет промежуточное представление

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
// Промежуточное представление statement'а
struct Statement
{
  // Всё провязано в список для последовательного обхода и интерпретации
  Statement *next;
 
  // Тип statement'а: LET, PRINT и т.п.
  StatementKind_t kind;
 
  union
  {
    // Описание представления оператора LET
    struct
    {
      Variable *var;  // Левая часть
      Expression *expr;  // Правая часть
    } let;
 
    // Описание представления оператора IF
    struct
    {
      Expression *cond_expr;  // Условие (условное выражение)
      Statement *true_list; // Список операторов по ветке THEN
      Statement *false_list; // Список операторов по ветке ELSE
    } if;
 
    ...
  }
}
Если примерно понял, что это. Сейчас я всё представил так, что выглядеть это будет по сути в виде некоторого дерева. Линейный участок - это линейный список операторов. Для всех IF, WHILE, FOR появляется ответвеление, куда лепится новый список операторов, который фактически находится внутри фигурных скобок. Для каждой процедуры будем иметь свой список операторов

Опять-таки это представление не совсем хорошее для интерпретатора. Оно больше подходить для случаев, когда строится какой-то промежуточный код: для компилятора или для интерпретатора с дальнейшим построением промежуточного кода. Реально язык у нас простой, а потому реально можно будет обойтись без дерева и сразу строить некое подобие промежуточного кода. Но я для начала предлагаю вариант именно через промежуточное дерево, потому как при таком подходе проще понять, что же это такое, промежуточное представление (да и в любом случае практический опыт, который пригодится в дальнейшем). Да и написал я его схематично для того, чтобы у тебя было хоть какое-то понимание того, что будет дальше. Пока будешь разбираться с тестированием, эти знания в голове утрясутся. Почему так работает мозг - хз, но это действительно так

Работу скриптов так же лучше обсудить в отдельной теме
 
Текущее время: 16:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru