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
。你跳过了一个节目吗?