Rascal语法包含未记录的语法规则的产生:
| except: Sym symbol "!" NonterminalLabel
它在语法上类似于跟随条件,在注释为“条件”的部分中。我看到它已在Rascal语法中使用。 NonterminalLabel
用于单个生产规则(不适用于具有所有备用规则的生产)。那这种情况怎么办?
答案 0 :(得分:1)
如果是'E!在规则中出现“添加”,则仅表示E,但为E标记为“添加”的规则将不存在。 此限制仅深入一个级别,因此递归E将再次具有“添加”规则。
例如:
syntax E
= id: Id
| app: E "(" {E!comma ","}* ")"
> left mul: E "*" E
> left add: E "+" E
> right comma: E "," E
;
函数应用规则的E
中的{E ","}*
被限制为非逗号表达式,以避免语法歧义。
旁注:!运算符是用于对优先级(>)和关联性(左,右)语义进行建模的原始约束类型,但是它们是可传递的,并且经过安全性检查等。另一方面,这是对定义的残酷删除,因此可能会更改您的语言接受的句子。