我正试着自学Ruby的Treetop语法生成器。我发现,不仅“最好”的文档少得可怜,而且它似乎没有像我希望的那样直观地工作。
在更高的层面上,我真的很喜欢比现场文档或视频更好的教程,如果有的话。
在较低的层次上,这是一种我根本无法使用的语法:
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()方法:
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这对于存在的文档没有任何意义,但只要删除多余的圆括号,匹配就会包括Integer1类和Integer0。Integer1显然是包含eval()方法的类。我不知道为什么会这样。
我还在寻找更多关于treetop的信息。
发布于 2009-02-10 16:00:38
不幸的是,Treetop的文档很糟糕。很多。网站上的例子也没有什么帮助。我发现dzone有一个相当大的树顶语法集合:
Treetop grammars
发布于 2009-12-30 12:01:33
您可能会欣赏Paul Battley在Getting started with Treetop的漂亮而简单的教程
从最简单的语法开始,他展示了如何创建解析器,然后通过几次迭代添加了一些功能。这就足够让我走出起跑线了。
发布于 2010-03-22 16:38:54
Roland Swingler向LRUG:http://skillsmatter.com/podcast/ajax-ria/treetop做了一个关于Treetop的演示,我发现这对入门很有用。
https://stackoverflow.com/questions/520818
复制相似问题