Actions
Bug #10405
closedsyntax error inconsistency between ruby -c and ripper
    Bug #10405:
    syntax error inconsistency between ruby -c and ripper
  
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]
これは変な気がするんですがどうでしょうか。
        
           Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          Updated by nobu (Nobuyoshi Nakada) about 11 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) about 11 years ago
          Updated by akr (Akira Tanaka) about 11 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) about 11 years ago
          Updated by nobu (Nobuyoshi Nakada) about 11 years ago
          
          
        
        
      
      それはendの後ろがないからですね。
何かあればそれの結果が返されます。
$ ruby -rripper -e 'p Ripper.sexp("end\n1")'
[:program, [:@int, "1", [2, 0]]]
        
           Updated by akr (Akira Tanaka) about 11 years ago
          Updated by akr (Akira Tanaka) about 11 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) about 11 years ago
          Updated by nobu (Nobuyoshi Nakada) about 11 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]
Actions