Форум программистов, компьютерный форум 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; подробнее

Показать сообщение отдельно
#pragma
Временно недоступен
 Аватар для #pragma
952 / 223 / 6
Регистрация: 12.04.2009
Сообщений: 921
04.08.2009, 03:45  [ТС]     Пишем свой интерпретатор языка BASIC
Я уже заждался Надеюсь,отпуск прошёл нормально.
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,так что нужно исправить,если что.А,ещё добавил простенькую поддержку параметра командной строки.
Вложения
Тип файла: rar Interpreter.rar (14.3 Кб, 129 просмотров)
 
Текущее время: 02:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru