diff options
Diffstat (limited to 'lib/elixir/src/elixir_parser.yrl')
-rw-r--r-- | lib/elixir/src/elixir_parser.yrl | 19 |
1 files changed, 13 insertions, 6 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) -> |