Antlr4侦听器找不到子项

Antlr4侦听器找不到子项,antlr,antlr4,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

我有这样的语法:

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());
    }          
}

我无法复制这个。鉴于班级:

import org.antlr.v4.runtime.*;
导入org.antlr.v4.runtime.tree.*;
公共班机{
公共静态void main(字符串[]args)引发异常{
TestLexer lexer=newtestlexer(newantlrfilestream(“test.txt”);
//`test.txt`包含您的输入,顺便说一句
TestParser=newtestparser(newcommontokenstream(lexer));
ParseTree=parser.node();
ParseTreeWalker=新的ParseTreeWalker();
walk.walk(新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 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

通过此代码,我也得到了正确的结果。我编辑了上面的帖子,以显示我正在使用的代码。当我将侦听器附加到解析器时,结果是0。这是故意的吗?编辑:没关系,树(假)是坏人。@metacircle,是的,我看到你找到了罪犯。好。 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