【问题标题】:ANTLR treating multiple EOLs as one?ANTLR 将多个 EOL 视为一个?
【发布时间】:2012-02-08 23:17:41
【问题描述】:

我想解析一种语言,其中语句由 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 上运行 ANTLR IDE in Eclipse Indigo。

谢谢。

【问题讨论】:

    标签: antlr eol


    【解决方案1】:

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

    我修改语法如下:

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

    此语法按预期工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-03
      • 2012-07-05
      • 1970-01-01
      • 1970-01-01
      • 2010-12-15
      • 2020-11-26
      • 1970-01-01
      • 2013-07-06
      相关资源
      最近更新 更多