识别Treetop语法中的Ruby代码

时间:2010-10-29 18:28:05

标签: ruby parsing grammar erb treetop

我正在尝试使用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程序没有生成完整的类。

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

4 个答案:

答案 0 :(得分:11)

据我所知,还没有人为Ruby创建Treetop语法。 (事实上​​,除了MRI和YARV附带的YACC语法之外,没有人能够为Ruby创建任何语法。)我知道Treetop的作者已经开发了几年的语法,但这不是一项微不足道的事。获得XRuby中使用的ANTLR语法大约花了5年时间,但仍然不完全符合。

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

答案 1 :(得分:2)


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

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

这不是一个下午的项目。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

出于您的目的,您可以在不解析所有Ruby的情况下离开。你真正需要的是一种检测%&gt;的方法。关闭Ruby块。如果你不想在Ruby代码包含那些结束字符时失败,你必须检测Ruby文本中可能出现的任何字符;这意味着你需要检测所有形式的文字。

然而,出于您的目的,您可能会认识到最有可能出现%&gt;的情况。将发生在Ruby文本中,并忽略这些情况。当然,这可以通过让用户以不同的方式编写ERB来处理任何剩余的故障。

对于它的价值,Treetop本身以这种方式“解析”Ruby块;它只计算{和}字符,直到找到结束的字符。因此,如果您的块在文字字符串中包含一个},那么您就会被破坏(但您可以通过在评论中包含匹配的一个来解决)。