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

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

Показать сообщение отдельно
Evg
Эксперт CАвтор FAQ
18030 / 6262 / 427
Регистрация: 30.03.2009
Сообщений: 17,206
Записей в блоге: 27
29.06.2009, 20:53
Цитата Сообщение от #pragma Посмотреть сообщение
В-общем как я понимаю в данном конкретном случае проблема сводится к тому,как правильно послать готовую строку (которую я уже приготовил для вычисления,например "a*b") обратно в поток ввода.То есть у меня получается что когда из функции get_token() возвращается значение FUNC,за этим следует вызов expr(true) с последующими вызовами get_token(),но в потоке для чтения нет строки,которую я приготовил и отослал функцией putback в строке 342: source.putback(::result_expr[j]); В итоге при прилагаемых входных данных программа печатает 'a',которая следует за именем функции и находится в списке параметров,а моя готовая строка ещё до этого куда-то девается..Вот я думаю может я неправильно это сделал(в смысле работал с потоком)?
Видишь ли, такой подход он неправильный. Лексический разбор в таких простых случаях должен идти без putback'ов. Т.е. разобрал имя функции, разобрал левую скобку, дальше с текущей позиции запускается разбор выражения для параметра. Именно идёт разбор, а не формируется строка. Далее по выходу из процедуры разбора выражения ты будешь иметь уже вычисленное значение параметра, адальше тебе останется разобрать правую скобку, после чего сделать вызов. При этом в интерпретируемых языках, содержащих процедуры, как правило строится сначало некое промежуточное представление, а затем работа идёт на нём (без входного потока). Я, собственно, потому и предлагал тебе пока забить на вызов функций, потому как надо сначала до конца добить простые вещи. Но я тебе не навязываю своё мнение, если есть желание сделать функцию - попробуй

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

Исходники погляжу дома. Но, вижу, уже обработка ошибок аккуратно выделена в отдельный модуль, т.е. процесс идёт и появляется понимание того, как надо делать аккуратную разбивку на отдельные независимые блоки

Цитата Сообщение от #pragma Посмотреть сообщение
А насчёт svn это в интернете репозиторий создается,навроде как в launchpad сделано?Бесспорно,это удобнее...есть ещё cvs какой-то.
Можно и на локальной машине Я поначалу делал просто на файловой системе и доступ через файловую систему. А потом переделал на сетевой вариант. В итоге у меня svn сервер запущен под виндой, под vmwar'ой запущен линух и через виртуальную сеть из-под линуха работаю с svn-репозиторием, который физически находится под виндой

Добавлено через 10 часов 14 минут 45 секунд
Глубоко не смотрел, но поглядел поверхностно исходники. По теущему положению тебе действительно будет сложно дальше развивать интерпретатор. Со своей стороны могу тебе предожить для начала навести порядок. Затем чётко разбить на компоненты (потому как у тебя пока мешанина): аккуратно сделать механизм обработки ошибок, грамматический анализатор, лексический анализатор, разбиение на операторы (statement), коих у тебя пока работающих только два (оператор присваивания и оператор печати), таблицу переменных. Затем добавлять поддержку новых конструкций.

Ну либо у тебя есть какие-то свои пожелания. Я вижу ты никак не угомонишься с процедурными вызовами. Моё личное мнение - по текущему состоянию их надо выкидывать, а потом попробовать добавить по-человечески. Либо добавить сейчас в том же виде, в котором ты пытаешься, с целью понять, что в таком бардаке поддерживать это будет слишком проблематично.

Если есть какие-то идеи, вопросы и т.п. - не стесняйся, спрашивай. Пока я добрый, помогу

Добавлено через 12 минут 53 секунды
Для такого примера не ловит использование неинициализированной переменной b во 2-й строке
Код
a=10.6
b=2+b
#a
#b
Добавлено через 2 минуты 27 секунд
Здесь в 3-й строке должна либо выдаваться ошибка, либо печататься все значения

Код
a=10.6
b=2
#a b b b
#b
Добавлено через 1 минуту 54 секунды
Аналогично долдна быть синтаксическая ошибка (ну или любое другое сообщение об ошибке)
Код
b=2 2
Или, судя по последним двум примерам, перенос строки игнорируется и здесь фактически два оператора "b=2" и пустышка "2"?

Добавлено через 3 минуты 58 секунд
Неправильно учитывается приоритет операций. Следующий пример демонстрирует это. При вычислении b поставлены скобки (которые по большому счёту не нужны, только для показывания в каком порядке должны идти вычисления). Оба выражения должны дать один и тот же результат

Код
a=2+4|5*6
b=(2+4)|(5*6)
#a
#b
Код
32
30
1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru