首页 文章

贪婪的“?”并没有对ANTLR4中的空间贪婪

提问于
浏览
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... 之间的第一个空格上出现错误 . 为什么 control 规则末尾的 (SPACE)? 与该空格不匹配?

1 回答

  • 0

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

相关问题