Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++
Войти
Регистрация
Восстановить пароль
 
progger2014
1 / 1 / 1
Регистрация: 24.11.2014
Сообщений: 30
#1

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

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

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

SAX json парсер
Вечер добрый. Есть задача реализовать SAX-парсер JSON-a (парсинг не во...

Различия использования регулярных выражений и генераторов парсеров в GCC и MSVC
Я слышал что G++ и MSVC используют lex и bison для построения дерева токенов и...

Парсер математических выражений с нуля
Добрый день! Дали задание в универе: "Составить программу численного...

Калькулятор со скобками - парсер математических выражений
Подскажите пожалуйста что делать! Я создаю инженерный калькулятор на С++ в...

Парсер
Для небольшой текстовой игрушки в жанре RPG нужен способ считывания данных из...

5
progger2014
1 / 1 / 1
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 14:13  [ТС] #2
Никто ничего не скажет?
0
rao
857 / 412 / 158
Регистрация: 02.04.2014
Сообщений: 1,201
04.03.2015, 21:58 #3
Готового нету, а кодить такую бесполезную байду в лом. Ты начни, если чо не получится, тогда поможем.

Добавлено через 3 часа 29 минут
Вы с nocl1p случайно не одноклассники? Он такую же тему поднял.
0
progger2014
1 / 1 / 1
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 23:16  [ТС] #4
Я не школьник даже!
Вам байда, а мне очень нужно!
0
gazlan
3139 / 1915 / 311
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
05.03.2015, 03:25 #5
По описанию, вам нужен не парсер, а интерпретатор. Вот и ищите (всякие бэйсики итп).
0
NEbO
591 / 458 / 73
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 3
05.03.2015, 17:53 #6
Лучший ответ Сообщение было отмечено progger2014 как решение

Решение

из самых простых, есть два способа: 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/Comparison_of_parser_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

1
05.03.2015, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.03.2015, 17:53
Привет! Вот еще темы с решениями:

Расчет математических выражений
Выражение вводить в Edit и при нажатии на кнопку считать его. Само виражение...

Некий парсер
Допустим есть строка: 1 hour ago <span style="color:...

Парсер HTLM
Можно ли спарсить страницу что одни данные пошли в ComboBox (Имя пользователя)...

Написать парсер математических выражений с функцией упрощения этих выражений
Люди, здравствуйте. Есть такая задача: написать упроститель выражений. На...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru