ANTLR3 的意外行为

Unexpected behavior with 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'

你犯了经典错误。您的主要规则末尾没有 EOF,因此您的解析器目前也仅匹配您输入的一部分并将其视为有效。在您的情况下,它与 VERB 匹配,然后仅此而已。 PREPOSITION 与您的 "TO" 输入匹配是行为的一部分,因为此 returns 是解析器的 PREPOSIITON 标记。但是由于解析器已经对 VERB 输入感到满意,它认为解析已成功完成。

然而,如果没有 PREPOSITION 词法分析器规则,词法分析器 returns 一个错误标记,因为它无法匹配该输入。上面的错误是关于什么的。