Project

General

Profile

Actions

Bug #4543

closed

Ripperで"<<-eos\neos"を正常にパースできない

Added by exkazuu (Kazunori SAKAMOTO) over 13 years ago. Updated over 13 years ago.

Status:
Closed
Target version:
ruby -v:
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]
Backport:
[ruby-dev:<unknown>]

Description

=begin
Ripper::SexpBuilder.new(%Q!<<-eos\neos!).parse
にて、on_heredoc_end メソッドが呼び出されません。

■検証済みバージョン
ruby 1.9.3dev (2011-03-31 trunk 31223) [i686-linux]
ruby 1.9.2p180 (2011-02-18 revision 30909) [i686-linux]
ruby 1.9.1p431 (2011-02-18 revision 30908) [i686-linux]

■検証用スクリプト
require 'ripper'

class Parser < Ripper::SexpBuilder
ms = Ripper::SexpBuilder.new('').methods
defs = ms.map { |s| s.to_s }
.select { |s| s.start_with?('on_') }
.map { |s| %Q{
def #{s}(*args)
print '#{s}: '
p args
end
}}.join
eval(defs)
end

def parse(src)
puts "" + src.inspect + ""
Parser.new(src).parse
puts
end

parse(%Q!<<-eos\neos!)
parse(%Q!<<-eos\n\neos!)

■実行結果
"<<-eos\neos"
on_heredoc_beg: ["<<-eos"]
on_string_content: []
on_string_literal: [[]]
on_nl: ["\n"]
on_stmts_new: []
on_stmts_add: [[], [[]]]
on_program: [[[], [[]]]]

"<<-eos\n\neos"
on_heredoc_beg: ["<<-eos"]
on_string_content: []
on_tstring_content: ["\n"]
on_heredoc_end: ["eos"]
on_string_add: [[], ["\n"]]
on_string_literal: [[[], ["\n"]]]
on_nl: ["\n"]
on_stmts_new: []
on_stmts_add: [[], [[[], ["\n"]]]]
on_program: [[[], [[[], ["\n"]]]]]
=end

Actions #1

Updated by exkazuu (Kazunori SAKAMOTO) over 13 years ago

=begin
----"<<-eos\neos"----
on_heredoc_beg: ["<<-eos"]
on_string_content: []
on_string_literal: [[]]
on_nl: ["\n"]
on_stmts_new: []
on_stmts_add: [[], [[]]]
on_program: [[[], [[]]]]

----"<<-eos\n\neos----
on_heredoc_beg: ["<<-eos"]
on_string_content: []
on_tstring_content: ["\n"]
on_heredoc_end: ["eos"]
on_string_add: [[], ["\n"]]
on_string_literal: [[[], ["\n"]]]
on_nl: ["\n"]
on_stmts_new: []
on_stmts_add: [[], [[[], ["\n"]]]]
on_program: [[[], [[[], ["\n"]]]]]

=end

Actions #2

Updated by exkazuu (Kazunori SAKAMOTO) over 13 years ago

=begin
require 'ripper'

class Parser < Ripper::SexpBuilder
ms = Ripper::SexpBuilder.new('').methods
defs = ms.map { |s| s.to_s }
.select { |s| s.start_with?('on_') }
.map { |s| %Q{
def #{s}(*args)
print '#{s}: '
p args
end
}}.join
eval(defs)
end

def parse(src)
puts "" + src.inspect + ""
Parser.new(src).parse
puts
end

parse(%Q!<<-eos\neos!)
parse(%Q!<<-eos\n\neos!)

すいません、整形したものを貼り直します。
=end

Updated by ko1 (Koichi Sasada) over 13 years ago

  • Category set to ext
  • Status changed from Open to Assigned
  • Assignee set to nobu (Nobuyoshi Nakada)

Updated by nahi (Hiroshi Nakamura) over 13 years ago

  • Target version set to 1.9.3

Updated by nobu (Nobuyoshi Nakada) over 13 years ago

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

r32412で修正しました。

Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0