Prismパーサー用のRubyエンコーディング

概要

このプログラム (input.rb) の Ruby プリズム AST を検査しようとしています。

x = 8 + 55 * 14
# this is a comment ...
puts ">> the value is #{x}"

これを試してみると、エンコードが間違っているようです。

require "prism"
puts Prism.dump_file('input.rb')

次のような意味不明な内容がわかります。

$ ruby main.rb
PRISMUTF-8(D�wC�C`
                 RR
--�...0>>�@^@AB
               (

解決策

あなたが望むのは、dump_fileの代わりにPrism.parse_fileを呼び出すことだと思います。

私の知る限り、dump_file の結果は内部独自の表現であり、印刷用ではありません。 parse_file は構文ツリーを提供します。これが探しているものであると思います。

>> Prism.parse_file('input.rb')

#<Prism::ParseResult:0x00007f01d00bbd18
 @comments=
  [#<Prism::InlineComment @location=#<Prism::Location @start_offset=16 @length=23 start_line=2>>],
 @data_loc=nil,
 @errors=[],
 @magic_comments=[],
 @source=
  #<Prism::Source:0x00007f01d014fec8
   @offsets=[0, 16, 40, 68],
   @source="x = 8 + 55 * 14\n# this is a comment ...\nputs \">> the value is \#{x}\"\n",
   @start_line=1>,
 @value=
  @ ProgramNode (location: (1,0)-(3,27))
  ├── locals: [:x]
  └── statements:
      @ StatementsNode (location: (1,0)-(3,27))
      └── body: (length: 2)
          ├── @ LocalVariableWriteNode (location: (1,0)-(1,15))
          │   ├── name: :x
          │   ├── depth: 0
          │   ├── name_loc: (1,0)-(1,1) = "x"
          │   ├── value:
          │   │   @ CallNode (location: (1,4)-(1,15))
          │   │   ├── flags: ∅
          │   │   ├── receiver:
          │   │   │   @ IntegerNode (location: (1,4)-(1,5))
          │   │   │   └── flags: decimal
          │   │   ├── call_operator_loc: ∅
          │   │   ├── name: :+
          │   │   ├── message_loc: (1,6)-(1,7) = "+"
          │   │   ├── opening_loc: ∅
          │   │   ├── arguments:
          │   │   │   @ ArgumentsNode (location: (1,8)-(1,15))
          │   │   │   ├── flags: ∅
          │   │   │   └── arguments: (length: 1)
          │   │   │       └── @ CallNode (location: (1,8)-(1,15))
          │   │   │           ├── flags: ∅

   ....