Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Compiler construction 带LL(1)语法分析的歧义语法_Compiler Construction_Grammar_Ll - Fatal编程技术网

Compiler construction 带LL(1)语法分析的歧义语法

Compiler construction 带LL(1)语法分析的歧义语法,compiler-construction,grammar,ll,Compiler Construction,Grammar,Ll,我有很多问题要解决。我必须重写下面的语法,使其与LL(1)语法一起工作 → 名词|名词和名词| M,名词和名词 M→ M、 名词 我注意到的第一个问题是,语法在头为M的产品中是递归的,我这样修复它 M→ 名词NewPro 纽普→ , 名词NewPro 但后来我注意到,标题为S的产品模棱两可,但我不知道如何解决它,我试图“分解”这个名词,但实际上我不确定 你能帮我吗 谢谢你的回答 对M的左递归消除不完整——您忘记了规则NewPro→ ε 一旦添加了它,就剩下了S的问题,这不是含糊不清的,而是

我有很多问题要解决。我必须重写下面的语法,使其与LL(1)语法一起工作

→ 名词|名词和名词| M,名词和名词

M→ M、 名词

我注意到的第一个问题是,语法在头为M的产品中是递归的,我这样修复它

M→ 名词NewPro

纽普→ , 名词NewPro

但后来我注意到,标题为S的产品模棱两可,但我不知道如何解决它,我试图“分解”这个名词,但实际上我不确定

你能帮我吗


谢谢你的回答

M
的左递归消除不完整——您忘记了规则NewPro→ ε

一旦添加了它,就剩下了
S
的问题,这不是含糊不清的,而是需要左分解。自第一(M)项和子条款起;首先,您需要先将M替换为S:

→ 名词|名词和名词|名词NewPro、名词和名词

然后你们可以把这个因素简单地,放到

→ 名词S'
是的→ ε|和名词| NewPro、名词和名词

现在的问题是,这个语法是LL(4),而不是LL(1),因为您需要4个token lookahead来查找
NewPro
s序列的结尾。这是一个更难处理的问题,但它是可以解决的。首先,您需要将
,名词,
拉入NewPro:

是的→ ε|和名词| NewPro和名词
纽普→ , 名词,|,名词NewPro

然后左因子NewPro:

纽普→ , 名词NewPro'
NewPro'→ , | 纽普

然后替换为NewPro':

NewPro'→ , | , 名词NewPro'

左边的因素也是:

NewPro'→ , NewPro“ NewPro“→ ε|名词NewPro'

给出最后的语法:

→ 名词S'
是的→ ε|和名词| NewPro和名词
纽普→ , 名词NewPro'
NewPro'→ , NewPro“”
NewPro“→ ε|名词NewPro'

它是LL(1),可以直接使用,也可以通过将NewPro替换回S'并重命名规则以去除'-后缀来简化:

→ 名词A
A.→ ε|和名词|,名词B和名词
B→ , C

C→ ε| noon B

您的第一次重构是错误的-旧的M派生出
noon
,新的M没有。