2011-06-14 79 views
2

如果我有一个ANTLR语法如下:似乎非确定性在ANTLR解析

grammar Test; 
options { 
    language = Java; 
} 

rule : (foo | bar); 


foo : FOO ',' FOO; 
bar : BAR; 

FOO: ('0'..'9')+; 
BAR: ('a'..'z' | 'A'..'Z' | '0'..'9' | ' ')+; 
WHITESPACE: (' ' | '\t')+ { $channel=HIDDEN; }; 

我使用测试字符串:

12abc3

这(我相信)是BAR令牌,其满足bar规则并且被如此解析。布拉沃。

但是,如果我有这样的字符串:

12 

我收到line 1:2 mismatched input '' expecting ','

这似乎相当不确定性,虽然我敢肯定它不是。我知道我已经有两个令牌:FOOBAR接受数字。但是,如果解析器要成功或失败,它应该一致成功或失败。换句话说,在第一种情况下,第一个字符是1,显然是作为BAR令牌的成员进行评估,因此解析器将成功通过一条路径。在第二种情况下,同一个第一个字符被评估为FOO令牌,因此该路径注定会失败,尽管该字符串可能是成功的bar解析。为什么不一致?或者我错过了更关于ANTLR和/或解析的基础知识?

回答

3

ANTLR不会确定标记类型,直到它看到下一个标记(或EOF)的第一个字符。 ANTLR也将尝试最长的比赛,这就是为什么你看到'12abc3'为BAR而不是FOO BAR。在第二种情况下,ANTLR将使用FOO作为'12',因为它在语法中首先列出。

ANTLR basics

ANTLR lexers

0

除了亚当回答,你必须认识到,词法和语法分析器,虽然在相同的语法定义,正在以不同的时间结构。首先输入源被标记化,当发生这种情况时,只有解析器对这些标记进行操作。标记而不是在解析器经历源(字符流)以支持完整匹配(即,标记化"12"作为BAR)时创建。 "12"被标记为FOO这一事实是因为FOOBAR规则之前,并且因此在长度相等的情况下具有更高的优先级。

总之:ANTLR语法是不是PEG's。