ANTLR3出现意外行为

时间:2016-08-27 20:28:44

标签: antlr3

我遇到ANTLR3的意外行为。这是我的语法:

grammar Onto;

****parser rules****

predicate   
    : VERB
    ;

****lexer rules****

VERB    
    : 'VB'  WS
    ;

PREPOSITION
    : 'TO' WS
    ;

WS
    : (' ' | '\t' | '\r'| '\n')
    ;

当我解析字符串" VB TO"时,ANTLR3退出而不标记错误。这是意料之外的,因为给定的字符串与语法中的任何规则都不匹配。

然而,当我从语法中删除PREPOSITION规则后重试相同时,ANTLR3会标记以下错误,这是预期的结果:

line 1:3 no viable alternative at character 'T'
line 1:4 no viable alternative at character 'O'

1 个答案:

答案 0 :(得分:2)

你犯了经典错误。您的主规则最后没有EOF,因此您的解析器当前也只匹配您输入的一部分并将其视为有效。在你的情况下,它匹配VERB,然后不再需要。该PREPOSITION符合您的" TO"输入是行为的一部分,因为它将PREPOSIITON标记返回给解析器。但由于解析器已经对VERB输入感到满意,因此认为解析成功完成。

但是,如果没有PREPOSITION词法分析器规则,词法分析器会返回错误标记,因为它无法匹配该输入。这就是上面的错误。