首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >学习Treetop

学习Treetop
EN

Stack Overflow用户
提问于 2009-02-06 15:51:45
回答 8查看 11K关注 0票数 17

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

在更高的层面上,我真的很喜欢比现场文档或视频更好的教程,如果有的话。

在较低的层次上,这是一种我根本无法使用的语法:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
assert_equal @parser.parse('3.14').eval,3.14

工作正常,而

代码语言:javascript
复制
assert_equal @parser.parse('3').eval,3

引发错误: NoMethodError:私有方法` `eval‘调用#

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

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

浮动:

代码语言:javascript
复制
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()方法:

代码语言:javascript
复制
SyntaxNode+Integer0 offset=0, "3" (plain_digits):
  SyntaxNode offset=0, ""
  SyntaxNode+PlainDigits0 offset=0, "3":
    SyntaxNode offset=0, "3"
    SyntaxNode offset=1, ""

更新:

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

代码语言:javascript
复制
  rule integer
    ( '+' / '-' )? plain_digits
     {
      def eval
        text_value.to_i
      end
    }
  end

这对于存在的文档没有任何意义,但只要删除多余的圆括号,匹配就会包括Integer1类和Integer0。Integer1显然是包含eval()方法的类。我不知道为什么会这样。

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

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-02-10 16:00:38

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

Treetop grammars

票数 10
EN

Stack Overflow用户

发布于 2009-12-30 12:01:33

您可能会欣赏Paul Battley在Getting started with Treetop的漂亮而简单的教程

从最简单的语法开始,他展示了如何创建解析器,然后通过几次迭代添加了一些功能。这就足够让我走出起跑线了。

票数 17
EN

Stack Overflow用户

发布于 2010-03-22 16:38:54

Roland Swingler向LRUG:http://skillsmatter.com/podcast/ajax-ria/treetop做了一个关于Treetop的演示,我发现这对入门很有用。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/520818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档