@@ -85,6 +85,25 @@ def strterm_expand?(strterm)
8585 [ :dquote , :dsym , :dword , :heredoc , :xquote , :regexp ] . include? type
8686 end
8787
88+ def process_numeric
89+ @lex_state = :expr_end
90+ scanner = @scanner
91+
92+ if scanner . scan ( /0b?(0|1|_)+/ )
93+ return [ :tINTEGER , scanner . matched . to_i ( 2 ) ]
94+ elsif scanner . scan ( /0o?([0-7]|_)+/ )
95+ return [ :tINTEGER , scanner . matched . to_i ( 8 ) ]
96+ elsif scanner . scan ( /[\d _]+\. [\d _]+\b |[\d _]+(\. [\d _]+)?[eE][-+]?[\d _]+\b / )
97+ return [ :tFLOAT , scanner . matched . gsub ( /_/ , '' ) . to_f ]
98+ elsif scanner . scan ( /[\d _]+\b / )
99+ return [ :tINTEGER , scanner . matched . gsub ( /_/ , '' ) . to_i ]
100+ elsif scanner . scan ( /0(x|X)(\d |[a-f]|[A-F]|_)+/ )
101+ return [ :tINTEGER , scanner . matched . to_i ( 16 ) ]
102+ else
103+ raise "Lexing error on numeric type: `#{ scanner . peek 5 } `"
104+ end
105+ end
106+
88107 def next_string_token
89108 str_parse = self . strterm
90109 scanner = @scanner
@@ -1042,20 +1061,7 @@ def yylex
10421061 return result , scanner . matched
10431062
10441063 elsif scanner . check ( /[0-9]/ )
1045- @lex_state = :expr_end
1046- if scanner . scan ( /0b?(0|1|_)+/ )
1047- return [ :tINTEGER , scanner . matched . to_i ( 2 ) ]
1048- elsif scanner . scan ( /0o?([0-7]|_)+/ )
1049- return [ :tINTEGER , scanner . matched . to_i ( 8 ) ]
1050- elsif scanner . scan ( /[\d _]+\. [\d _]+\b |[\d _]+(\. [\d _]+)?[eE][-+]?[\d _]+\b / )
1051- return [ :tFLOAT , scanner . matched . gsub ( /_/ , '' ) . to_f ]
1052- elsif scanner . scan ( /[\d _]+\b / )
1053- return [ :tINTEGER , scanner . matched . gsub ( /_/ , '' ) . to_i ]
1054- elsif scanner . scan ( /0(x|X)(\d |[a-f]|[A-F]|_)+/ )
1055- return [ :tINTEGER , scanner . matched . to_i ( 16 ) ]
1056- else
1057- raise "Lexing error on numeric type: `#{ scanner . peek 5 } `"
1058- end
1064+ return process_numeric
10591065
10601066 elsif scanner . scan ( /(\w )+[\? \! ]?/ )
10611067 return process_identifier scanner . matched , cmd_start
0 commit comments