【问题标题】:Implementation of a context-free grammar for logical operators with parentheses为带括号的逻辑运算符实现上下文无关文法
【发布时间】:2021-03-17 13:43:29
【问题描述】:

我正在尝试为带括号的逻辑运算符语言实现上下文无关语法,包括运算符优先级。

例如:

{1} or {2}
{1} and {2} or {3}
({1} or {2}) and {3}
not {1} and ({2} or {3})
...

我从以下语法开始:

expr := control | expr and expr | expr or expr | not expr | (expr)
control := {d+}

为了实现运算符优先级和eliminate left recursion,我做了如下修改:

S ::= expr
expr ::= control or expr1 | expr1
expr1 ::= control and expr2 | expr2
expr2 ::= not expr3 | expr3
expr3 ::= (expr) | expr | control
control := {d+}

但此类语法不支持以下示例:({1} 或 {2}) 和 {3} 在括号后包含“和”/“或”。

目前,我有以下语法:

S ::= expr
expr ::= control or expr1 | expr1
expr1 ::= control and expr2 | expr2
expr2 ::= not expr3 | expr3
expr3 ::= (expr) | (expr) expr4 | expr | control
expr4 :: = and expr | or expr
control := {d+}

这个语法正确吗? 可以通过某种方式简化吗?

谢谢!

【问题讨论】:

  • 如何从该语法中推导出第二个示例?我认为不可能,在这种情况下语法不正确。具有两个二元和一个一元运算符的代数语言可以用总共七个产生式来编写(将备选方案计为产生式)。你的有 15 个左右,所以可以简化。首先,没有必要将两种不同语法写作风格的科学怪人拼接在一起。我会先放弃 expr5、6 和 7。
  • 假设我删除了 expr5、6 和 7。在这种情况下,“({1} or {2}) 和 {3}”之类的示例不起作用。
  • 您需要产生式 expr3 -> ( expr ) 才能使括号起作用,但您似乎拥有它。问题是你在前两个作品中使用了“控制”。相反,它们应该是左递归的(尽管关联性对于布尔运算符来说并不重要)和级联,就像您在互联网上可以找到的标准代数语法一样(例如,here。我选择了那个,因为它是不像谷歌给我的前两打结果的其余部分,不是 PDF。)
  • 谢谢@rici,我会检查你发给我的例子。此外,我编辑了我的问题以获得更多详细信息。

标签: parsing context-free-grammar computation-theory context-free-language


【解决方案1】:

要实现运算符优先级,您只需要:

S ::= expr
expr ::= expr or expr1 | expr1
expr1 ::= expr1 and expr2 | expr2
expr2 ::= not expr2 | expr3
expr3 ::= (expr) | control
control := {d+}

这是左递归以便左关联,因为这通常是您想要的(为了正确性和大多数解析器生成器),但如果您出于某种原因需要避免左递归,您可以使用右-递归,右结合语法:

S ::= expr
expr ::= expr1 or expr | expr1
expr1 ::= expr2 and expr1 | expr2
expr2 ::= not expr2 | expr3
expr3 ::= (expr) | control
control := {d+}

因为andor 都是关联运算符,所以左对右无关紧要。

在这两种情况下,您都可以通过将 expr3 和 control 折叠到 expr2 中来“简化”它:

expr2 ::= not expr2 | ( expr ) | {d+}

【讨论】:

    猜你喜欢
    • 2012-10-01
    • 2015-02-22
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    相关资源
    最近更新 更多