【发布时间】: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