【发布时间】:2020-04-15 08:43:30
【问题描述】:
这是this 问题的延续,我之前问过关于命题逻辑的 BNFC 语法。根据定义,我让它使用括号工作,但我现在想扩展语法以在没有括号的情况下工作,但是有一个问题:不允许不必要的外括号。
例如,原子语句a 应该被允许,但(a) 不应该被识别。句子(a => b) & c 也应该允许,但((a => b) & c) 不允许,等等。最后一个例子强调了括号的必要性。优先级是
- 等价
<=>和蕴涵=>, - 结合
&和析取| - 否定
-和 - 原子。
级别越高,越早被解析。
通过递归为不同的运算符设置优先级,我得到了使用不必要括号的语法:
IFF . L ::= L "<=>" L1 ;
IF . L ::= L "=>" L1 ;
AND . L1 ::= L1 "&" L2 ;
OR . L1 ::= L1 "|" L2 ;
NOT . L2 ::= "-" L3 ;
NOT2 . L2 ::= "-" L2 ;
P . L3 ::= Ident ;
_ . L ::= L1 ;
_ . L1 ::= L2 ;
_ . L2 ::= L3 ;
_ . L3 ::= "(" L ")" ;
现在的问题是,我如何不允许允许外括号,其允许是由最后一条规则L3 ::= "(" L ")"; 引起的?在表达式中允许括号是绝对必要的,但它也允许在边缘使用括号。我想我需要一些额外的规则来消除歧义,但那会是什么样的呢?
这个语法也导致了大约 6 个 reduce/reduce 冲突,但这些在递归定义中不是不可避免的吗?
【问题讨论】:
-
您可以尝试复制您的一些作品,通过在作品
L ::= L' "<=>" L1和L ::= L' "=>" L1中使用不同的L'来禁止作品直接从L到L3。在这种情况下,您的作品的L'副本可以被允许向下转换为L3,但L本身不能。因此,'部分表示生产参与了实际的扩展,而不仅仅是为了优先权而进行的转换。'重复项可以有括号,但非'不能。 -
@Welbog 所以基本上我会为第一级制作这 4 个作品:
L ::= L' "<=>" L1、L ::= L' "=>" L1、L' ::= L' "<=>" L1和L' ::= L' "=>" L1。然后使用L3,我会对L'版本进行括号括起来,如下所示:_. L3 ::= "(" L' ")";。
标签: parsing grammar context-free-grammar bnfc