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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Топологическая сортировка http://www.cyberforum.ru/cpp/thread1386242.html
Есть алгоритм, реализация с помощью обхода в глубину: http://rain.ifmo.ru/cat/view.php/vis/graph-general/topological-sort-2007/algorithm boolean topological_sort(){ boolean Cycle; for(int i = 1;i <= N;i ++){ Cycle = dfs(i); if(Cycle)return false; } for(int i = 1;i <= n;i ++){ Numbers = i;
C++ Урок геометрии, масштабирование изображений Задача: Есть картинка 100x100 px на которой нарисован смайлик необходимо наложить этот смайлик на другие фотографии, размер которых заранее неизвестен. (Я в курсе как программно наложить одну картинку на другую) Проблема собственно в том что, если фотография слишком маленькая, то мой смайлик выглядит огромным, а если фотография слишком большая например в 4К - разрешении, то мой смайлик... http://www.cyberforum.ru/cpp/thread1385976.html
C++ Самопроизвольное завершение потоков
Здравствуйте, делаю многопоточное приложение, пробовал использовать бустовские потоки и std потоки, но в обоих происходит завершение потоков, причем их работа до конца не доходит (стоит брэйкпоинт). С чем это связано и как с этим бороться? И сразу же еще вопрос, запускаю 10 бустовских потоков, но почему-то их становится 20, с std такой проблемы нет for (int i = 0; i < threads; i++) {...
Paint с нуля C++
Помогите сделать самое простейшее приложение(чтобы можно было рисовать как в стандартном пеинте без всяких там вырезаний и копирований областей, тупо рисование) на Visual studio, я в этой проге не разбираюсь совсем..
C++ Разработка игры жанра платформер http://www.cyberforum.ru/cpp/thread1384336.html
Привет всем. В общем, дело такое, на курсач надо сделать игру на объектно-ориентированном языке. Выбрал С++. Далее решил чтоб не заморачиваться в жанре игры выбрал платформер. И вот собственно вопрос: нужна прога, в которой будет удобно и уровень сформировать, и прописать механику объектов, а потом сохранить и исходники и скомпилированный файл. P.S. Смотрел на GameMaker, в принципе подходит, но...
C++ на координаты XOY даны числа неравные друг другу x y подробнее

Показать сообщение отдельно
NEbO
587 / 455 / 49
Регистрация: 22.01.2009
Сообщений: 1,180
Записей в блоге: 1
Завершенные тесты: 2
05.03.2015, 17:53
из самых простых, есть два способа: 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

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