如何确定在ANTLR中选择了哪个备用节点

Dav*_*vid 3 java antlr4

假设我有以下内容:

variableDeclaration: Identifier COLON Type SEMICOLON;
Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
Run Code Online (Sandbox Code Playgroud)

那些T_名称只被定义为"整数","char"等.

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

我以为它会是context.Type().getSymbol().getType()但是它没有返回正确的值.我知道我可以使用context.Type().getText()但我真的不想做字符串比较.

我错过了什么?

谢谢

GRo*_*erg 7

通过过早地组合令牌,您正在丢失词法分析器中的信息.最好在解析器规则中组合:

variableDeclaration: Identifier COLON type SEMICOLON;
type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
Run Code Online (Sandbox Code Playgroud)

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

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

switch(typeNode.getSymbol().getType()) {
  case YourLexer.T_INTEGER:
     ...
Run Code Online (Sandbox Code Playgroud)