0
我目前正在为C-编译一个编译器。我目前正在研究解析器,出于某种原因,我似乎无法解决EXPRESSION生产中第一次碰撞(终端ID)的问题。下面,是我现在语法的一个子集,是否有人能指出我如何解决冲突(或转换为等价的LL(1)可解析语法)的正确方向。将C-语法转换为LL(1)
EXPRESSION -> id VAR eq EXPRESSION | SIMPLEEXPRESSION
VAR -> lbracket EXPRESSION rbracket | empty
SIMPLEEXPRESSION -> ADDITIVEEXPRESSION FADDITIVEEXPRESSION
FADDITIVEEXPRESSION -> RELOP ADDITIVEEXPRESSION | empty
RELOP -> ltoreq | lt | gt | gtoreq | doubleeq | noteq
ADDITIVEEXPRESSION -> TERM ADDITIVEEXPRESSION1
ADDITIVEEXPRESSION1 -> ADDOP TERM ADDITIVEEXPRESSION1 | empty
ADDOP -> plus | minus
TERM -> FACTOR TERM1
TERM1 -> MULOP FACTOR TERM1 | empty
MULOP -> times | divide
FACTOR -> lparen EXPRESSION rparen | id FACTOR1 | num
FACTOR1 -> a | b
尝试删除尽可能多的方法,以保留(子)文法的形状并保留问题。 (第一步,扔掉其余的语法,专注于你向我们展示的内容)。当你不能删除任何东西而不会使问题消失时,盯着剩下的东西;通常你会看到如何改变剩下的语法来避免这个问题。然后再添加一切。如果在这一点上你不能弄明白,向我们展示精简语法作为你的问题的扩展,并告诉你什么是你认为的问题。你会得到更多的建议。 –