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

Пишем свой интерпретатор языка 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; ... подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
954 / 225 / 6
Регистрация: 12.04.2009
Сообщений: 921
04.08.2009, 03:45  [ТС]
Я уже заждался Надеюсь,отпуск прошёл нормально.
1) Ну во-первых,хочу сказать,что уже многое изменилось в программе,я понял некоторые из ошибок,некоторые ещё не исправил,но займусь и этим.Одна из них - это насчёт неявного приведения типов.Я успел немного проштудировать материал по C,и узнал,что приведение выполняется всегда к большему типу(в смысле диапазона значений),учавствующему в выражении.Может,я не понял то,что говорил ты,но я тогда сделал не правильно.То есть если в выражении участвуют два операнда,к примеру, и первый из них int,а второй double,то приводить нужно не к первому встречному,а к большему,чтобы избежать излишних переполнений.Это я взял себе на заметку,но пока ещё не исправил.Были ещё недочёты,и ещё кучу я заметил,но пока оставил в покое.Сделал единую типизацию для функций,переменных и констант.Имеется ввиду не со стороны парсера,а просто общее перечисление типов для всех,используемое уже в синтаксическом анализаторе:
C++
1
2
3
4
5
6
   enum Types {
       INT,         // Тип константы,переменной,
       FLOAT,    // или функции
       STRING,
       VOID
   };
2) Мне удалось добавить инструкцию IF ... ELSE,но на тот момент,когда я это делал,у меня были трудности с концом инструкции,и я добавил FI. Мне просто показалось,что так удобнее,и это просто служебное слово,означающее завершение IF.Разумеется,ненужный блок пропускается.
3) Также мне удалось добавить цикл WHILE с проверкой условия.
4) Сами проверки условия я ещё не доработал,и пока в выражении может быть только один оператор сравнения,то есть могут учавствовать только два выражения по обеим сторонам.Пока я оставил так,просто нужно сделать подобие обычных операций,с таким же спуском как и везде.
5) В настоящий момент я как раз делаю функции,это будет выглядеть примерно так:
PureBasic
1
2
3
4
5
6
7
8
9
FUNC someFuncName(int x,double y) 
BEGIN
  # function body ;
  # Само тело функции по задумке считывается 
  # в буфер,который является членом класса,
  # и после вызова функции на месте идёт подстановка
  # имён и значений параметров,после чего возвращается значение,если оно есть.
END;
#program body
Проблемы:
1)я всё ещё не разобрался с выделением динамической памяти,и как её освобождать.Пока тема сыровата.
2) Есть такая специфическая проблема: например если внутри инструкции IF сделать цикл WHILE,то если написать
C++
1
2
IF (выражение)
{WHILE ...
,то при возврате в исходную позицию цикла программа (парсер) попадает как раз на символ '\0',и при этом возникает ошибка,сути которой я пока не понял,поэтому пока есть ограничение на такую запись,т.е. не следует писать WHILE в одну строчку с чем-либо слитно,необходимо ставить пробел или перевод строки.
3) Логика внутри функций if и while довольно запутанная,что отношу к недостатку,вообще код мне кажется довольно "грязным".Сейчас делаю функцию объявлений для процедур,и сегодня не побрезговал конструкциями типа :
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
        // In this function i have used operator goto,but in very local places
        // (label is close to "goto" that pointing on that label).
        StmtKwFUNC_label1:;
 
        switch (parser_GetToken())
        {
            case TOKEN_TYPE_FLOAT:  function->SetFunc_Type (FLOAT);
            break;
 
            case TOKEN_TYPE_INT:    function->SetFunc_Type (INT);
            break;
 
            case TOKEN_TYPE_STRING: function->SetFunc_Type (STRING);
            break;
 
            case TOKEN_TYPE_VOID:   function->SetFunc_Type (VOID);
            break;
 
            case TOKEN_EOL: goto StmtKwFUNC_label1;// This is only local,
                                                                                  // in-function jump to
                                                                                  // skip EOL's
 
            default: error(UNEXPECTED_SYMBOL,"near "+ ::parser_CurTokenStr);
        }
В принципе,эквивалентно можно было организовать цикл,но просто мне было по душе сделать так,тем более я строго следовал порядку,чтобы не запутать программу.Метки очень близко находятся к вызывающим их goto.И хотя не рекомендуют использовать,я всё-таки попробовал,мне показалось это логичным.
Ну вот,вроде все новости пока.Код прилагаю,но с учётом,что функция syntax_parserStmtKwFUNC () должна быть закомментирована,так как ещё в процессе(синтаксические ошибки и пр.).
P.S. Только сейчас обнаружил,что ELSE перестала работать .Видимо,пока правил и менял,поломал ELSE ...ну ладно,разберёмся.Вот такой,к примеру можно сделать исходник:
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
25
26
27
#
# Это небольшая программа
# на языке,подражающем
# языку BASIC.
#
#
 
DIM int a,int b,int c;
 
LET a = 10;
LET b = 9;
 
IF (b>6)
{
    INPUT "Введите b: ",b;
    WHILE (b<a)
    {
        IF (b<a) 
        {
            PRINT a;
        }
        FI
        PRINT b," ";
        PRINT " ",a," ";
    }
}
FI
Ещё важно,я уже тут привык использовать тег BASIC,но он меняет названия типов int на INT,так что нужно исправить,если что.А,ещё добавил простенькую поддержку параметра командной строки.
0
Вложения
Тип файла: rar Interpreter.rar (14.3 Кб, 129 просмотров)
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.