Токенизация строк C#

Я пишу математическое приложение C#, в котором пользователь может определять функции предопределенным образом, например

COS({x}+3*(2+SQRT({x})))

Для оценки я использую алгоритм маневровой станции. У меня есть функция для токенизации строки выше, которая производит следующий ввод в списке:

ФУНКЦИЯ,ОТКРЫТЫЕ_СКОБКИ,ПЕРЕМЕННАЯ,ОПЕРАТОР,ЧИСЛО,ОПЕРАТОР,ОТКРЫТЫЕ_СКОБКИ,НОМЕР,ОПЕРАТОР,ФУНКЦИЯ,ОТКРЫТЫЕ_СКОБКИ,ПЕРЕМНАЯ,ЗАКРЫТЫЕ_СКОБКИ,ЗАКРЫТЫЕ_СКОБКИ,ЗАКРЫТЫЕ_СКОБКИ.

Это работает хорошо, но у меня проблемы с отрицательными числами, я не знаю, как обращаться с оператором вычитания, когда вычитание и когда отрицательный знак?

Функция выполняет итерацию по строке и ищет в ней шаблоны (например, если символ i. равен '{', тогда (i+1). символ должен быть строчной буквой, а (i+2). символ должен быть '} ', сохраняет переменную и переходит к символу (i+3)., иначе выдает синтаксическую ошибку.) Теперь эта функция принимает отрицательные числа и вместо вычитания принимает умножение на отрицательное число и использует '+', так что вместо этого из 3-1 я должен использовать 3+(-1)*1. Это не элегантное решение, у вас есть идеи, как его решить?


person Szántó Ádám    schedule 26.03.2013    source источник


Ответы (2)


если вы видите - в начале строки, сразу после открывающей скобки или после другого символа, то последующее число отрицательное

person Lefteris E    schedule 26.03.2013

Я написал небольшую библиотеку с открытым исходным кодом, которая может анализировать выражения в стиле C#.

https://github.com/davideicardi/DynamicExpresso

Вы можете писать собственные функции (например, COS, SQRT), вводить переменные или параметры (x). Или вы можете использовать встроенные функции C# (Math.Sqrt,...).

Демонстрационную версию можно найти по адресу: http://dynamic-expresso.azurewebsites.net/.

Возможно, эта библиотека ускорит вашу работу.

person Davide Icardi    schedule 26.03.2013