Compiler construction 删除LL(1)的第一个和后续集合交点

Compiler construction 删除LL(1)的第一个和后续集合交点,compiler-construction,grammar,ll,Compiler Construction,Grammar,Ll,我目前正在为一个项目进行编译器构造,我正处于使语法符合LL(1)的阶段 我很好地替换了EBNF表示法,删除了左递归并进行了一些分解,但我似乎停留在一个生产规则上,该规则在first和follow集合之间有一个交集,导致了歧义。 终端在单引号内,而multIndice、idnest_uuu和params与问题无关。 multIdnest的产品最终有一个“id”的交叉点,用于第一集和后续集,我很难摆脱它 任何关于如何前进的帮助都将不胜感激,不一定只是为了解决我的问题,而是一般来说如何应对这种情况 f

我目前正在为一个项目进行编译器构造,我正处于使语法符合LL(1)的阶段

我很好地替换了EBNF表示法,删除了左递归并进行了一些分解,但我似乎停留在一个生产规则上,该规则在first和follow集合之间有一个交集,导致了歧义。 终端在单引号内,而multIndice、idnest_uuu和params与问题无关。 multIdnest的产品最终有一个“id”的交叉点,用于第一集和后续集,我很难摆脱它

任何关于如何前进的帮助都将不胜感激,不一定只是为了解决我的问题,而是一般来说如何应对这种情况

factor       -> multIdnest 'id' postCall | 'int' | 'float'
variable     -> multIdnest 'id' multIndice
functionCall -> multIdnest 'id' '(' params ')'
multIdnest   -> idnest multIdnest | EPSILON
idnest       -> 'id' idnest_

如果你能提供你的原始语法,让我们看看你想要达到什么目的,也许会有所帮助。例如,
idnest\u
应该是什么?另外,为什么不使用LALR解析器生成器呢?当然,这是完整的EBNF语法。我选择LL(1)的原因很简单,因为这是我得到的关于这个项目的指示的一部分。我知道multVarDecl的first和follow也有交叉点,但我认为我应该能够应用从这种情况中学到的相同原则。如果你认为
是变量限定的开始,而不是结束,那么它与中缀表达式的转换没有什么不同。问题是在赋值语句的上下文中,如何区分
变量
函数调用
。我想这也是可以做到的,但这很痛苦。这些都不是LR语法的问题。我想这是一项学校作业,所以你没有空间就设计决定进行争论。