0

我在学习 ANTLR4 的第二天。我的最终目标是为 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;

当我使用它来尝试解析时,我在and{\rtf1\ansi\deff0 {\fonttbl {\f0 Times New Roman;}}之间的第一个空格上得到一个错误。为什么规则末尾的不匹配那个空格?deff0{\fonttbl...(SPACE)?control

4

1 回答 1

0

Your token stream currently can never contain a SPACE token because the TEXT token matches SPACE+ (among other things) and appears before the SPACE token in the grammar. Your control rule allows a SPACE token, but does not allow TEXT which is what it's actually seeing for that space character.

于 2013-09-05T04:43:24.790 回答