Ruby 学习树梢

Ruby 学习树梢,ruby,parsing,grammar,treetop,Ruby,Parsing,Grammar,Treetop,我试着自学Ruby的树梢语法生成器。我发现,对于“最好”的文档来说,文档不仅少得可怜,而且它似乎不像我希望的那样直观地工作 从高层次上讲,我真的很喜欢一个比现场文档或视频更好的教程,如果有的话 在一个较低的层次上,我根本无法使用以下语法: grammar SimpleTest rule num (float / integer) end rule float ( (( '+' / '-')? plain_digits '.' plain_digits) /

我试着自学Ruby的树梢语法生成器。我发现,对于“最好”的文档来说,文档不仅少得可怜,而且它似乎不像我希望的那样直观地工作

从高层次上讲,我真的很喜欢一个比现场文档或视频更好的教程,如果有的话

在一个较低的层次上,我根本无法使用以下语法:

grammar SimpleTest

  rule num
    (float / integer)
  end

  rule float
   (
    (( '+' / '-')? plain_digits '.' plain_digits) /
    (( '+' / '-')? plain_digits ('E' / 'e') plain_digits ) /
    (( '+' / '-')? plain_digits '.') / 
    (( '+' / '-')? '.' plain_digits) 
   ) {
      def eval
        text_value.to_f
      end
   }
  end

  rule integer
    (( '+' / '-' )? plain_digits) {
      def eval
        text_value.to_i
      end
    }
  end

  rule plain_digits
    [0-9] [0-9]*      
  end

end
当我加载它并在一个非常简单的测试对象中运行一些断言时,我发现:

assert_equal @parser.parse('3.14').eval,3.14
很好,但是

assert_equal @parser.parse('3').eval,3
引发错误:NoMethodError:调用的私有方法“eval”#

如果我在描述中反转整数和浮点,则整数和浮点都会给出此错误。我认为这可能与有限的前瞻性有关,但我在任何文档中都找不到任何信息,甚至无法涵盖在“或”上下文中进行评估的想法

更多的信息可能会有所帮助。下面是这两个parse()块的pp信息

浮动汇率:

SyntaxNode+Float4+Float0 offset=0, "3.14" (eval,plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""
  SyntaxNode offset=1, "."
  SyntaxNode+PlainDigits0 offset=2, "14":
    SyntaxNode offset=2, "1"
    SyntaxNode offset=3, "4":
      SyntaxNode offset=3, "4"
整数。。。请注意,它似乎是按照整数规则定义的,但没有捕获eval()方法:

更新:

我的问题解决了,但我不知道为什么:

  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end
对于存在的文档来说,这没有任何意义,但只要删除额外的括号,匹配就包括Integer1类和Integer0。Integer1显然是持有eval()方法的类。我不知道为什么会这样


我仍在寻找更多关于treetop的信息。

遗憾的是,treetop的文档很糟糕。很多网站上的例子也没有什么帮助。我发现dzone有一个相当大的树梢语法集合:


我刚开始用树梢做实验

我试过换衣服

 rule num
      (float / integer)
 end


这似乎很管用。

你可能会欣赏保罗·巴特在


从一个最小语法开始,他展示了如何创建一个解析器,然后通过几次迭代添加了一点功能。这足以让我走出起跑区。

罗兰·斯温格勒向LRUG做了一个关于Treetop的演讲:
我发现这对入门很有用。

柑橘是treetop的一个更轻松的替代品:

treetop文档似乎假设您已经了解了相当多的解析表达式语法(PEG)。树梢完全基于木桩。peg比Treetop更大,也就是说,它们也用于其他解析库中。在学习树梢的过程中,我发现从总体上研究树桩是非常有帮助的。这有助于填补文档中的许多空白。

几年前,为了理解treetop的基础知识,我遵循了这一点


然后,它对我很有用,因为它解释了如何将语法树节点映射到ruby类实例。

这是一个bug。整数规则周围不必要的括号会导致额外模块的构造包含eval的定义,并且该模块不会与节点混合,因此“eval”不可用。如果将Ruby代码(使用tt命令生成)与带有和不带这些括号的版本进行比较,您可以清楚地看到这一点。

Thank;)我会想办法的祝你好运!也许你可以在完成后写一些文章/教程?不幸的是,由于某种原因,该页面被禁用。@地理链接似乎已断开。
 rule num
      (float / integer)
 end
 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end