0

パーサーがトークンを認識するたびに、いくつかのコードを実行しようとしています。

まあ言ってみれば

grammar FooBar

  rule start
    (foo "\n")+
  end

  rule foo
    stuff_i_want:([a-z]+) {
       puts "Hi there I found: #{stuff_i_want.text_value}"
     }
  end

end

ここでのアイデアは、トークンが見つかるputsたびにこのアクションを実行することです。fooそのままコーディングすると、(クラスのロード時に) 1 回だけトリガーされ、もちろんその時点でstuff_i_want.text_valueは存在しないため、機能しません。

何か案が?それは可能ですか?ライブラリに関するドキュメントがないため、簡単にはわかりません。

4

2 に答える 2

0

まあ、反対票に値するために何をしたのかわかりません。

とにかく、ここに私が使用した解決策があります:

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
于 2013-08-09T01:52:49.320 に答える