Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30

Парсер выражений

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

Студворк — интернет-сервис помощи студентам
Здравствуйте, помогите пожалуйста написать простой парсер, для дальнейшей самостоятельной доработки под нужды.
Ссылки на гугл и прочее не интересует, перерыл уже.
мне нужно консольное приложение, что я мог вбить в консоль следующее
например:
пишу a = 5
нажал enter
появляется a = 5
пишу b = 7
нажал enter
появляется b = 7
пишу с = a + b
нажал enter
появляется c = 5 + 7 = 12
Спасибо всем кто подкинет кодику!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.03.2015, 01:54
Ответы с готовыми решениями:

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

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

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

5
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 14:13  [ТС]
Никто ничего не скажет?
0
 Аватар для rao
903 / 424 / 159
Регистрация: 02.04.2014
Сообщений: 1,206
04.03.2015, 21:58
Готового нету, а кодить такую бесполезную байду в лом. Ты начни, если чо не получится, тогда поможем.

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

Решение

из самых простых, есть два способа: LL-парсер и LR-парсер. Первый пишется проще, если все нужно делать с нуля, без использования сторонних инструментов, но я этим не занимался, поэтому опишу второй.
1. разделите строку на токены: например, строку
Code
1
'myvar = 3 + 4'
преобразуйте в список
Code
1
2
3
4
5
{"myvar", TK_VARIABLE},
{"=", TK_EQUAL},
{"3", TK_NUMBER},
{"+", TK_PLUS},
{"4", TK_NUMBER}
Это можно сделать как с помощью всяких flex-ов, ragel-ей, lex-ов и re2c-ов, так и вручную, тупо посимвольно проходить по строке и искать границы этих самых ваших токенов. попутно определять их тип: число (начинается с цифры), переменная (начинается с буквы), всякие разные операторы (плюс, минус, умножить, разделить, равно, скобка открывается, скобка закрывается, итд).
2. Выбрать любой генератор парсеров КС-грамматик: http://en.wikipedia.org/wiki/C... 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/~d... _Variables

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.03.2015, 17:53
Помогаю со студенческими работами здесь

Парсер математических выражений
знаю изъезженная тема, надо написать парсер мат выражений с поддержкой скобок и некоторых несложных функций типа: sin, cos, tg, ctg, ln......

Парсер математических выражений на С/С++
Добрый вечер, можете написать или помочь написать парсер математических выражений для программы вычисляющей интеграл

Парсер арифметических выражений
Добрый вечер, пишу простенький парсер для разбора выражений, содержащих рациональные числа. Вот код: #include <iostream> ...

Парсер арифметических выражений
Пишу парсер мат. выражений. Столкнулся с проблемкой: как обозначить унарные операции + и - ? Есть мапа приоритетов: ...

Парсер для математических выражений
Здравствуйте уважаемые товарищи форумчане. Я пишу интерпретатор математических выражений и, собственно, для этого, сначала перевожу...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru