Skip to content

Latest commit

 

History

History
36 lines (26 loc) · 1.32 KB

ripper.md

File metadata and controls

36 lines (26 loc) · 1.32 KB

Ripper

To test the parser, we compare against the output from Ripper, both for testing the lexer and testing the parser. The lexer test suite is much more feature complete at the moment.

To lex source code using prism, you typically would run Prism.lex(source). If you want to instead get output that Ripper would normally produce, you can run Prism.lex_compat(source). This will produce tokens that should be equivalent to Ripper.

To parse source code using prism, you typically would run Prism.parse(source). If you want to instead using the Ripper streaming interface, you can inherit from Prism::RipperCompat and override the on_* methods. This will produce a syntax tree that should be equivalent to Ripper. That would look like:

class ArithmeticRipper < Prism::RipperCompat
  def on_binary(left, operator, right)
    left.public_send(operator, right)
  end

  def on_int(value)
    value.to_i
  end

  def on_program(stmts)
    stmts
  end

  def on_stmts_new
    []
  end

  def on_stmts_add(stmts, stmt)
    stmts << stmt
    stmts
  end
end

ArithmeticRipper.new("1 + 2 - 3").parse # => [0]

There are also APIs for building trees similar to the s-expression builders in Ripper. The method names are the same. These include Prism::RipperCompat.sexp_raw(source) and Prism::RipperCompat.sexp(source).