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