2014-11-04 88 views
0

缺字,我需要解析用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

回答

0

的一種方法是使用模式是什麼構成一個有效的字符串的語法隔離:

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

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));} 
; 

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