まあ、反対票に値するために何をしたのかわかりません。
とにかく、ここに私が使用した解決策があります:
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
オプションのパラメーターは、各メソッドに渡されます。サブツリーのクロールを停止するために、アクションでfalsey 値 (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