贪婪&引用;在ANTLR4中不贪图空间

贪婪&引用;在ANTLR4中不贪图空间,antlr4,Antlr4,我正在学习ANTLR4的第2天。我的最终目标是为RTF格式的文件编写解析器。我遇到了这样的情况,我不知道ANTLR在做什么,也不知道我在误解什么。我将尝试提供一个简化的代码片段: grammar Rtf; document : LBRACE '\\rtf1' control+ fonttable (control | text)+ RBRACE ; text : TEXT ; fonttable : LBRACE '\\fonttbl' SPACE? (fontdecl)+ RBRACE ;

我正在学习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…
之间的第一个空格上得到了一个错误。为什么
(空格)?在
控件的末尾
规则匹配该空格?

您的令牌流当前不能包含
空格
令牌,因为
文本
令牌匹配
空格+
(除其他外)并且出现在语法中的
空格
标记之前。您的
控件
规则允许使用
空格
标记,但不允许使用
文本
,而这正是它实际看到的空格字符。

谢谢。我想我还有更多的阅读要做。因为单个空格可以选择性地成为c的一部分控制字(如“\deff0”),但任何其他空格都将被视为文本。我还不知道如何告诉ANTLR。谢谢您的帮助。