Parsing 使用LL(1)语法解决表达式中的歧义

Parsing 使用LL(1)语法解决表达式中的歧义,parsing,grammar,ll,left-recursion,Parsing,Grammar,Ll,Left Recursion,我需要为一个表达式构造一个解析器,该表达式只允许有两个运算符(AND&OR),并且这两个运算符不能在一个封闭的表达式中同时存在 Eg1: (A AND B OR C) --> invalid (A AND (B OR C)) --> valid (A AND (B OR C) OR D) --> invalid ((A AND (B OR C)) OR D) --> valid (A AND ((B OR C) OR D)) --> valid Eg2: (A

我需要为一个表达式构造一个解析器,该表达式只允许有两个运算符(AND&OR),并且这两个运算符不能在一个封闭的表达式中同时存在

Eg1:

(A AND B OR C) --> invalid
(A AND (B OR C)) --> valid
(A AND (B OR C) OR D) --> invalid
((A AND (B OR C)) OR D) --> valid
(A AND ((B OR C) OR D)) --> valid
Eg2:

(A AND B OR C) --> invalid
(A AND (B OR C)) --> valid
(A AND (B OR C) OR D) --> invalid
((A AND (B OR C)) OR D) --> valid
(A AND ((B OR C) OR D)) --> valid
请注意:我对这个很陌生。我曾尝试通过以下几个在线教程使用LL(1)解析器来实现这一点。以下是我迄今为止所取得的成就

E -> F E'
E' -> OR F E'
E' -> ''
F -> G F'
F' -> AND G F'
F' -> ''
G -> ( E )
G -> id
上面的语法规则检查我是否只有有效的运算符和括号,但没有识别歧义问题。我并不期待解决方案,但我只是想知道我是否走上了正确的轨道。因为在其中一个教程中,导师提到如果一个终端符号有多个查找,
LL(1)
解析器将不起作用。我知道我还没有遇到过这种情况,但我会(特别是在生成解决歧义的规则时)吗

Edit1

E -> F E'
E' -> OR F E'
E' -> AND F E'
E' -> ''
F -> ( E )
F -> id
Edit2:解决方案

E -> F E'
E' -> and F G
E' -> or F H
E' -> ''
G -> and F G
G -> ''
H -> or F H
H -> ''
F -> ( E )
F -> id

哦,对不起。错过了一部空的作品。不管怎样,要考虑的是:括号里是什么?它是一个表达式,可选地后跟一系列AND或or。你已经有了这两种类型系列的作品,所以你只需要将它们正确地组合在一起。确切地说,我也有同样的想法,我已经用我的新规则更新了这个问题。但我还是缺少了一些地方…提示:在
E'->或
末尾的
E'
允许
x或y或z
。另一个提示:G和H不能以相同的非终结符结尾,因为它们没有相同的可能的连续体。@rici现在怎么样?哦,对不起。错过了一部空的作品。不管怎样,要考虑的是:括号里是什么?它是一个表达式,可选地后跟一系列AND或or。你已经有了这两种类型系列的作品,所以你只需要将它们正确地组合在一起。确切地说,我也有同样的想法,我已经用我的新规则更新了这个问题。但我还是缺少了一些地方…提示:在
E'->或
末尾的
E'
允许
x或y或z
。另一个提示:G和H不能以相同的非终结符结尾,因为它们没有相同的可能的连续体。@rici现在呢?