好吧,我不确定我做了什么才值得被否决。
无论如何,这是我使用的解决方案:
node_extension.rb
module Crawlable
def crawl *args
continue = true
continue = action(*args) if respond_to? :action
return if !continue || elements.nil?
elements.each do |elt|
elt.crawl(*args)
end
end
end
# reopen the SyntaxNode class and include the module to add the functionality
class Treetop::Runtime::SyntaxNode
include Crawlable
end
然后剩下的就是action(*args)
在要触发效果的每个节点上定义一个方法,并且必须在顶部解析器节点(解析调用返回的那个节点)上开始爬行
parse_tree = FooBarParser.new.parse "mycontent"
parse_tree.crawl # add optional parameters for context/state
可选参数被传递给每个action
方法。您还可以在操作中返回虚假值(false
或nil
)以停止子树爬行。
grammar FooBar
rule start
(foo "\n")+
end
rule foo
stuff_i_want:([a-z]+) {
def action
puts "Hi there I found: #{stuff_i_want.text_value}"
false
end
}
end
end