私は最初の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
;
そして、私は次の結果を得る:
私が見たかったのは、テキストノードの下のtoken1とtoken2でした。トークン3、4、5なども同じです。そこで、各チャプターノードの下のコンテンツをチャプター名とチャプターテキストに分割したいと思いました。これを実現するには、文法をどのように変更すればよいですか?