语法条件“!”(标记为“ except”)有什么作用?

时间:2018-08-17 14:56:56

标签: rascal

Rascal语法包含未记录的语法规则的产生:

| except: Sym symbol "!" NonterminalLabel

它在语法上类似于跟随条件,在注释为“条件”的部分中。我看到它已在Rascal语法中使用。 NonterminalLabel用于单个生产规则(不适用于具有所有备用规则的生产)。那这种情况怎么办?

1 个答案:

答案 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 ","}*被限制为非逗号表达式,以避免语法歧义。

  • 这里的好处是您不必引入另一个在逻辑上也可以表示表达式的非终结符。
  • 陷阱在于!运算符是一个严格的限制,因此可能实际上使可接受的语言更小:使用!如果使用不当,可能会导致意外的解析错误。

旁注:!运算符是用于对优先级(>)和关联性(左,右)语义进行建模的原始约束类型,但是它们是可传递的,并且经过安全性检查等。另一方面,这是对定义的残酷删除,因此可能会更改您的语言接受的句子。