1

我想解析一种语言,其中语句由 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。

谢谢。

4

1 回答 1

0

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

我修改了语法如下:

fragment SPACE: ' ' | '\t';

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

该语法按预期工作。

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

于 2012-02-09T21:17:01.677 回答