2012-02-08 55 views
1

我想解析语句由EOL分隔的语言。我在词法分析器语法(从一个示例中的文档复制)尝试这样做:ANTLR将多个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;我在Eclipse中运行ANTLR IDE Indigo on OS X 10.6。

谢谢。

回答

0

错误不在原文中;但在输入数据。我使用的编辑器(在Eclipse中)在EOL后自动插入标签,所以我的“空白行”并不是真的空白。

我修改语法如下:

fragment SPACE: ' ' | '\t'; 

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

这种语法按预期工作。

这里的教训是,你必须小心空格。词法分析器可能会在分析器看不到的输入中看到空白(因为它已经发送到隐藏通道)。