0

私は最初の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
    ;

そして、私は次の結果を得る: ANTLRWorksの結果

私が見たかったのは、テキストノードの下のtoken1token2でした。トークン3、4、5なども同じです。そこで、各チャプターノードの下のコンテンツをチャプター名とチャプターテキストに分割したいと思いました。これを実現するには、文法をどのように変更すればよいですか?

4

0 に答える 0