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