代码之家  ›  专栏  ›  技术社区  ›  eh9

语法条件是什么!`(标有“除外”)是吗?

  •  0
  • eh9  · 技术社区  · 6 年前

    Rascal语法包含一个未记录的语法规则产品:

    | except: Sym symbol "!" NonterminalLabel
    

    NonterminalLabel 是针对单个生产规则(不是包含所有替代项的生产)。那么这种情况有什么作用呢?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Jurgen Vinju    6 年前

    如果E!add出现在规则中,那么它只是表示E,但是E的标签为“add”的规则就好像不存在一样。

    例如:

    syntax E 
      = id: Id
      | app: E "(" {E!comma ","}* ")"
      > left mul: E "*" E
      > left add: E "+" E
      > right comma: E "," E
      ;
    

    E 在里面 {E ","}* 函数的应用规则被限制为不使用逗号表达式,以避免语法歧义。

    • 陷阱在于!运算符是一个硬限制,因此可能会使接受的语言实际上更小:使用!如果不小心使用,可能会导致意外的分析错误。