2013-12-20 6 views
7

я объявил такие старшинства для bison:Зубное преимущество бесполезно? он не работает

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

рекурсивного правила арифметики:

exp:  exp binary_op exp { .. } 
      | literal_exp  { .. } 
      | ID    { .. } 

binary_op: '+'    { .. } 
      | '-'    { .. } 
      | '*'    { .. } 
      | '/'    { .. } 

У меня есть арифметическое выражение: 10 * 3 + 5

Моя программа вычисляет сумму , и это 80! Я до сих пор не знаю, почему приоритет не работает.

ответ

8

Он должен работать, если определить такие выражения, как это:

exp:  exp '+' exp  { .. } 
      exp '-' exp  { .. } 
      exp '*' exp  { .. } 
      exp '/' exp  { .. } 
      | literal_exp  { .. } 
      | ID    { .. } 

Предшествование работает только тогда, когда операторы присутствуют в качестве терминалов в правиле.

Смотрите документацию на How precedence works:

каждое правило получает преимущество от последнего терминального символа упоминается в компонентах

Ваше правило ехр не имеют клемм, следовательно, не приложено старшинство ,