检测在ANTLR V4解析器

问题描述:

缺字,我需要解析用ABNF SRGS格式的文件。我需要赶上 失踪封闭双引号字符,例如:检测在ANTLR V4解析器

public $sdsid300035= $<sdsid300101>s number "hee; // missing enclosing " 
public $sdsid300036= $<sdsid300101>'s number "that's"; 

我有这样的词法规则:

DOUBLE_QUOTED_CHARACTERS: '\"' ~(['\"'])*? '\"' 

它有效的输入,像匹配:“一些文本”。但如何编写一个规则检测并抛出错误 缺少封闭的双引号字符就像在一个例子中一样?

这里是ANTLR v3中的链接,执行这一规则的:ANTLR4 lexer rule with @init block

的一种方法是使用模式是什么构成一个有效的字符串的语法隔离:

StrStart: '"' -> pushMode(strMode) ; 

mode strMode; 
ValidStringChar: [a-zA-Z ... ]+ ; 
StrEnd:   '"'   -> popMode; 
InvalidStrChar1: '>'   -> popMode, type(RAngle); 
InvalidStrChar2: ';'   -> popMode, type(Semi); 
... 

当分析器在没有终止的字符串的情况下找不到替代方案,可以使用Parser的ANTLRErrorStrategy来定义如何处理错误。这个answer提供了一些关于使用错误策略的更多细节。相反,只是抛出一个错误,您可以选择从解析器错误中'警告并恢复'。

+0

这不会对已内部分号输入工作引述: '公共$ 01 =“脚跟;○”;' – Adrian 2014-11-05 12:53:30

我实现了这个使用altrenatives,请参阅:

doubleQuotedCharacters 
: DOUBLE_QUOTED_CHARACTERS 
| WHITE_SPACES_IN_DOUBLE_QUOTE  {notifyErrorListeners("Illegal empty quotes\"\"!");} 
| MISSING_CLOSING_DOUBLE_QT  {notifyErrorListeners("Missing closing double quote!");} 
; 

WHITE_SPACES_IN_DOUBLE_QUOTE 
: '\"' WS* '\"' -> channel(HIDDEN) 
;     

MISSING_CLOSING_DOUBLE_QT 
: '\"' ~('\"')*? 
; 

DOUBLE_QUOTED_CHARACTERS 
: '\"' ~('\"' | '\n'|'\r')*? '\"'   
{ setText(getText().substring(1, getText().length()-1));} 
; 

我工作正常,在双引号字符串未在多行divited。