题
我试图教我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命令生成),你可以清楚地看到这一点。