贪心“?”不对ANTLR4中的空格贪婪

时间:2013-09-05 04:35:28

标签: antlr4

我正在学习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与该空格不匹配?

1 个答案:

答案 0 :(得分:0)

您的令牌流当前永远不会包含SPACE令牌,因为TEXT令牌与SPACE+(以及其他内容)匹配,并且出现在语法中的SPACE令牌之前。您的control规则允许使用SPACE令牌,但不允许TEXT这就是该空格字符实际看到的内容。