9

我正在尝试使用Treetop解析 ERB 文件。我需要能够处理如下行:

<% ruby_code_here %>
<%= other_ruby_code %>

由于 Treetop 是用 Ruby 编写的,并且您使用 Ruby 编写 Treetop 语法,Treetop 中是否已经有一些现有的方式可以说“嘿,在这里查找 Ruby 代码,并给我它的故障”,而无需我编写单独的规则来处理Ruby 语言的所有部分?我正在寻找一种方法,在我的.treetop语法文件中,有类似的东西:

rule erb_tag
  "<%" ruby_code "%>" {
    def content
      ...
    end
  }
end

ruby_codeTreetop 提供的一些规则在哪里处理。

编辑: 其他人使用 Ruby-lex 解析了 ERB,但我在尝试重现他所做的事情时遇到了错误。rlex 程序在生成解析器类时没有生成完整的类。

编辑:对,所以你很沮丧,但感谢您提供的信息。:) 对于我的硕士项目,我正在编写一个需要使用 ERB 作为输入的测试用例生成器。幸运的是,就我的目的而言,我只需要识别 ERB 代码中的一些内容,例如if语句和其他条件以及循环。我想我可以提出 Treetop 语法来匹配它,但需要注意的是它对于 Ruby 来说并不完整。

4

4 回答 4

11

据我所知,还没有人为 Ruby 创建过 Treetop 语法。(事实上​​,除了 MRI 和 YARV 附带的 YACC 语法之外,没有人能够为 Ruby 创建任何语法。)我知道 Treetop 的作者已经研究了几年,但这并不是一件容易的事. 正确使用 XRuby 中使用的 ANTLR 语法花了大约 5 年时间,但仍然不完全兼容。

Ruby 的语法异常复杂,令人难以置信。

于 2010-10-29T20:41:44.200 回答
2


我不这么认为。在 treetop 中指定复杂而微妙的 Ruby 语法将是一项重大成就,但它应该是可能的。

实际的 ruby​​ 语法是用 yacc 编写的。现在,yacc 是一个传奇的工具,但是 treetop 生成了一个更强大的解析器类,所以它应该是可能的,也许有人已经做到了。

这不是一个下午的项目。

于 2010-10-29T18:43:47.593 回答
1

可能我在开玩笑,但如果 yacc 没有 ruby​​ 复杂,那么你可以在 treetop 中实现 yacc,而不是使用为 yacc 创建的 ruby​​ 语法。

于 2010-10-31T18:06:18.953 回答
0

出于您的目的,您可能无需解析所有 Ruby 即可逃脱。您真正需要的是一种检测关闭 Ruby 块的 %> 的方法。如果您不想在 Ruby 代码包含这些结束字符时失败,您必须检测这些字符在 Ruby 文本中可能出现的任何位置;这意味着您需要检测所有形式的文字。

但是,出于您的目的,您可能会发现 %> 最可能出现在 Ruby 文本中的情况,而忽略这些情况。当然,这假设任何剩余的故障都可以通过让您的用户稍微不同地编写 ERB 来处理。

值得一提的是,Treetop 本身以这种方式“解析”了 Ruby 块;它只计算 { 和 } 字符,直到找到结束字符。因此,如果您的块在文字字符串中包含一个 },那么您就坏了(但您可以通过在注释中包含匹配的块来解决问题)。

于 2015-05-06T02:50:53.297 回答