这是这个的延续我之前提出的关于命题逻辑的 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 个减少/减少冲突,但在递归定义中这些冲突不是不可避免的吗?