Преобразование инфикса C ++ в префикс для логических условий - PullRequest
10 голосов
/ 01 апреля 2010

Я хочу оценить одно выражение в C ++. Чтобы оценить его, я хочу, чтобы выражение было преобразовано в префиксный формат.

Вот пример

 wstring expression = "Feature1 And Feature2";

Вот возможные пути.

 expression = "Feature1 And (Feature2 Or Feature3)";

 expression = "Not Feature1 Or Feature3";

Здесь И , Или , Не являются зарезервированными словами и скобками (" (", ) ) используются для объема

Не имеет более высокий приоритет

И устанавливается следующим приоритетом Не

или имеет следующий приоритет перед И

БЕЛЫЙ ПРОБЕЛ используется для разделителя. Выражение имеет нет других элементов, таких как TAB , NEWLINE

I не нужно арифметика выражений. Я могу выполнить оценку, но может ли кто-нибудь помочь мне преобразовать строки в префиксную нотацию?

Ответы [ 3 ]

3 голосов
/ 01 апреля 2010

Вам нужно будет построить грамматику заранее. Так зачем же все разбирать вручную. Вместо этого используйте библиотеку компоновщика синтаксического анализатора, такую ​​как Boost-Spirit . Или lex / yacc или flex / bison.

Затем используйте AST , сгенерированный компоновщиком синтаксического анализатора, для вывода данных любым удобным для вас способом. Например, инфикс к префиксу или постфиксу и т. Д.

1 голос
/ 01 апреля 2010

Полагаю, вы намереваетесь оценить состояние. следовательно, вам не нужен полноценный парсер.

Прежде всего вам не нужно работать со строками здесь. 1. Преобразовать «Элемент 1», чтобы сказать Id (целое число, которое представляет функцию)

Итак, утверждение "Feature1 And (Feature2 Or Feature3)"; сказать (1 & (2 | 3) С этого момента ... вы можете использовать стандартный Infix для преобразования префиксов и оценки префиксной нотации.

Вот алгоритм преобразования инфикса в префикс http://www.c4swimmers.esmartguy.com/in2pre.htm http://www.programmersheaven.com/2/Art_Expressions_p1

0 голосов
/ 01 апреля 2010

Используйте генератор парсера, такой как пара Lex / Yacc.

...