Parsing 交替和重复分析语法

Parsing 交替和重复分析语法,parsing,grammar,lemon,Parsing,Grammar,Lemon,我能够通过以下方法为解析器的语法添加对交替字符的支持(例如,ababa或baba) 我现在希望通过允许字符重复来扩展这一点 例如,我希望能够支持abaabab和aababaaaa。在我的特殊情况下,只允许重复a,但允许重复b的解决方案也很有用 根据另一个问题的规则: expr ::= A | B A ::= "a" B | "a" B ::= "b" A | "b" 。。。我尝试扩展它以支持重复,如下所示: expr ::= A | B # support 1 or more "a" A_o

我能够通过以下方法为解析器的语法添加对交替字符的支持(例如,
ababa
baba

我现在希望通过允许字符重复来扩展这一点

例如,我希望能够支持
abaabab
aababaaaa
。在我的特殊情况下,只允许重复
a
,但允许重复
b
的解决方案也很有用

根据另一个问题的规则:

expr ::= A | B
A ::= "a" B | "a"
B ::= "b" A | "b"
。。。我尝试扩展它以支持重复,如下所示:

expr ::= A | B

# support 1 or more "a"
A_one_or_more = A_one_or_more "a" | "a"

A ::= A_one_or_more B | A_one_or_more
B ::= "b" A | "b"
。。。但这种语法是模棱两可的。有没有可能让这一点变得明确,如果有,谁能帮我消除歧义


我使用的是LALR(1)解析器。

这是一个在线检查语法的好工具。它实际上接受一个有效的LALR(1)语法

允许重复A的不同LALR(1)语法是:

S ::= "a" S | "a" | "b" A | "b"
A ::= "a" S .

这是一个在线检查语法的好工具。它实际上接受一个有效的LALR(1)语法

允许重复A的不同LALR(1)语法是:

S ::= "a" S | "a" | "b" A | "b"
A ::= "a" S .

一般来说,解析的重点是解析;也就是说,确定输入的语法结构。这与简单地验证输入是否属于一种语言有很大不同

例如,由任意重复的
a
b
组成的语言可以用正则表达式
(a | b)*
来描述,正则表达式可以用BNF写成

S ::= /* empty */  | S a | S b
但是,这可能无法捕获您试图定义的语法结构。另一方面,由于没有指定该结构,因此很难知道

以下是构建不同解析树的更多可能性:

S ::= E | S E
E ::= A b | E b
A ::= a | A a


在编写语法来解析语言时,从绘制建议的解析树开始是很有用的。通常,您可以直接从树的形式编写语法,这表明正式语法主要是一种文档工具,因为它以非正式描述无法做到的方式清楚地描述语言。使用解析器生成器将语法转换为解析器可以确保解析器实现所描述的语言。或者,至少,这是目标。

一般来说,解析的重点是解析;也就是说,确定输入的语法结构。这与简单地验证输入是否属于一种语言有很大不同

例如,由任意重复的
a
b
组成的语言可以用正则表达式
(a | b)*
来描述,正则表达式可以用BNF写成

S ::= /* empty */  | S a | S b
但是,这可能无法捕获您试图定义的语法结构。另一方面,由于没有指定该结构,因此很难知道

以下是构建不同解析树的更多可能性:

S ::= E | S E
E ::= A b | E b
A ::= a | A a


在编写语法来解析语言时,从绘制建议的解析树开始是很有用的。通常,您可以直接从树的形式编写语法,这表明正式语法主要是一种文档工具,因为它以非正式描述无法做到的方式清楚地描述语言。使用解析器生成器将语法转换为解析器可以确保解析器实现所描述的语言。或者,至少这是目标。

感谢您的详细回复。这绝对有道理,但不幸的是,我在这方面的能力不足,所以我很难解决我的模糊性。我会继续解决我的问题,希望我能解决它。再次感谢你@JesseBuesking:如果你问一个更精确的问题,你可能会得到更好的答案。从你对另一个答案的评论来看,我想你的语法与你所问的不太一样。然而,我坚持我的观点,你最好的办法是画一些语法图来澄清你的想法。谢谢你的详细回复。这绝对有道理,但不幸的是,我在这方面的能力不足,所以我很难解决我的模糊性。我会继续解决我的问题,希望我能解决它。再次感谢你@JesseBuesking:如果你问一个更精确的问题,你可能会得到更好的答案。从你对另一个答案的评论来看,我想你的语法与你所问的不太一样。然而,我坚持我的观点,你最好的办法是画一些语法图来澄清你的想法。我试图简化我的语法来回答这个问题,显然我简化得太多了,因为它仍然模棱两可。在我的示例中,a和b实际上是子规则的结果,不知何故,这导致了我的歧义。谢谢你的回复!我试图简化这个问题的语法,但显然我简化得太多了,因为它仍然模棱两可。在我的示例中,a和b实际上是子规则的结果,不知何故,这导致了我的歧义。谢谢你的回复!