我如何确定在 ANTLR 中选择了哪个替代节点

How can I determine which alternative node was chosen in ANTLR

假设我有以下内容:

variableDeclaration: Identifier COLON Type SEMICOLON;
Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;

其中那些 T_ 名称刚刚定义为 "integer"、"char" 等

现在假设我在名为 LittleLanguage 的测试程序的 exitVariableDeclaration 方法中。我可以参考 LittleLanguageLexer.T_INTEGER (等),但我看不到如何确定通过上下文找到了哪些类型。

我原以为它会是 context.Type().getSymbol().getType(),但 return 不是正确的值。我知道我可以使用 context.Type().getText() 但我真的不想进行字符串比较。

我错过了什么?

谢谢

您通过过早地组合标记而丢失了词法分析器中的信息。最好结合解析器规则:

variableDeclaration: Identifier COLON type SEMICOLON;
type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;

现在,type 是一个 TerminalNode,其底层令牌实例具有唯一类型:

variableDeclarationContext ctx = .... ;
TerminalNode typeNode = (TerminalNode) ctx.type().getChild(0);

switch(typeNode.getSymbol().getType()) {
  case YourLexer.T_INTEGER:
     ...