Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何确定在ANTLR中选择了哪个备选节点_Java_Antlr4 - Fatal编程技术网

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

Java 如何确定在ANTLR中选择了哪个备选节点,java,antlr4,Java,Antlr4,假设我有以下几点: variableDeclaration: Identifier COLON Type SEMICOLON; Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN; 其中,这些T_u名称仅定义为“整数”、“字符”等 现在假设我在一个名为LittleLanguage的测试程序的exitVariableDeclaration方法中。我可以参考LittleLanguageLexer.T_INTEGER(等等),但我不知

假设我有以下几点:

variableDeclaration: Identifier COLON Type SEMICOLON;
Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
其中,这些T_u名称仅定义为“整数”、“字符”等

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

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

我错过了什么


谢谢

您过早地组合了令牌,从而丢失了lexer中的信息。最好在解析器规则中组合:

variableDeclaration: Identifier COLON type SEMICOLON;
type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
现在,
type
是一个终端节点,其基础令牌实例具有唯一的类型:

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

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

首先,感谢您的回复。第二,现在就杀了我吧——虽然你准确地描述了它被破坏的原因,但实际的“错误”是我写的是类型而不是类型,忘记了第一个字符决定了规则是由lexer还是解析器处理的!我从来没有打算把它作为一个lexer规则。尽管如此,我仍然有一个问题。没有可用的“getSymbol()”方法。“type”显示为typeContext,而不是终端节点。此时没有可用的getSymbol()。我可以键入context.type().T_INTEGER().getSymbol()之类的内容,但我必须知道它已经是一个整数了。顺便说一下,我知道我可以编写“if context.type().TINTEGER()!=null”之类的内容,但这似乎是一种非常草率的方法。必须有一种方法向上下文询问实际更新的令牌代码:在类型为
variableDeclarationContext
的上下文的任何选定实例中,
type()
返回一个TerminalNode,该节点封装一个令牌,该令牌是在
type
规则中匹配的单个令牌实例。令牌不能为null。在我的VariableDeclarationContext中,type()方法返回类型为“TypeContext,而不是“TerminalNode”的值。换句话说,ctx.type()不是我系统上的TerminalNode