3

現在、Ruby コードを解析し、コードを具体的な構文ツリーに変換できるフレームワークを探しています。

Rubyparserを調べてみましたが、これは私が興味を持っている方向ですが、代わりに抽象的な構文ツリーを提供しています。

もう 1 つのアプローチは、CST を構築するツール (Pelusa など) を分解することです。

何か提案はありますか?Ruby で書かなければならないので、オリジナルの Ruby パーサーは使えません。

4

1 に答える 1

3

あなたが何をしようとしているのか正確にはわかりませんが、Treetopを見てください。文法ファイルを定義し、Ruby で文法をパーサーにコンパイルします。これは PEG パーサーであるため、従来の LALR パーサーよりも操作が簡単です。

これは、Ruby のビットを解析する例です (もちろん、ニーズに合わせて文法を拡張する必要がありますが、Ruby は解析がかなり複雑なので難しいかもしれません)。

require 'treetop'
Treetop.load_from_string DATA.read

parser = TestParser.new

p parser.parse('def func
   6 + 5
end')

__END__
grammar Test
   rule function
      'def' space function_name function_body 'end'
   end
   rule function_name
      [A-Za-z]+
   end
   rule function_body
      space expression space
   end
   rule expression
      '6 + 5'
   end
   rule space
      [\t \n]+
   end
end

これを解析すると、AST が返されます。

SyntaxNode+Function0 offset=0, "...ef func\n   6 + 5\nend" (space,function_name,function_body):
  SyntaxNode offset=0, "def"
  SyntaxNode offset=3, " ":
    SyntaxNode offset=3, " "
  SyntaxNode offset=4, "func":
    SyntaxNode offset=4, "f"
    SyntaxNode offset=5, "u"
    SyntaxNode offset=6, "n"
    SyntaxNode offset=7, "c"
  SyntaxNode+FunctionBody0 offset=8, "\n   6 + 5\n" (space1,expression,space2):
    SyntaxNode offset=8, "\n   ":
      SyntaxNode offset=8, "\n"
      SyntaxNode offset=9, " "
      SyntaxNode offset=10, " "
      SyntaxNode offset=11, " "
    SyntaxNode offset=12, "6 + 5"
    SyntaxNode offset=17, "\n":
      SyntaxNode offset=17, "\n"
  SyntaxNode offset=18, "end"

また、ttコマンド ライン ツールを使用して、treetop 文法ファイルを Ruby コードにコンパイルすることもできます。

tt test.treetop -o test-treetop.rb
于 2012-10-09T14:43:58.167 に答える