ANTLR将多个EOL视为一个?

时间:2012-02-08 23:17:42

标签: antlr eol

我想解析语句由EOL分隔的语言。我在词法分析器语法中尝试了这一点(从文档中的一个例子中复制):

EOL : ('\r'? '\n')+ ; // any number of consecutive linefeeds counts as a single EOL

然后在解析器语法中使用它:

stmt_sequence : (stmt EOL)* ;

解析器拒绝了带有一个或多个空行分隔的语句的代码。

然而,这是成功的:

EOL : '\r'? '\n' ;

stmt_sequence : (stmt EOL+)* ;

我是一名ANTLR新手。似乎两者都应该有效。有什么关于我不理解的贪婪/不同意的词法扫描吗?

我试着使用3.2和3.4;我在 OS X 10.6上运行Eclipse Indigo中的 ANTLR IDE。

感谢。

1 个答案:

答案 0 :(得分:0)

错误不在原始语法中;但在输入数据中。我使用的是一个编辑器(在Eclipse中),它在EOL之后自动插入制表符,所以我的“空白行”并不是空白。

我修改了语法如下:

fragment SPACE: ' ' | '\t';

EOL : ( '\r'? '\n' SPACE* )+;

这个语法按预期工作。

这里的教训是必须小心白色空间。词法分析器可能会在输入中看到解析器未看到的空白区域(因为它已经被发送到隐藏通道)。