Parsing ANTLR语法中忽略了解析器规则

Parsing ANTLR语法中忽略了解析器规则,parsing,antlr,Parsing,Antlr,我正在努力写我的第一个ANTLR语法。我正在分析以下测试示例: token1 token2 chapter1 token3 token4 token5 chapter2 token6 token7 chapter3 token8 并使用以下语法: grammar Chapters; message : chapter+ EOF ; chapter : (chapter1|chapter2|chapter3) text ; text :

我正在努力写我的第一个ANTLR语法。我正在分析以下测试示例:

token1 token2 
chapter1 token3 token4 token5 
chapter2 
token6 token7
chapter3 token8
并使用以下语法:

    grammar Chapters;

message :   chapter+ EOF
    ;   


chapter :   (chapter1|chapter2|chapter3) text
    ;

text    :   ~(chapter1|chapter2|chapter3)*
    ;   

chapter1    :   'chapter1'
        ;   

chapter2    :   'chapter2'
        ;   

chapter3    :   'chapter3'
        ;   




Id  :   ('a'..'z'|'A'..'Z'|'_') ('a'..'z'|'A'..'Z'|'0'..'9'|'_')*
    ;

Int :   '0'..'9'+
    ;

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

WS  :   ( ' '
        | '\t'
        | '\r'
        | '\n'
        ) {$channel=HIDDEN;}
    ;

Char:  '\'' ( ESC_SEQ | ~('\''|'\\') ) '\''
    ;

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

fragment
HEX_DIGIT : ('0'..'9'|'a'..'f'|'A'..'F') ;

fragment
ESC_SEQ
    :   '\\' ('b'|'t'|'n'|'f'|'r'|'\"'|'\''|'\\')
    |   UNICODE_ESC
    |   OCTAL_ESC
    ;

fragment
OCTAL_ESC
    :   '\\' ('0'..'3') ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7') ('0'..'7')
    |   '\\' ('0'..'7')
    ;

fragment
UNICODE_ESC
    :   '\\' 'u' HEX_DIGIT HEX_DIGIT HEX_DIGIT HEX_DIGIT
    ;
我得到以下结果:


我想看到的是文本节点下的标记1标记2,标记3、4和5等也是如此。因此我想将每个章节节点下的内容分为章节名称和章节文本。我应该如何修改语法才能做到这一点?

不一定与您的问题有关,但示例文本似乎不符合语法。
消息
以章节标题(“第1章”等)开头,后跟文本(非章节标题),但“token1 token2”不以章节标题开头。如果你使用的是ANTLRWorks,它会给你一个错误吗?我在ANTLRWorks中做了所有的事情,它没有错误。但我决定再次检查它,当我在解释器中运行它时,我从我的问题中得到了图片,当我在调试器中运行它时,我得到了错误。我听说ANTLRWorks有缺陷,但直到现在才相信:(好的。树结构是ANTLRWorks对语法的理解,因为它与给定的输入有关。它不是一个有意义的输出树(首先,你的语法没有生成AST)。如果您愿意,我可以在回答中详细说明。否则,只需知道解释器有误导性。@tenterhook谢谢您的评论。我还没有到AST。我正在解释器和调试器中使用解析树视图。我相信我应该更正语法以使用调试器,然后构建AST,如果问题仍然存在,我将更新我的qu使用新的语法代码进行测试。