我在 ANTLR4 语法中有一个语句,例如:
expression : DEFAULT #primitive_expression
;
Run Code Online (Sandbox Code Playgroud)
我不知道#这里是什么意思。
它们是替代标签:
替代标签
正如我们在第 7.4 节,为精确事件方法标记规则替代项中看到的那样,我们可以通过使用 # 运算符标记规则的最外层替代项来获得更精确的解析树侦听器事件。规则中的所有备选方案都必须加标签,或者不加标签。这里有两个带有标签替代项的规则。
Run Code Online (Sandbox Code Playgroud)grammar T; stat: 'return' e ';' # Return | 'break' ';' # Break ; e : e '*' e # Mult | e '+' e # Add | INT # Int ;替代标签不必在行尾,# 符号后不必有空格。ANTLR 为每个标签生成一个规则上下文类定义。例如,这里是 ANTLR 生成的监听器:
Run Code Online (Sandbox Code Playgroud)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); }
来自:https : //github.com/antlr/antlr4/blob/master/doc/parser-rules.md#alternative-labels