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

C++

Войти
Регистрация
Восстановить пароль
 
progger2014
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30
#1

Парсер выражений - C++

03.03.2015, 01:54. Просмотров 540. Ответов 5
Метки нет (Все метки)

Здравствуйте, помогите пожалуйста написать простой парсер, для дальнейшей самостоятельной доработки под нужды.
Ссылки на гугл и прочее не интересует, перерыл уже.
мне нужно консольное приложение, что я мог вбить в консоль следующее
например:
пишу a = 5
нажал enter
появляется a = 5
пишу b = 7
нажал enter
появляется b = 7
пишу с = a + b
нажал enter
появляется c = 5 + 7 = 12
Спасибо всем кто подкинет кодику!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2015, 01:54     Парсер выражений
Посмотрите здесь:

C++ Парсер на С
C++ Парсер
Калькулятор со скобками - парсер математических выражений C++ Builder
C++ парсер
Парсер математических выражений с нуля C++ Builder
Парсер математических выражений - можно ли оптимизировать и улучшить код C++
C++ Парсер математических выражений
C++ Парсер
C++ Парсер арифметических выражений
C++ Парсер для математических выражений
Парсер математических выражений на С/С++ C++
Реализовать парсер арифметических выражений (файловый ввод/вывод, задача №80 acmp) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
progger2014
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 14:13  [ТС]     Парсер выражений #2
Никто ничего не скажет?
rao
 Аватар для rao
458 / 321 / 93
Регистрация: 02.04.2014
Сообщений: 943
04.03.2015, 21:58     Парсер выражений #3
Готового нету, а кодить такую бесполезную байду в лом. Ты начни, если чо не получится, тогда поможем.

Добавлено через 3 часа 29 минут
Вы с nocl1p случайно не одноклассники? Он такую же тему поднял.
progger2014
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 23:16  [ТС]     Парсер выражений #4
Я не школьник даже!
Вам байда, а мне очень нужно!
gazlan
Нарушитель
3129 / 1904 / 285
Регистрация: 27.08.2010
Сообщений: 5,133
Записей в блоге: 1
05.03.2015, 03:25     Парсер выражений #5
По описанию, вам нужен не парсер, а интерпретатор. Вот и ищите (всякие бэйсики итп).
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 1
05.03.2015, 17:53     Парсер выражений #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
из самых простых, есть два способа: LL-парсер и LR-парсер. Первый пишется проще, если все нужно делать с нуля, без использования сторонних инструментов, но я этим не занимался, поэтому опишу второй.
1. разделите строку на токены: например, строку
Код
'myvar = 3 + 4'
преобразуйте в список
Код
{"myvar", TK_VARIABLE},
{"=", TK_EQUAL},
{"3", TK_NUMBER},
{"+", TK_PLUS},
{"4", TK_NUMBER}
Это можно сделать как с помощью всяких flex-ов, ragel-ей, lex-ов и re2c-ов, так и вручную, тупо посимвольно проходить по строке и искать границы этих самых ваших токенов. попутно определять их тип: число (начинается с цифры), переменная (начинается с буквы), всякие разные операторы (плюс, минус, умножить, разделить, равно, скобка открывается, скобка закрывается, итд).
2. Выбрать любой генератор парсеров КС-грамматик: http://en.wikipedia.org/wiki/Compari...ser_generators. Смотрите по колонке "Output Languages" (вам нужен c++, но и с вам тоже подойдет) алгоритма lalr будет более чем достаточно, а там почти все такие. Мне лично нравятся yacc, lemon, kmyacc, bison. Для всех них (ну, может, кроме kmyacc, но у него почти полная совместимость с yacc) первым делом в документации рассматривается пример "как создать калькулятор".
С помощью выбранного генератора, на основе грамматики examples/calc рисуете свою грамматику, куда добавляете присвоение и переменные.
3. Для запоминания переменных берете ассоциативный контейнер аля hash_map (которого нет, правда, в стандартной библиотеке, зато он реализован и в gcc, и в msvc в качестве экстеншена) или std::unordered_map. Впрочем, std::map вам, скорее всего, тоже сойдет, но производительность будет похуже.
Этот контейнер будет хранить значения переменных по их названию (то есть ключом будет название переменной). Поэтому пихаете в правила редукции для знака 'равно' присвоение этого значения соответствующему ключу. Ну а во всех остальных случаях, при редукции, когда в правиле есть терминал "переменная", то считываете ее из этого же самого контейнера. вообщем-то и все.

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

Не по теме:

а вот тут прямо готовое решение вашей задачи: http://epaperpress.com/lexandyacc/calc.html , даже чуть больше. А вот еще одно: https://www.l2f.inesc-id.pt/~david/w...with_Variables

Yandex
Объявления
05.03.2015, 17:53     Парсер выражений
Ответ Создать тему
Опции темы

Текущее время: 03:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru