antlr语法中#的目的是什么

Pri*_*iya 1 antlr antlr4

我在 ANTLR4 语法中有一个语句,例如:

expression : DEFAULT    #primitive_expression
           ;
Run Code Online (Sandbox Code Playgroud)

我不知道#这里是什么意思。

Bar*_*ers 6

它们是替代标签

替代标签

正如我们在第 7.4 节,为精确事件方法标记规则替代项中看到的那样,我们可以通过使用 # 运算符标记规则的最外层替代项来获得更精确的解析树侦听器事件。规则中的所有备选方案都必须加标签,或者不加标签。这里有两个带有标签替代项的规则。

grammar T;
stat: 'return' e ';' # Return
  | 'break' ';' # Break
  ;
e   : e '*' e # Mult
    | e '+' e # Add
    | INT # Int
    ;
Run Code Online (Sandbox Code Playgroud)

替代标签不必在行尾,# 符号后不必有空格。ANTLR 为每个标签生成一个规则上下文类定义。例如,这里是 ANTLR 生成的监听器:

public interface AListener extends ParseTreeListener {
  void enterReturn(AParser.ReturnContext ctx);
  void exitReturn(AParser.ReturnContext ctx);
  void enterBreak(AParser.BreakContext ctx);
  void exitBreak(AParser.BreakContext ctx);
  void enterMult(AParser.MultContext ctx);
  void exitMult(AParser.MultContext ctx);
  void enterAdd(AParser.AddContext ctx);
  void exitAdd(AParser.AddContext ctx);
  void enterInt(AParser.IntContext ctx);
  void exitInt(AParser.IntContext ctx);
}
Run Code Online (Sandbox Code Playgroud)

来自:https : //github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels