Создание грамматики для двоичных выражений с надлежащим приоритетом (включая круглые скобки) - PullRequest
0 голосов
/ 20 июня 2019

У меня есть простая игрушечная программа, которую я использую для игры с бинарными выражениями.Я хочу, чтобы обычные правила приоритета применялись в первую очередь для вычисления выражений в круглых скобках, для mult / div и т. Д. У меня настроен следующий код, и он, кажется, работает, но я немного запутался, почему это так.

%left '+' '-'
%left '*' '/'

%%

start: e { printf("%d", $1);}

e: e '+' e { $$ = $1 + $3; }
   | e '-' e { $$ = $1 - $3; }
   | e '*' e { $$ = $1 * $3; }
   | e '/' e { $$ = $1 / $3; }
   | '(' e ')' { $$ = $2; }
   | NUMBER { $$ = $1; }
   ;

Например, если я введу 2 * (4 + 4), оно будет оценено как 2 * 8, а не 8 + 4. Я не уверен, почему это работает.Я хочу убедиться, что мое понимание этого верно.Когда парсер встречает 2 * (4 + 4), он сначала анализирует 2 *, затем он видит другое правило e, которое является (4 + 4).Затем он оценивает 4 + 4 и затем передает это значение, так что теперь мы находимся на 2 * 4?

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

1 Ответ

1 голос
/ 20 июня 2019

2 * (4 + 4) оценивается как 2 * 8, потому что это единственный способ, которым эти токены могут соответствовать вашим шаблонам правил грамматики.Ваши правила грамматики не имеют какой-либо структуры фразы, которая распознает 2 * ( 4 как единое целое, отдельно от части + 4.Единственный шаблон в вашей грамматике, который может соответствовать (4 + 4), это шаблон '(' e ')'.Этот аспект не имеет ничего общего с правилами приоритета.

Ассоциативность и приоритет среди арифметических операторов определяются следующими строками:

%left '+' '-'
%left '*' '/'

Элементы в одной строке находятся натот же уровень приоритета;более поздние строки имеют более высокий приоритет.

Если вы пропустите некоторые крайние случаи, тогда Yacc, как правило, будет жаловаться на это как «конфликты».Существует риск создания однозначной грамматики, которая действует вопреки вашим намерениям, но неясности не проходят без диагноза.

...