Parsing 将语法简化为LL1

Parsing 将语法简化为LL1,parsing,compiler-construction,grammar,context-free-grammar,compiler-theory,Parsing,Compiler Construction,Grammar,Context Free Grammar,Compiler Theory,我的语法如下: A-> AB|CA B-> Bd | ef C-> e|f 我删除了左递归,如下所示,语法如下所示: A->CAA' A'-> BA' A'-> epsilon B-> efB' B'->dB' B'-> epsilon C->e C->f 在这之后,我遇到的问题是,在为此构造解析表时存在歧义。 有人能为我指出正确的方向吗? 或者我认为我在计算解析表的第一个和第二个集合时出错了。Edit 呜呜声。原始语法没有派

我的语法如下:

A-> AB|CA
B-> Bd | ef
C-> e|f
我删除了左递归,如下所示,语法如下所示:

A->CAA'
A'-> BA'
A'-> epsilon
B-> efB'
B'->dB'
B'-> epsilon
C->e
C->f
在这之后,我遇到的问题是,在为此构造解析表时存在歧义。 有人能为我指出正确的方向吗? 或者我认为我在计算解析表的第一个和第二个集合时出错了。

Edit

呜呜声。原始语法没有派生任何终端字符串,因此尝试将其设为LL(1)是没有意义的。第一个结果总是生成一个包含
a
的表单,并且没有从
a
派生的其他内容。你的帖子有没有漏掉什么东西或是打字错误

待修复:

您的左递归删除是好的。现在,您需要每个产品的预测集:

A->CAA'            first(CAA') = { e, f }
A'-> BA'           first(BA') = { e }
A'-> epsilon       follow(A') = follow(A) = { end of input }
B-> efB'           first(efB') = { e }
B'->dB'            first(dB') = { d }
B'-> epsilon       follow(B') = { end of input }
C->e               first(e) = { e }
C->f               first(f) = { f }
这里没有歧义,因为对应于任何给定左侧的每个右侧的预测集都有空的成对交点


你看到了什么样的模糊性?

不会跟在(A)后面,包括第一个(A')以及生产结果A->CAA'?这就是我犯的错误。@user3638992是的!抢手货我错过了。让我想想。@user3638992实际上,更仔细地看,语法从未派生出任何终端字符串,因为第一个产品(不是在转换中,而是在原始产品中)将始终生成一个新的
a
。你跳过了一个节目吗?