0

私はANTLR4を学習して2日目です。私の最終的な目標は、RTF 形式のファイルのパーサーを作成することです。ある状況に遭遇しましたが、ANTLR が何をしているのか、または何を誤解しているのかわかりません。簡略化されたスニペットを提供しようとします:

grammar Rtf;
document : LBRACE '\\rtf1' control+ fonttable (control | text)+ RBRACE ;

text : TEXT ;

fonttable : LBRACE '\\fonttbl' SPACE? (fontdecl)+ RBRACE ;

control : KEYWORD INT* (SPACE)? ;
KEYWORD : '\\' (ASCIILETTER)+ ;
INT : '-'? DIGIT+ ;

fragment ASCIILETTER : [A-Za-z] ;
fragment DIGIT : [0-9] ;

TEXT : ('A'..'Z' | 'a'..'z' | SPACE ])+ ;
SPACE : ' ';
WS : ('\r' | '\n') -> skip;

これを使用して解析しようとすると、と{\rtf1\ansi\deff0 {\fonttbl {\f0 Times New Roman;}}の間の最初のスペースでエラーが発生します。ルールの最後の がそのスペースに一致しないのはなぜですか?deff0{\fonttbl...(SPACE)?control

4

1 に答える 1

0

現在、トークン ストリームにトークンを含めることはできません。これは、SPACEトークンが(特に)TEXT一致し、文法でトークンの前に表示されるためです。あなたのルールはトークンを許可しますが、そのスペース文字について実際に見ているものは許可しません。SPACE+SPACEcontrolSPACETEXT

于 2013-09-05T04:43:24.790 に答える