Project

General

Profile

Bug #10405

syntax error inconsistency between ruby -c and ripper

Added by akr (Akira Tanaka) over 4 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
-
Target version:
ruby -v:
ruby 2.2.0dev (2014-10-20 trunk 48052) [x86_64-linux]
[ruby-dev:48678]

Description

以下のように、a / b c という内容のファイルを
ruby -c で検査すると syntax error になるのですが
Ripper.sexp に適用するとなにか構文木が返ってきます。

% cat z.rb
a / b c
% ./ruby -c z.rb
z.rb:1: syntax error, unexpected tIDENTIFIER, expecting keyword_do or '{' or '('
zsh: exit 1     ./ruby -c z.rb
% ./ruby -rripper -e 'p Ripper.sexp(STDIN.read)' < z.rb
[:program, [:vcall, [:@ident, "c", [1, 6]]]]
% ./ruby -v
ruby 2.2.0dev (2014-10-20 trunk 48052) [x86_64-linux]

これは変な気がするんですがどうでしょうか。

Associated revisions

Revision d1ec43ae
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@48144 b2dd03c8-39d4-4d8f-98ff-823fe69b080e

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Revision 48144
Added by nobu (Nobuyoshi Nakada) over 4 years ago

parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

History

Updated by nobu (Nobuyoshi Nakada) over 4 years ago

  • Status changed from Open to Feedback
  • Target version set to 2.2.0
  • Category set to ext

on_parse_errorは発生しているんですが、デフォルトでは単に無視されるので、そこまでがなかったことにされています。
何を返すべきでしょうかねぇ。

Updated by akr (Akira Tanaka) over 4 years ago

nil だろうと思っていました。
たとえば、end だけだと nil になります。

% ./ruby -v -rripper -e 'p Ripper.sexp("end")'
ruby 2.2.0dev (2014-10-22 trunk 48083) [x86_64-linux]
nil

Updated by nobu (Nobuyoshi Nakada) over 4 years ago

それはendの後ろがないからですね。
何かあればそれの結果が返されます。

$ ruby -rripper -e 'p Ripper.sexp("end\n1")'
[:program, [:@int, "1", [2, 0]]]

Updated by akr (Akira Tanaka) over 4 years ago

なるほど。

でも、やはり nil がいいかなぁ、と思います。

ありうる挙動は、nil を返すか、例外を起こすかだと思うのですが、
いままで例外を起こしていなかったものについて例外を起こすようにするのは非互換ですし。

また、parse という処理にとって、syntax error は当然想定されるもので例外的ではない気がします。

なお、gem をちょっと探してみると、以下のように、syntax error のときに nil を返してくると想定している
と思われるコードはいくつかありました。
(例外を想定しているコードは見つかりません。)

phaad-0.0.3/lib/phaad/cli.rb-    def valid_expression?(lines)
phaad-0.0.3/lib/phaad/cli.rb:      !!Ripper.sexp(lines)
phaad-0.0.3/lib/phaad/cli.rb-    end

printrun-0.0.1/lib/printrun/core.rb:          Ripper.sexp_raw(buffer) ? (out << buffer) && "" : buffer

tailor-1.4.0/lib/tailor/lexer/token.rb:          sexp_line = Ripper.sexp(line_of_text)
tailor-1.4.0/lib/tailor/lexer/token.rb-
tailor-1.4.0/lib/tailor/lexer/token.rb-          if sexp_line.nil?

Updated by nobu (Nobuyoshi Nakada) over 4 years ago

  • Status changed from Feedback to Closed
  • % Done changed from 0 to 100

Applied in changeset r48144.


parse.y: Ripper.sexp returns error

  • ext/ripper/lib/ripper/sexp.rb (Ripper.sexp, Ripper.sexp_raw): return nil on error. [ruby-dev:48678] [Bug #10405]

Also available in: Atom PDF