假设我有以下内容:
variableDeclaration: Identifier COLON Type SEMICOLON;
Type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
那些 T_ 名称只是定义为“整数”、“字符”等。
现在假设我在名为 LittleLanguage 的测试程序的 exitVariableDeclaration 方法中。我可以引用 LittleLanguageLexer.T_INTEGER(等),但我看不到如何确定通过上下文找到了哪些类型。
我原以为它会是 context.Type().getSymbol().getType()
但它没有返回正确的值。我知道我可以使用 context.Type().getText(
) 但我真的不想进行字符串比较。
我错过了什么?
谢谢
最佳答案
您通过过早地组合标记而丢失了词法分析器中的信息。最好结合在解析器规则中:
variableDeclaration: Identifier COLON type SEMICOLON;
type: T_INTEGER | T_CHAR | T_STRING | T_DOUBLE | T_BOOLEAN;
现在,type
是一个 TerminalNode,其底层 token 实例具有唯一类型:
variableDeclarationContext ctx = .... ;
TerminalNode typeNode = (TerminalNode) ctx.type().getChild(0);
switch(typeNode.getSymbol().getType()) {
case YourLexer.T_INTEGER:
...
关于java - 我如何确定在 ANTLR 中选择了哪个替代节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33198762/