ANTLR将多个EOL视为一个?

ANTLR将多个EOL视为一个?,antlr,eol,Antlr,Eol,我想解析一种语言,其中语句由EOL分隔。我在lexer语法中尝试了这一点(从文档中的一个示例中复制): 然后在解析器语法中使用: stmt_sequence : (stmt EOL)* ; 解析器拒绝了语句被一个或多个空行分隔的代码 然而,这是成功的: EOL : '\r'? '\n' ; stmt_sequence : (stmt EOL+)* ; 我是ANTLR的新手。看来两者都应该起作用。是否有关于贪婪/非灵巧lexer扫描的事情我不明白 我用3.2和3.4都试过了;我正在OSX10

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

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

stmt_sequence : (stmt EOL)* ;
解析器拒绝了语句被一个或多个空行分隔的代码

然而,这是成功的:

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

stmt_sequence : (stmt EOL+)* ;
我是ANTLR的新手。看来两者都应该起作用。是否有关于贪婪/非灵巧lexer扫描的事情我不明白

我用3.2和3.4都试过了;我正在OSX10.6上运行EclipseIndigo中的ANTLR IDE


谢谢。

错误不在原始语法中;但是在输入数据中。我使用的编辑器(在Eclipse中)在下线后自动插入选项卡,所以我的“空行”并不是真正的空白

我修改了语法如下:

fragment SPACE: ' ' | '\t';

EOL : ( '\r'? '\n' SPACE* )+;
这个语法按预期工作

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

fragment SPACE: ' ' | '\t';

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