Skip to content

Commit 8bcb3ed

Browse files
committedNov 13, 2013
Tidy up numeric parsing and move logic into process_numeric method
1 parent b094d74 commit 8bcb3ed

File tree

1 file changed

+20
-14
lines changed

1 file changed

+20
-14
lines changed
 

‎lib/opal/parser/lexer.rb

+20-14
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)
Please sign in to comment.