Antlr4 Listener 找不到子项

标签 antlr antlr4

我有这个语法:

grammar Test;

node:
    BEGIN BLOCK
    name=STRING
    noOfKvp=INT

    (
    key_value_pair |
    hasOptionalThing=OPTIONAL_THING
    )*

    END BLOCK
    ;

key_value_pair
    :   key=number value=number
    ;

number
    : INT | FLOAT
    ;

BEGIN : 'BEGIN';
END : 'END';
BLOCK : 'BLOCK';
OPTIONAL_THING : 'OPTIONAL_THING' ;
STRING : '"' .*? '"';

INT
    : MINUS? DIGIT+
    ;

FLOAT
    : MINUS? ('0'..'9')+ '.' ('0'..'9')* EXPONENT? | MINUS? '.' ('0'..'9')+ EXPONENT? | MINUS? ('0'..'9')+ EXPONENT
    ;

fragment MINUS
    : '-'
    ;

fragment EXPONENT
    : ('e'|'E') ('+'|'-')? ('0'..'9')+
    ;

DIGIT
    : '0'..'9'
    ;


WS : ( ' ' | '\t' | '\r' | '\n')+ -> skip;

这个示例文件:

BEGIN BLOCK
    "Blockname"
    5
    1 5
    2 7.5
    3.3 10
    4 12.5
    5.2 15
END BLOCK

现在,当我解析它时,我似乎没有在监听器中获取键值对:

public class MyListener extends TestBaseListener  {

    @Override
    public void exitNode(TestParser.NodeContext ctx) {
        super.exitNode(ctx);
        List<TestParser.Key_value_pairContext> keyValuePairs = ctx.key_value_pair();
        System.out.println(keyValuePairs.size());
    }          
}

输出为0。我不明白为什么...

编辑:这是我运行解析器的代码

public static void main(String[] args) throws IOException {
        ANTLRFileStream stream = new ANTLRFileStream("C:\\temp\\SimpleGrammarTest.txt");
        TestLexer lexer = new TestLexer(stream);
        TokenStream tokenStream = new CommonTokenStream(lexer);
        TestParser parser = new TestParser(tokenStream);
        parser.setBuildParseTree(false);
        parser.addParseListener(new MyListener());
        parser.node();
    }

最佳答案

我无法重现这个。给定类(class):

import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;

public class Main {
    public static void main(String[] args) throws Exception {

        TestLexer lexer = new TestLexer(new ANTLRFileStream("test.txt"));
        // `test.txt` contains your input, btw

        TestParser parser = new TestParser(new CommonTokenStream(lexer));
        ParseTree tree = parser.node();

        ParseTreeWalker walker = new ParseTreeWalker();
        walker.walk(new MyListener(), tree);
    }
}

并进行如下测试:

java -cp antlr-4.2.1-complete.jar org.antlr.v4.Tool Test.g4 
javac -cp .:antlr-4.2.1-complete.jar *.java
java -cp .:antlr-4.2.1-complete.jar Main

我看到 5 打印在我的控制台上。

关于Antlr4 Listener 找不到子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22828973/

相关文章:

antlr 词法分析器规则与另一个规则的前缀匹配

java - 为什么在使用 C 语法的 ANTLR 4 中没有可行的#include 语句替代方案?

java - 在 ANTLR 版本 4 中构建 AST

java - 有没有一种方法可以将零个或多个多个规则模式组合到 Antlr4 的一个列表中?

在 ANTLR 中解析字符串插值

parsing - 如何检查 ANTLR token 在解析器中仅使用一次或更少

c++ - Antlr4 C++ 访客 API

java - 如何抓取antlr4错误输出?

java - 初始化我的 Lexer 在 Antlr4 中抛出错误

maven - 使用Maven构建时如何在Antlr4中导入语法?