检测在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提供了一些关于使用错误策略的更多细节。相反,只是抛出一个错误,您可以选择从解析器错误中'警告并恢复'。
答
我实现了这个使用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。
这不会对已内部分号输入工作引述: '公共$ 01 =“脚跟;○”;' – Adrian 2014-11-05 12:53:30