【问题标题】:recognize Ruby code in Treetop grammar识别 Treetop 语法中的 Ruby 代码
【发布时间】:2011-05-02 13:41:29
【问题描述】:

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

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

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

【问题讨论】:

    标签: ruby parsing grammar erb treetop


    【解决方案1】:

    没有


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

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

    这不是下午的项目。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • “Ruby 的语法异常复杂,令人难以置信。”我目前正在阅读 Ruby 编程语言,我只能说“阿门”。
      • 非常适合受 Perl 启发的语言。
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 2022-06-10
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2022-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多