2010-04-01 3 views
10

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

Вот пример

wstring expression = "Feature1 And Feature2"; 

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

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

expression = "Not Feature1 Or Feature3"; 

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

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

И is s и др рядом приоритете Не

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

Пустое пространство используется для разделителей. Выражение не имеет не других элементов, таких как TAB, NEWLINE

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

+0

По соглашению TAB и NEWLINE являются типами WHITESPACE. Вы действительно имели в виду персонажа SPACE? Просьба уточнить ваш вопрос с этой информацией. –

+0

Преобразование инфикса в префикс - это аккуратное домашнее задание, но бесполезное в реальном мире.Опции: (A) Parse infix и go (B) Parse infix, перевести на префикс, создать префикс, синтаксический префикс, перейти. Даже если префикс синтаксического анализа проще, процесс _conversion_ выполняется медленнее. –

ответ

-1

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

+0

Я больше боюсь парсеров Lex/Yacc. Я знал, что они существуют, но я не знаю, как их эффективно использовать. – 2010-04-01 04:52:14

3

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

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

1

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

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

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

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

+1

, чтобы оценить условие, вы должны разобрать текст ... следовательно, необходим какой-то парсер ... Кроме того, для преобразования из infix в префикс требуется синтаксический анализ, поскольку нужно знать правила ассоциативности и приоритет операторов, чтобы сделать ti правильно ... –

+1

Я говорю, нам не нужен синтаксический анализ. Я сказал, что нам не нужен полноценный парсер, такой как lex/yacc. делая префикс для префикса, используя это шутка. то в этом случае нам не нужно строить AST. – SysAdmin

Смежные вопросы