antlr4语法 - 输入错误不匹配

时间:2016-02-11 13:42:52

标签: parsing antlr antlr4 context-free-grammar

我的语法非常简单:

grammar mygrammar;
prog  : E 'arrow' ('and' E PATTERN) ;
PATTERN : ( BPATTERN | ('and' PATTERN)+ | ('or' PATTERN)+ ) ;
BPATTERN : ( L | P ('and' E PATTERN) ) ;
L : ( E | 'not' E | U | 'not' U ) ;
P : 'p' ;
U : 'u' ;
E : 'e' ;
WS : [ \t\r\n]+ -> skip ;

我解析的所有输入字符串,错误始终相同:

第1行:0输入'e'不匹配期待'e'

如果我用'x'改变'e'标记,我得到相同但内部有'x',所以问题似乎与非终端E有关。 有谁知道错误在哪里?

1 个答案:

答案 0 :(得分:2)

这是因为输入"e"被标记为L标记。您需要使L成为解析器规则而不是词法分析器规则。

解析器规则以小写字母开头,因此您可以尝试这样的事情:

grammar mygrammar;

// parser rules
prog     : E 'arrow' 'and' E pattern ;

pattern  : bpattern 
         | ('and' pattern)+ 
         | ('or' pattern)+
         ;

bpattern : l 
         | P 'and' E pattern
         ;

l        : 'not'? ( E | U ) ;

// lexer rules (tokens)
P : 'p' ;
U : 'u' ;
E : 'e' ;

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