我试图教我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”要求#

如果我反向整数和浮在描述中,整数和浮点数给我这个错误。我想这可能与有限的前瞻,但我找不到任何文档的任何信息,甚至包括在评估的想法“或”上下文

更多的位信息,可以帮助。以下是这两个解析(第信息)块。

在浮动:

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()方法:

SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

更新

我得到了我的具体问题的工作,但我不知道为什么:

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

这使得与存在该文档没有任何意义,但只删除取得的匹配的额外的括号包括整数1类以及Integer0。整数1显然是类保持eval()方法。我不知道为什么是这样的情况。

我仍然在寻找有关树梢更多信息。

有帮助吗?

解决方案

不幸的是,树顶的文档吸收。很多。而网站上的例子也没有什么帮助。我发现,dzone有一个漂亮的大集合树梢语法:

树顶文法

其他提示

您可以欣赏保罗Battley的不错,简单的教程在 入门树顶

以最小的语法开始,他展示了如何创建一个解析器,然后通过几次迭代的增加只是一些功能。这只是足以让我离开起跑器的。

罗兰Swingler介绍了树顶呈现给LRUG: http://skillsmatter.com/podcast/ajax-ria/treetop 我发现入门有用的。

柑桔是轻得多到树梢替代: http://github.com/mjijackson/citrus

我跟着此树顶初级教程一个几年前,了解树梢的基础。

和然后快速介绍到写作与树顶解析器,对我很有用,因为它解释了如何映射语法树节点的Ruby类的实例。

我刚刚开始尝试树顶

我试图不断变化的

 rule num
      (float / integer)
 end

 rule num
      (float / integer)
      {
       def eval
            text_value.to_f
       end
      }
 end

和它似乎工作。

在树顶文档似乎假设你已经知道了相当数量的解析表达式语法的(PEG的)。树顶完全基于PEG的。 PEG是大于只是树梢虽然,即它们在其他解析库使用。在学习树顶,我发现它非常有用上晚自习一般的PEG。这有助于填写大量的文档中的空白。

这是一个错误。周围的整数规则的不必要的括号导致一个额外模块的建设,包含EVAL的定义,而这个模块不到节点获得混合,所以“的eval”不可用。如果你比较有和没有这些额外的括号版本的Ruby代码(使用TT命令生成),你可以清楚地看到这一点。

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