2014-10-05 31 views
0

我試圖使用OpenSMILES規範解析SMILES字符串。Antlr4即使在預期輸入時也打印「無關輸入」錯誤

語法:

grammar SMILES; 

atom: bracket_atom | aliphatic_organic | aromatic_organic | '*'; 

aliphatic_organic: 'B' | 'C' | 'N' | 'O' | 'S' | 'P' | 'F' | 'Cl' | 'Br' | 'I'; 
aromatic_organic: 'b' | 'c' | 'n' | 'o' | 's' | 'p'; 

bracket_atom: '[' isotope? symbol chiral? hcount? charge? atom_class? ']'; 
symbol: element_symbols | aromatic_symbols | '*'; 
isotope: NUMBER; 
element_symbols: UPPER_CASE_CHAR LOWER_CASE_CHAR?; 
aromatic_symbols: 'c' | 'n' | 'o' | 'p' | 's' | 'se' | 'as'; 

chiral: '@' 
     | '@@' 
     | '@TH1' | '@TH2' 
     | '@AL1' | '@AL2' 
     | '@SP1' | '@SP2' | '@SP3' 
     | '@TB1' | '@TB2' | '@TB3' | DOT DOT DOT | '@TB29' | '@TB30' 
     | '@OH1' | '@OH2' | '@OH3' | DOT DOT DOT | '@OH29' | '@OH30'; 

hcount: 'H' | 'H' DIGIT; 

charge: '-' 
     | '-' DIGIT 
     | '+' 
     | '+' DIGIT 
     | '--' 
     | '++'; 

atom_class:':' NUMBER; 

bond: '-' | '=' | '#' | '$' | ':' | '/' | '\\'; 
ringbond: (bond? DIGIT | bond? '%' DIGIT DIGIT); 
branched_atom: atom ringbond* branch*?; 
branch: '(' chain ')' | '(' bond chain ')' | '(' dot chain ')'; 
chain: branched_atom 
    | chain branched_atom 
    | chain bond branched_atom 
    | chain dot branched_atom; 
dot: '.'; 

DOT: .; 
DIGIT: [0-9]; 
NUMBER: DIGIT+; 
UPPER_CASE_CHAR: [A-Z]; 
LOWER_CASE_CHAR: [a-z]; 

ONE_TO_NINE: [1-9]; 

smiles: chain; 

WS: [ \t\n\r]+ -> skip ; 

當試圖解析以下使用AntlrWorks2的TestRig:

CCc(c1)ccc2[n+]1ccc3c2Nc4c3cccc4 

以下錯誤(多個)印刷(縮短爲了簡潔):

line 1:5 extraneous input '1' expecting {'*', '[', 'N', 'O', 'I', 'S', '%', ')',..., DIGIT} 
... 
line 1:31 extraneous input '4' expecting {<EOF>, '*', '[', 'N', 'O',..., DIGIT} 

這發生在字符串中遇到的每個數字。

EDIT 1

固定DOT規則,通過@Lucas Trzesniewski所建議之後,extraneous input誤差已消失。但是,現在在測試不同的SMILES字符串時會出現新的錯誤。

例如,測試:

[Cu+2].[O-]S(=O)(=O)[O-] 

產生錯誤:

line 1:1 no viable alternative at input 'C' 

編輯2

問題從EDIT 1是由於我的element_symbols規則。使用文字符號字符串似乎已經解決了它。

element_symbols: 'H' | 'He' | 'Li' | 'Be' | 'B' | 'C' | 'N' | 'O' | 'F' | 'Ne' | //...and so on 

回答

3

您的詞法分析規則是錯誤的。

第一個錯誤:

DOT: .; 

這是一個包羅萬象的。你真正的意思是:

DOT: '.'; 

二錯誤:你感到困惑的規則如下:

DIGIT: [0-9]; 
NUMBER: DIGIT+; 
ONE_TO_NINE: [1-9]; 

ONE_TO_NINE永遠不會匹配任何東西,因爲它包含在DIGITDIGIT首先出現。由於ONE_TO_NINE規則從來沒有使用過,所以你應該簡單地刪除它。

然後,事情就是在你的語法規則將不匹配DIGIT DIGIT或者如果你期待一個2位數,你會得到一個NUMBER令牌存在,除非你分開與空白的數字(我不知道你真正的意思在那裏,所以也許這不是一個錯誤)。

+0

感謝您的幫助。修正'DOT'規則使得這個錯誤消失,但是現在一個新的錯誤出現在另一個SMILES字符串中。例如,[Cu + 2]。[O-] S(= O)(= O)[O-]'產生錯誤'行1:1在輸入'C'處沒有可行的選擇。 – 2014-10-05 22:14:23