% left и% right в yacc

{%
#include<stdio.h>
#include<stdlib.h>
%}

%token ID NUM IF THEN LE GE EQ NE OR AND ELSE

%right '='
%left AND OR
%left '<' '>' LE GE EQ NE
%left '+''-'
%left '*''/'
%right UMINUS
%left '!'

%%

Упомянутое выше является частью программы yacc для простой программы IF ELSE .... Я просто новичок и не понимаю, что мы подразумеваем под %right и %left условия ...... пожалуйста, помогите мне по этому поводу ...


person Arjun K P    schedule 13.10.2012    source источник


Ответы (2)


%left и %right определяют ассоциативность оператора. Ассоциативность операции определяет, какая из двух операций с одинаковым уровнем приоритета выполняется первой.

Предположим, у нас есть грамматические правила:

exp ::= exp + exp
exp ::= ID

и предположим, что нам нужно проанализировать выражение x + y-z. Видите ли, поскольку уровень приоритета плюса и минуса одинаков, это выражение можно интерпретировать как (x + y) -z или x + (y-z). Это не кажется большим делом, но вносит двусмысленность в грамматику.

Не говоря уже о проблемах и теории, предположим, что мы анализируем выражение. 6 + 5-7, и предположим, что наш язык может работать только с натуральными числами и выдает исключение, когда происходит потеря значимости. Результат (6+5)-7 (4) не будет отличаться от 6+(5-7) (исключение), поэтому мы не сможем предсказать результат - если мы не определим порядок оценки, указав ассоциативность операторов. Также рассмотрите случай таких выражений, как f()+g()+h(), когда операнды являются функциями, которые могут иметь побочные эффекты.

person SáT    schedule 14.10.2012
comment
Также, поскольку %left '*' '/' написано под %left '+' '-', * and / имеет больший приоритет, чем + and - - person Ani; 24.04.2017

Я знаю, что это старый вопрос, но на случай, если кто-то еще ищет эту информацию:

%left, %right и %nonassoc, определяют, как yacc будет решать повторение операторов. Если у вас есть:

1 + 2 + 3

оба оператора имеют одинаковый уровень приоритета (они одинаковые :)), в этом случае yacc может решить:

// using %left
(1 + 2) + 3

or:

// using %right
1 + (2 + 3)

и наконец:

//using %nonassoc
1 + 2 + 3 is considered illegal and a syntax error!

вы можете прочитать больше здесь.

person Gustavo Vargas    schedule 11.01.2016