识别Treetop语法中的Ruby代码

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

  

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

 rule erb_tag "" { def content ... end } end 

其中ruby_code由Treetop提供的某些规则处理。

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

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

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

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

没有


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

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

这不是一个下午的项目。

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

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

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

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