Форум программистов, компьютерный форум 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
17.10.2009, 16:07     Пишем свой интерпретатор языка BASIC
А у тебя есть какая-нибудь возможность распечатать промежуточное представление по типу того, как делалось в моём примере. ЧТобы глазами "увидеть", как оно устроено

Добавлено через 13 минут
  • Итвой и мой интерпретаторы фатально ломаются на "LET A=1/0"
  • Тоже самое наверное будет, если в тангенс подать значение, эквивалентное 90 градусам (в этой точке тангенс не определён), или в арксинус значение большее единицы по модулю и т.п.
  • Такое ощущение, что арктангенс неправильно считается. Арктангенс от маленьких углов должен быть ббольшим, а у тебя этого не наблюдается
  • Для порядку надо завести предопределённую переменную PI (без неё работа с синусами и косинусами лишена смысла)

Добавлено через 17 минут
А теперь то, к чему я клонил, когда говорил про функции

1. Выносим функцию expr_CalcProcedure в отдельный модуль (который назвать function.cpp или ещё как, потому как к выражению он уже не очень относится). В результате чего имеем следующее: при добавлении новой функции мы делаем исправления только "вверху" (в разборе синтаксиса) и "внизу" (в процессе вычисления этого call'а), а вся серёдка (промежуточное представление, интерпретация) не меняются.
2. Поддерживаем возможность работы, когда у функции несколько входных переменных
3. А теперь самое интересное. Заводим в function.cpp некую внутреннюю функцию "__print". "Внутреннюю" в том смысле, что пользователь напрямую её вызвать не может. Далее в процессе разбора синтаксиса вместо оператора SK_PRINT строим некий фиктивный оператор CALL (который по сути то же самое, что ты сейчас с делал в выражении) и будем строить операцию вызова процедуры "__print" и формировать список параметров к ней. Такое поведение даёт тебе тот же самый бонус, что и в пункте 1: по сути поведение PRINT'а у тебя настраивается только "сверху" и "снизу", а вся "серёдка" остаётся без изменений.

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

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

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

Хз насколько понятно пояснил, но на мой взгляд пойдя по такому пути можно сделать интерпретатор, в который очень легко добавляется новая функциональность. Тезнически может быть проще будет сначала реализовать несколько графических операторов (POINT, LINE, CIRCLE), а потом будет больше ясности на предмет того, как техничеси организовывать такую схему
 
Текущее время: 22:03. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru