我遇到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'
答案 0 :(得分:2)
你犯了经典错误。您的主规则最后没有EOF,因此您的解析器当前也只匹配您输入的一部分并将其视为有效。在你的情况下,它匹配VERB,然后不再需要。该PREPOSITION符合您的" TO"输入是行为的一部分,因为它将PREPOSIITON标记返回给解析器。但由于解析器已经对VERB输入感到满意,因此认为解析成功完成。
但是,如果没有PREPOSITION词法分析器规则,词法分析器会返回错误标记,因为它无法匹配该输入。这就是上面的错误。