假设我使用以下语法进行编译器
S -> a | aB
如果我对其进行左因式分解,就会像(e 是 epsilon)
S -> aC
C -> B | e
然后我想删除 epsilon ,结果就像
S -> a | aC
C -> B
请注意,看起来我再次需要执行左因式分解,并且这样做无限左因式分解并来回删除 epsilon。难道我做错了什么 ??
编译器语法上是否需要同时删除左因子分解和 epsilon?
大多数时候,您不需要进行任何一种转换。事实上,对于某些语法,左因式分解会为 LALR(1) 解析器生成器产生移位归约冲突。
我不认为你必须在左因式分解后写epsilon。
S -> aC
C -> B
在大多数情况下这将被认为是正确的。