diff options
Diffstat (limited to 'lib/elixir/src')
-rw-r--r-- | lib/elixir/src/elixir_parser.yrl | 19 | ||||
-rw-r--r-- | lib/elixir/src/elixir_tokenizer.erl | 16 |
2 files changed, 21 insertions, 14 deletions
diff --git a/lib/elixir/src/elixir_parser.yrl b/lib/elixir/src/elixir_parser.yrl index 151668299..9aa7b9d5f 100644 --- a/lib/elixir/src/elixir_parser.yrl +++ b/lib/elixir/src/elixir_parser.yrl @@ -40,7 +40,7 @@ Terminals capture_op rel_op 'true' 'false' 'nil' 'do' eol ';' ',' '.' '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%' - binary octal decimal float hex + base_integer decimal float . Rootsymbol grammar. @@ -237,7 +237,7 @@ no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil). %% marks identifiers followed by brackets as bracket_identifier. access_expr -> bracket_at_expr : '$1'. access_expr -> bracket_expr : '$1'. -access_expr -> capture_op_eol decimal : build_unary_op('$1', ?exprs('$2')). +access_expr -> capture_op_eol decimal : build_unary_op('$1', parse_integer_literal(?exprs('$2'))). access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')). access_expr -> open_paren stab close_paren : build_stab(reverse('$2')). access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')). @@ -262,10 +262,8 @@ access_expr -> max_expr : '$1'. %% Augment integer literals with representation format if wrap_literals_in_blocks option is true number -> char : handle_literal(?exprs('$1'), '$1', [{format, char}]). -number -> binary : handle_literal(?exprs('$1'), '$1', [{format, binary}]). -number -> octal : handle_literal(?exprs('$1'), '$1', [{format, octal}]). -number -> decimal : handle_literal(?exprs('$1'), '$1', [{format, decimal}]). -number -> hex : handle_literal(?exprs('$1'), '$1', [{format, hex}]). +number -> decimal : handle_literal(parse_integer_literal(?exprs('$1')), '$1', [{original, ?exprs('$1')}]). +number -> base_integer : handle_literal(parse_integer_literal(?exprs('$1')), '$1', [{original, ?exprs('$1')}]). number -> float : handle_literal(?exprs('$1'), '$1'). %% Aliases and properly formed calls. Used by map_expr. @@ -637,6 +635,15 @@ handle_literal(Literal, Token, ExtraMeta) -> false -> Literal end. +parse_integer_literal([$0, $x | Rest]) -> + list_to_integer(Rest, 16); +parse_integer_literal([$0, $o | Rest]) -> + list_to_integer(Rest, 8); +parse_integer_literal([$0, $b | Rest]) -> + list_to_integer(Rest, 2); +parse_integer_literal(Decimal) -> + list_to_integer(Decimal, 10). + %% Operators build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) -> diff --git a/lib/elixir/src/elixir_tokenizer.erl b/lib/elixir/src/elixir_tokenizer.erl index 99f42836e..4f7c90ff2 100644 --- a/lib/elixir/src/elixir_tokenizer.erl +++ b/lib/elixir/src/elixir_tokenizer.erl @@ -166,15 +166,15 @@ tokenize(("<<<<<<<" ++ _) = Original, Line, 1, _Scope, Tokens) -> tokenize([$0, $x, H | T], Line, Column, Scope, Tokens) when ?is_hex(H) -> {Rest, Number, Length} = tokenize_hex(T, [H], 1), - tokenize(Rest, Line, Column + 2 + Length, Scope, [{hex, {Line, Column, Column + 2 + Length}, Number} | Tokens]); + tokenize(Rest, Line, Column + 2 + Length, Scope, [{base_integer, {Line, Column, Column + 2 + Length}, Number} | Tokens]); tokenize([$0, $b, H | T], Line, Column, Scope, Tokens) when ?is_bin(H) -> {Rest, Number, Length} = tokenize_bin(T, [H], 1), - tokenize(Rest, Line, Column + 2 + Length, Scope, [{binary, {Line, Column, Column + 2 + Length}, Number} | Tokens]); + tokenize(Rest, Line, Column + 2 + Length, Scope, [{base_integer, {Line, Column, Column + 2 + Length}, Number} | Tokens]); tokenize([$0, $o, H | T], Line, Column, Scope, Tokens) when ?is_octal(H) -> {Rest, Number, Length} = tokenize_octal(T, [H], 1), - tokenize(Rest, Line, Column + 2 + Length, Scope, [{octal, {Line, Column, Column + 2 + Length}, Number} | Tokens]); + tokenize(Rest, Line, Column + 2 + Length, Scope, [{base_integer, {Line, Column, Column + 2 + Length}, Number} | Tokens]); % Comments @@ -420,7 +420,7 @@ tokenize([H | T], Line, Column, Scope, Tokens) when ?is_digit(H) -> case tokenize_number(T, [H], 1, false) of {error, Reason, Number} -> {error, {Line, Reason, Number}, T, Tokens}; - {Rest, Number, Length} when is_integer(Number) -> + {Rest, Number, Length} when is_list(Number) -> tokenize(Rest, Line, Column + Length, Scope, [{decimal, {Line, Column, Column + Length}, Number} | Tokens]); {Rest, Number, Length} -> tokenize(Rest, Line, Column + Length, Scope, [{float, {Line, Column, Column + Length}, Number} | Tokens]) @@ -831,28 +831,28 @@ tokenize_number(Rest, Acc, Length, true) -> %% Or integer. tokenize_number(Rest, Acc, Length, false) -> - {Rest, list_to_integer(lists:reverse(Acc)), Length}. + {Rest, lists:reverse(Acc), Length}. tokenize_hex([H | T], Acc, Length) when ?is_hex(H) -> tokenize_hex(T, [H | Acc], Length + 1); tokenize_hex([$_, H | T], Acc, Length) when ?is_hex(H) -> tokenize_hex(T, [H | Acc], Length + 2); tokenize_hex(Rest, Acc, Length) -> - {Rest, list_to_integer(lists:reverse(Acc), 16), Length}. + {Rest, [$0, $x | lists:reverse(Acc)], Length}. tokenize_octal([H | T], Acc, Length) when ?is_octal(H) -> tokenize_octal(T, [H | Acc], Length + 1); tokenize_octal([$_, H | T], Acc, Length) when ?is_octal(H) -> tokenize_octal(T, [H | Acc], Length + 2); tokenize_octal(Rest, Acc, Length) -> - {Rest, list_to_integer(lists:reverse(Acc), 8), Length}. + {Rest, [$0, $o | lists:reverse(Acc)], Length}. tokenize_bin([H | T], Acc, Length) when ?is_bin(H) -> tokenize_bin(T, [H | Acc], Length + 1); tokenize_bin([$_, H | T], Acc, Length) when ?is_bin(H) -> tokenize_bin(T, [H | Acc], Length + 2); tokenize_bin(Rest, Acc, Length) -> - {Rest, list_to_integer(lists:reverse(Acc), 2), Length}. + {Rest, [$0, $b | lists:reverse(Acc)], Length}. %% Comments |