检测ANTLR v4解析器中的缺失字符

时间:2014-11-04 14:59:03

标签: antlr4

我需要解析用ABNF格式编写的SRGS文件。我需要抓住 缺少封闭的双引号字符,例如:

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

我有这个词法规则:

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

它匹配有效输入,例如:“some text”。但是如何编写一个检测和抛出错误的规则 如果在示例中缺少封闭的双引号字符?

以下是在ANTLR v3中实施此规则的链接:ANTLR4 lexer rule with @init block

2 个答案:

答案 0 :(得分:0)

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

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

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

如果解析器在未终止字符串的情况下无法找到替代方法,则可以使用Parser的ANTLRErrorStrategy来定义如何处理错误。这个answer提供了有关使用错误策略的更多细节。而只是抛出一个错误,你可以选择潜在的“警告和恢复”。来自解析器错误。

答案 1 :(得分:0)

我已经使用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));}
;

我对双引号中的字符串工作正常,这些字符串不是多行的。