0

У меня есть следующая грамматика, которая дает мне три смены уменьшить конфликты:сдвига уменьшить число конфликтов в середине действия правила зубра

boolexpression:   boolexpression OR boolterm 
         | boolterm ; 

boolterm:    boolterm AND boolfact 
         | boolfact; 

boolfact:    "!" "(" boolexpression ")" 
         | "(" boolexpression ")" 
         | BOOLLITERAL 
         | expression boolop expression 

boolop:     "<"| ">"| BOOLOPLEQ /* <= */ | BOOLOPGEQ /* >= */ | BOOLOPEQ /* == */ | BOOLOPNEQ /* != */; 

expression:    sum ; 

sum:     sum "+" term   
         | sum "-" term  
         | term ; 

term:     term "*" factor 
         | term "/" factor 
         | factor; 

factor:     ID   
         | NUMBER  
         | "(" {/* rules to generate IR/*} expression ")"; 

Когда я удалить {/* rules to generate IR/*}, все работает нормально.

+0

У грамматики, которую вы опубликовали, нет конфликтов, поэтому конфликты, которые вы видите, исходят из какой-либо другой части грамматики, которую вы оставили вне своего поста ... –

ответ

0

Этот конфликт обусловлен тем, что после "(" в правиле factor это действие происходит в середине действия. В этом случае вы не можете этого сделать, потому что сокращения boolfact --> "(" boolexpression ")" и factor --> "(" {/* rules to generate IR/*} expression ")" оба содержат маркер "(" в качестве первого признака. Поэтому, когда бизон распознает "(", он не знает, какое правило уменьшить.

Одним из решений является размещение {/* rules to generate IR/}. После expression в "(" {/ rules to generate IR/*} expression ")";. Существует также более полезная информация, найденная по адресу https://www.gnu.org/software/bison/manual/html_node/Mid_002dRule-Conflicts.html#Mid_002dRule-Conflicts.