#在antlr语法中的目的是什么
What is the purpose of # in antlr grammar
我在 ANTLR4 语法中有一个语句,例如:
expression : DEFAULT #primitive_expression
;
不知道这里的#
是什么意思。
它们是替代标签:
Alternative Labels
As we saw in Section 7.4, Labeling Rule Alternatives for Precise Event Methods, we can get more precise parse-tree listener events by labeling the outermost alternatives of a rule using the # operator. All alternatives within a rule must be labeled, or none of them. Here are two rules with labeled alternatives.
grammar T;
stat: 'return' e ';' # Return
| 'break' ';' # Break
;
e : e '*' e # Mult
| e '+' e # Add
| INT # Int
;
Alternative labels do not have to be at the end of the line and there does not have to be a space after the # symbol. ANTLR generates a rule context class definition for each label. For example, here is the listener that ANTLR generates:
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
我在 ANTLR4 语法中有一个语句,例如:
expression : DEFAULT #primitive_expression
;
不知道这里的#
是什么意思。
它们是替代标签:
Alternative Labels
As we saw in Section 7.4, Labeling Rule Alternatives for Precise Event Methods, we can get more precise parse-tree listener events by labeling the outermost alternatives of a rule using the # operator. All alternatives within a rule must be labeled, or none of them. Here are two rules with labeled alternatives.
grammar T; stat: 'return' e ';' # Return | 'break' ';' # Break ; e : e '*' e # Mult | e '+' e # Add | INT # Int ;
Alternative labels do not have to be at the end of the line and there does not have to be a space after the # symbol. ANTLR generates a rule context class definition for each label. For example, here is the listener that ANTLR generates:
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