我需要解析用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
答案 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));}
;
我对双引号中的字符串工作正常,这些字符串不是多行的。