2014-10-05 57 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