5

Я создаю дерево разбора, которое будет содержать выражения, аналогичныеунарные и бинарные Минус в дерева синтаксического разбора

3 - 4 * 8

или

8 * -5

или

-(10 * 1)

Мне нужен способ провести различие между унарным и двоичным минусом. То, как идет моя грамматика, сначала вызывается двоичный минус, но я думаю об изменении этого и добавлении переменной флага, которая содержит последнюю переменную.

Ex: если 5 - 6

Флаг держит 5, и если он видит минус и флаг число скипового унарный и перейти к двоичной системе.

Однако я не знаю точно, как реализовать это в C++

Любая помощь будет высоко оценен.

Благодаря

+1

Вы имеете в виду способ отличить их, как вы делаете синтаксический анализ, или способ отличить их в разборе дерево? В дереве синтаксического анализа это тривиально - есть отдельные операторы UNARY_MINUS и BINARY_MINUS. Если вы имеете в виду, когда вы разбираетесь, унарный минус возникает, когда вы ожидаете операнда, а не оператора. –

+0

В моем парсере я хотел бы, чтобы он различал -5 и 4 -5. Моя следующая часть преобразует листья этого дерева в дерево AST (которое работает), но мой парсер видит все как двоичный минус (4-5). – Dfranc3373

ответ

6

Самый простой способ реализовать синтаксический анализатор является методом Recursive Descent. Убедитесь в том, чтобы дать бинарный минус более высокий приоритет, чем унарный минус, как в ссылочном сайте:

E --> | E "+" E 
     | E "-" E 
     | "-" E 
     | E "*" E 
     | E "/" E 
     | E "^" E 
     | "(" E ")" 
     | v 
+0

После просмотра сайта я могу написать свои правила грамматики, чтобы следить за правилами сайта, но одна проблема заключается в том, что этот парсер также должен иметь возможность обрабатывать =, < , <=, >,> = и, или, а не – Dfranc3373

+0

@ Dfranc3373 см. http://en.cppreference.com/w/cpp/language/operator_precedence для полного приоритета оператора для C++ – TemplateRex

+0

Спасибо большое! – Dfranc3373