我想解析语句由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。
感谢。
答案 0 :(得分:0)
错误不在原始语法中;但在输入数据中。我使用的是一个编辑器(在Eclipse中),它在EOL之后自动插入制表符,所以我的“空白行”并不是空白。
我修改了语法如下:
fragment SPACE: ' ' | '\t';
EOL : ( '\r'? '\n' SPACE* )+;
这个语法按预期工作。
这里的教训是必须小心白色空间。词法分析器可能会在输入中看到解析器未看到的空白区域(因为它已经被发送到隐藏通道)。