@@ -97,6 +97,15 @@ def strterm_expand?(strterm)
9797 [ :dquote , :dsym , :dword , :heredoc , :xquote , :regexp ] . include? type
9898 end
9999
100+ def new_strterm ( type , start , finish )
101+ { :type => type , :beg => start , :end => finish }
102+ end
103+
104+ def new_strterm2 ( type , start , finish )
105+ term = new_strterm ( type , start , finish )
106+ term . merge ( { :balance => true , :nesting => 0 } )
107+ end
108+
100109 def process_numeric
101110 @lex_state = :expr_end
102111 scanner = @scanner
@@ -375,7 +384,7 @@ def add_string_content(str_buffer, str_parse)
375384 def heredoc_identifier
376385 if @scanner . scan ( /(-?)['"]?(\w +)['"]?/ )
377386 heredoc = @scanner [ 2 ]
378- self . strterm = { :type => : heredoc, :beg => heredoc , :end => heredoc }
387+ self . strterm = new_strterm ( : heredoc, heredoc , heredoc )
379388
380389 # if ruby code at end of line after heredoc, we have to store it to
381390 # parse after heredoc is finished parsing
@@ -641,15 +650,15 @@ def yylex
641650 return :tEQL , '='
642651
643652 elsif scan ( /\" / )
644- self . strterm = { :type => : dquote, :beg => '"' , :end => '"' }
653+ self . strterm = new_strterm ( : dquote, '"' , '"' )
645654 return :tSTRING_BEG , scanner . matched
646655
647656 elsif scan ( /\' / )
648- self . strterm = { :type => : squote, :beg => "'" , :end => "'" }
657+ self . strterm = new_strterm ( : squote, "'" , "'" )
649658 return :tSTRING_BEG , scanner . matched
650659
651660 elsif scan ( /\` / )
652- self . strterm = { :type => : xquote, :beg => "`" , :end => "`" }
661+ self . strterm = new_strterm ( : xquote, '`' , '`' )
653662 return :tXSTRING_BEG , scanner . matched
654663
655664 elsif scan ( /\& / )
@@ -709,30 +718,30 @@ def yylex
709718
710719 case str_type
711720 when 'Q'
712- self . strterm = { :type => : dquote, :beg => paren , :end => term , :balance => true , :nesting => 0 }
721+ self . strterm = new_strterm2 ( : dquote, paren , term )
713722 return :tSTRING_BEG , scanner . matched
714723 when 'q'
715- self . strterm = { :type => : squote, :beg => paren , :end => term , :balance => true , :nesting => 0 }
724+ self . strterm = new_strterm2 ( : squote, paren , term )
716725 return :tSTRING_BEG , scanner . matched
717726 when 'W'
718- self . strterm = { :type => : dword, :beg => 'W' , :end => term }
727+ self . strterm = new_strterm ( : dword, 'W' , term )
719728 scan ( /\s */ )
720729 return :tWORDS_BEG , scanner . matched
721730 when 'w' , 'i'
722- self . strterm = { :type => : sword, :beg => 'W' , :end => term }
731+ self . strterm = new_strterm ( : sword, 'W' , term )
723732 scan ( /\s */ )
724733 return :tAWORDS_BEG , scanner . matched
725734 when 'x'
726- self . strterm = { :type => : xquote, :beg => paren , :end => term , :balance => true , :nesting => 0 }
735+ self . strterm = new_strterm2 ( : xquote, paren , term )
727736 return :tXSTRING_BEG , scanner . matched
728737 when 'r'
729- self . strterm = { :type => : regexp, :beg => paren , :end => term , :balance => true , :nesting => 0 }
738+ self . strterm = new_strterm2 ( : regexp, paren , term )
730739 return :tREGEXP_BEG , scanner . matched
731740 end
732741
733742 elsif scan ( /\/ / )
734743 if [ :expr_beg , :expr_mid ] . include? @lex_state
735- self . strterm = { :type => : regexp, :beg => '/' , :end => '/' }
744+ self . strterm = new_strterm ( : regexp, '/' , '/' )
736745 return :tREGEXP_BEG , scanner . matched
737746 elsif scan ( /\= / )
738747 @lex_state = :expr_beg
@@ -741,7 +750,7 @@ def yylex
741750 @lex_state = :expr_arg
742751 elsif @lex_state == :expr_cmdarg || @lex_state == :expr_arg
743752 if !check ( /\s / ) && @space_seen
744- self . strterm = { :type => : regexp, :beg => '/' , :end => '/' }
753+ self . strterm = new_strterm ( : regexp, '/' , '/' )
745754 return :tREGEXP_BEG , scanner . matched
746755 end
747756 else
@@ -758,7 +767,7 @@ def yylex
758767 if @lex_state == :expr_beg or ( @lex_state == :expr_arg && @space_seen )
759768 start_word = scan ( /./ )
760769 end_word = { '(' => ')' , '[' => ']' , '{' => '}' } [ start_word ] || start_word
761- self . strterm = { :type => : dquote, :beg => start_word , :end => end_word , :balance => true , :nesting => 0 }
770+ self . strterm = new_strterm2 ( : dquote, start_word , end_word )
762771 return :tSTRING_BEG , scanner . matched
763772 end
764773 end
@@ -870,9 +879,9 @@ def yylex
870879 end
871880
872881 if scan ( /\' / )
873- self . strterm = { :type => : ssym, :beg => "'" , :end => "'" }
882+ self . strterm = new_strterm ( : ssym, "'" , "'" )
874883 elsif scan ( /\" / )
875- self . strterm = { :type => : dsym, :beg => '"' , :end => '"' }
884+ self . strterm = new_strterm ( : dsym, '"' , '"' )
876885 end
877886
878887 @lex_state = :expr_fname
0 commit comments