1

SQL に似たクエリ言語を構築しています。コンマで区切られたアイテムのリストを処理できるようにしたいと考えています。私はこのコードでこれを成功裏に達成しました:

class QueryParser < Parslet::Parser
  rule(:space) { match('\s').repeat(1) }
  rule(:space?) { space.maybe }

  rule(:delimiter) { space? >> str(',') >> space? }

  rule(:select) { str('SELECT') >> space? }
  rule(:select_value) { str('*') | match('[a-zA-Z]').repeat(1) }
  rule(:select_arguments) do
    space? >>
    (select_value >> (delimiter >> select_value).repeat).maybe.as(:select) >>
    space?
  end

  rule(:from) { str('FROM') >> space? }
  rule(:from_arguments) { match('[a-zA-Z]').repeat(1).as(:from) >> space? }

  rule(:query) { select >> select_arguments >> from >> from_arguments }
  root(:query)
end

のようなものがツリーをSELECT id,name,fork FROM forks正しく出力する場所。{:select=>"id,name,fork"@7, :from=>"forks"@25}

SELECTさて、後でこれをいじる代わりに、引数 (id,name,forkこの場合) を配列に変換できるようにしたいと思います。実行することでこれを行うことができます'id,name,fork'.split ','。適用時にParsletトランスフォーマーにこれを実行させることができません。これは私のクエリトランスフォーマーのコードです:

class QueryTransformer < Parslet::Transform
  rule(select: simple(:args)) { args.split(',') }
end

次のように適用すると:

QueryTransformer.new.apply(
  QueryParser.new.parse('SELECT id,name,fork FROM forks')
)

結果は、適用しなかった場合と同じです: {:select=>"id,name,fork"@7, :from=>"forks"@25}.

私が望ん:selectでいた値は、このような配列["id","name","fork"]です。

私の質問は次:selectのとおりです。トランスフォーマーを使用して値を配列に分割するにはどうすればよいですか?

4

1 に答える 1