Форум программистов, компьютерный форум 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
16843 / 5264 / 323
Регистрация: 30.03.2009
Сообщений: 14,159
Записей в блоге: 26
08.07.2009, 11:32     Пишем свой интерпретатор языка BASIC
На самом деле тебе нужно разработать две вещи:

1. Класс, описывающий константу произвольного типа. На каждую константу (возникшую в процессе интерпретации) создаётся новый экземпляр данного класса. Ну и в идеале удаляются ненужные экземпляры, но с оптимальным потреблением памяти я бы пока не стал заморачиваться. Потом это будет проще понять. Кстати, в проект рядом с исходниками положи текстовый файл, и записывай туда все идеи, которые отложены на "потом".

2. Некую таблицу, которая описывает пары "переменная-константа", где записаны текущие значения переменных

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

Что касается представления класса коснтант, то я бы сделал примерно вот так:

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
class MyConst
{
  private:
    bool is_float; // плавающая или целая
    union
    {
      long long ival; // здесь храним целое значение, если константа целая
      double fval; //  здесь храним плавающее значение, если константа плавающая
    } val;
 
  public:
    // Констркуторы MyConst(long long), MyConst(double), конструктор копирования.
    // При этом конструктор по умолчанию должен вызывать ошибку, ибо понятие
    // константы без значения смысла не имеет
    // Перегруженные операторы плюс, минус и т.д.
    // как конкретно разруливать ошибочные ситуации (деление на ноль, битовые
    // операции над плавающими числами и т.п.) - решать тебе, самый простой
    // метод - через исключение. Можно вместо операторов реализовывать функции
    // plus, minus и т.п. - в этом случае можно возвращать код ошибки, а не
    // работать через исключения. Это ты решай сам, как тебе удобнее и что
    // понятнее.
    //
    // Сложение, например, целого и плавающего, можно реализовать двояко:
    // - преобразование второго операнда к типу первого делать внутри
    //   перегруженных операторов (или функций plus, minus...)
    // - операции разрешить только над константами одного типа, а преобразоване
    //   типов делать в процессе синтаксического разбора
    // Первый вариант хорош своей простотой использования класса - во время
    // синтаксического разбора надо будет меньше делать телодвижений
    // (соответсвенно, интерпретатор будет работать более надёжно).
    // Второй вариант концептуально более правильный, тбо это правило (второй
    // операнд должен приводиться к типу первого) - это свойство языка, а не
    // свойство констант.
    // 
    // Если бы делал я, я бы пошёл по второму варианту, т.к. я делаю код на Си,
    // а работу с типами сделал бы в виде дополнительной прокладки между
    // синтаксическим анализатором и реализацией констант. С точки зрения
    // концепции Си++ это, видимо, означает создание класс-наследника
    // и перегрузку операторов или что-то ещё, в итоге получится тот случай,
    // когда объектный код усложнит проблему, чем её упростит. Да и поскольку
    // ты пока только учишься, я бы тебе рекомендовал первый вариант
    //
    // Соотвественно, в случае выбора первого варианта, появляется дополнительный
    // метод для преобразования типа константы. Теоретически он должен быть
    // private, поскольку это внутреннее действо, но практически может понадобиться
    // использовать его снаружи
    //
    // Отладочный код печати константы (печатает тип и значение, возможно что-то ещё,
    // что появится в процессе работы
    // Пользовательский код печати константы (грубо говоря, его будешь дёргать
    // в процессе работы оператора PRINT)
}
В итоге сейчас у тебя есть независимый модуль parser, который режет входной текст на токены. Теперь у тебя появится независимый модуль работы с константами (который так же независимо от всего можно отлаживать). Потом появится модуль таблицы переменных, который зависит только от модуля констант (и опять-таки его можно будет отлаживать независимо от парсера и синтаксического анализатора). В итоге программа должна быть как конструктор: состоять из отдельных кубиков, внутреннюю реализацию кубиков можно отлаживать независимо друг от друга, а взаимодействовать между собой кубики должны посредством простых интерфейсов

Надеюсь, что смысл донеёс

Добавлено через 1 минуту 3 секунды
Если непотяна какая-то часть именно в плане технической реализации - лучше спрашивай сейчас

Добавлено через 7 минут 13 секунд
Кстати, а на чём ты пишешь? Просто все твои примеры с ходу идут у меня на gcc. При этом тесты исходников явно записаны под виндами (там перевод строки не такой, как в линухе). Т.е. у тебя какая-то gcc-образная среда из разряда Dev-C++, mingw или всё-таки в стандартных билдерах ухитряешься так аккуратно написать?

Добавлено через 9 минут 6 секунд
Да, вот ещё. В MyConst надо сдеать конструкторы, которые строят константу по её строковому представлению. Т.е. синтаксический анализатор имеет токен, содержащий константу, он просто дёргает соотвествующий конструктор из MyConst и не заморачивается там, чтобы самому выгребать значение из строкового представления. Для полноты картины в этой части должны быть два конструктора: создание целого значения по строковому представлению, создание плавающего значения по строковму представлению. Для полноты картины теоретически можно добавить просто "создание значения по строковму представлению", а тип будет разбираться внутри, но это означает, что фактически туда засовывается небольшой кусочек парсера, что не есть хорошо. Но в какойто другой программе (в которую ты, к примеру, в будущем затащишь свой модуль констант), это может пригодиться

Добавлено через 1 час 40 минут 24 секунды
Кстати, если исходить из простоты, то в случае деления на 0 и прочих ошибок можно сразу вызывать функцию, выдающую пользовательскую ошибку и завершать работу. В этом случае модуль констант будет не абсолютно независимым, а у него будет зависимость от модуля ошибок, что не страшно
 
Текущее время: 22:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru