2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 C++: вычислить строковое выражение
Сообщение07.09.2017, 19:42 
Аватара пользователя
В MATLAB реализовано вычисление строк вида 1+2*3. При помощи регулярных выражений строка преобразуется в строку вида u(1)+u(2)*u(3) и передаётся в функцию eval, в массиве u хранятся числа. Если точнее, то вероятности событий, оператор + переопределен.
Как подобное реализовать в C++?
В процессе выполнения кода получаем массив u, как его свернуть в одно число по заранее известной формуле? У Страуструпа в Programming: Principles and Practice Using C++ разбирается калькулятор (Recursive descent parser), вроде как в нем все это и нужно делать: вычислять строку с заранее введенной переменной u.
Возможно есть более простое решение?

 
 
 
 Re: C++: вычислить строковое выражение
Сообщение07.09.2017, 20:00 
Написать синтаксический анализатор или воспользоваться уже готовым. Посмотрите, например, описания программ flex и GNU bison.

 
 
 
 Re: C++: вычислить строковое выражение
Сообщение07.09.2017, 20:03 
Аватара пользователя
Я бы сказал, это ближе к Boost::Proto, чем к flex/bison, но это уж что кому ближе.

 
 
 
 Re: C++: вычислить строковое выражение
Сообщение07.09.2017, 20:08 
Если я правильно понял задачу, достаточно взять парсер арифметических выражений (легко гуглится) и в процессе вычисления вместо чисел подставлять значения элементов массива с соответствующим индексом. Парсить надо исходное выражение, до подстановки u.

 
 
 
 Re: C++: вычислить строковое выражение
Сообщение07.09.2017, 22:50 
Вместо связки flex+bison можно использовать более приятный в обращении ANTLR и его C++ target.

 
 
 
 Re: C++: вычислить строковое выражение
Сообщение07.09.2017, 23:46 
Также вместо связки flex + bison можно использовать flexc++ + bisonc++ - практически то же самое, но приятнее в использовании.

 
 
 [ Сообщений: 6 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group