【问题标题】:Parse grammar alternating and repeating交替和重复解析语法
【发布时间】:2016-11-22 08:33:22
【问题描述】:

通过跟随this question,我能够为我的解析器语法添加交替字符(例如ababababa)的支持。

我现在希望通过允许重复字符来扩展它。

例如,我也希望能够支持abaaababaababaaa。在我的特殊情况下,只允许重复 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"

...但是那个语法是模棱两可的。是否可以明确这一点,如果可以,有人可以帮我消除歧义吗?

我正在使用lemon parser,它是一个 LALR(1) 解析器。

【问题讨论】:

    标签: parsing grammar lemon


    【解决方案1】:

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

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

    S ::= /* empty */  | S a | S b
    

    但这可能无法捕捉到您试图定义的句法结构。另一方面,由于您没有指定该结构,因此很难知道。

    这里有更多的可能性,它们会构建不同的解析树:

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

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

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

    【讨论】:

    • 感谢您的详细回复。这绝对是有道理的,但不幸的是我在这方面的能力不足,所以我很难解决我的歧义。我将继续解决我的特定问题,希望我能够解决它。再次感谢您!
    • @JesseBuesking:如果您提出更精确的问题,您可能会得到更好的答案。从您对另一个答案的评论中,我了解到您的语法看起来并不像您所询问的那样。但是,我坚持我的说法,你最好的办法是画一些语法图来澄清你的想法。
    【解决方案2】:

    这是一个在线检查语法的好工具http://smlweb.cpsc.ucalgary.ca/start.html。它实际上接受 the grammar you provided 作为有效的 LALR(1) 语法。

    另一种允许重复 a 的 LALR(1) 语法是:

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

    【讨论】:

    • 我试图为这个问题简化我的语法,显然我简化了太多,因为它仍然模棱两可。我的示例中的 a 和 b 实际上是子规则的结果,并且不知何故导致了我的歧义。感谢您的回复!
    猜你喜欢
    • 2020-08-24
    • 2017-10-21
    • 1970-01-01
    • 1970-01-01
    • 2015-07-29
    • 2018-06-28
    • 2016-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多