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

C++

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

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

03.03.2015, 01:54. Просмотров 564. Ответов 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++
вопшем есть файл с текстом..... в етом файле есть какие даные(мусор)...и есть дни: Понедельник,Вторник,среда......с етого файла нада...

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

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

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

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

Парсер - C++ Builder
Для небольшой текстовой игрушки в жанре RPG нужен способ считывания данных из текстовых файлов. Итак, что мне нужно: Из любого места...

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

Добавлено через 3 часа 29 минут
Вы с nocl1p случайно не одноклассники? Он такую же тему поднял.
progger2014
1 / 1 / 0
Регистрация: 24.11.2014
Сообщений: 30
04.03.2015, 23:16  [ТС] #4
Я не школьник даже!
Вам байда, а мне очень нужно!
gazlan
3131 / 1906 / 285
Регистрация: 27.08.2010
Сообщений: 5,132
Записей в блоге: 1
05.03.2015, 03:25 #5
По описанию, вам нужен не парсер, а интерпретатор. Вот и ищите (всякие бэйсики итп).
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 2
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

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

Расчет математических выражений - C++ Builder
Выражение вводить в Edit и при нажатии на кнопку считать его. Само виражение типу: 2 + (5-9+8+3) - 2*(3-(9+4)) + 10*sin(60) ...

Парсер HTLM - C++ Builder
Можно ли спарсить страницу что одни данные пошли в ComboBox (Имя пользователя) а ссылка (на пользователя) Была по клику? Добавлено...

Некий парсер - C++ Builder
Допустим есть строка: 1 hour ago <span style="color: #72A326; text-shadow: 1px 1px 0px #4A7010; font-weight:...

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


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

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

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