我正在尝试使用 树顶 解析 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_code 由 Treetop 提供的一些规则处理。

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

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

有帮助吗?

解决方案

据我所知,还没有人为 Ruby 创建 Treetop 语法。(事实上​​,没有人能够创造出 任何 Ruby 的语法,而不是 MRI 和 YARV 附带的 YACC 语法。)我知道 Treetop 的作者多年来一直在研究一个语法,但这不是一项微不足道的工作。正确使用 XRuby 的 ANTLR 语法花了大约 5 年的时间,但它仍然不完全兼容。

Ruby 的语法是 疯狂地, ,复杂得令人难以置信。

其他提示


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

实际的红宝石语法被写入YACC。现在,YACC是一个传说中的工具,但树梢产生更强大的类解析器的,所以它应该是可能的,也许有人已经做到了。

这不是一个下午的项目。

可能是我在开玩笑,但如果YACC比红宝石那么复杂,那么你可以在比使用红宝石文法的yacc创建树梢实现YACC。

有关你的目的,你也许可以蒙混过关,而不解析所有的Ruby。你真正需要的是一种方法来检测%>封闭掉一个Ruby块。如果你再也不想失败时Ruby代码中包含那些收盘字符,你必须随时随地检测这些字符可以在拼音文字内发生;您需要的手段,以检测所有形式的文字的。

但是你的目的,你也许可以逃脱承认其中,%>会发生在拼音文字最有可能的情况下,而忽略只是这些情况。这是假设当然,任何剩余的故障可以通过获取用户写的ERB的方式有点不同处理的。

有关它的价值,树顶本身“解析”红宝石块这样;它只是计数{和}字符,直到收盘找到一个。所以,如果你的块包含}在一个文本字符串,你坏了(但你可以通过在评论中匹配一个解决)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top