diff --git a/erlang/apps/as/src/assemble.erl b/erlang/apps/as/src/assemble.erl index 3ca7454..110b95a 100644 --- a/erlang/apps/as/src/assemble.erl +++ b/erlang/apps/as/src/assemble.erl @@ -162,10 +162,10 @@ exprs_values([Expr | Exprs], Tunit, Acc) -> expr_value(Expr, Tunit) -> case Expr of - #e_integer{value = Value} -> {ok, Value}; - #e_symbol{name = Name} -> + #expr{symbol = false, offset = Value} -> {ok, Value}; + #expr{symbol = Name, offset = Offset} -> case tunit:get_symbol(Tunit, Name) of - #symbol{st_value = Value} when Value =/= false -> {ok, Value}; + #symbol{st_value = Value} when Value =/= false -> {ok, Value + Offset}; _ -> {error, {?MODULE, {undefined_symbol, Name}}} end end. diff --git a/erlang/apps/as/src/input.erl b/erlang/apps/as/src/input.erl index 8fbf0da..11943a2 100644 --- a/erlang/apps/as/src/input.erl +++ b/erlang/apps/as/src/input.erl @@ -625,7 +625,7 @@ insn_fixup(Tunit, Insn) -> expr_fixup(Tunit, Expr) -> case Expr of - #e_local_label{number = Number, direction = Direction} -> + #expr{symbol = {Number, Direction}} -> LabelSerial = local_label_serial(Tunit, Number), ReferenceSerial = case Direction of @@ -633,7 +633,7 @@ expr_fixup(Tunit, Expr) -> $f -> LabelSerial + 1 end, Name = local_label_name(Number, ReferenceSerial), - #e_symbol{name = Name}; + Expr#expr{symbol = Name}; _ -> Expr end. diff --git a/erlang/apps/as/src/parse.erl b/erlang/apps/as/src/parse.erl index 3305aac..c618c77 100644 --- a/erlang/apps/as/src/parse.erl +++ b/erlang/apps/as/src/parse.erl @@ -656,10 +656,9 @@ do_expr(First) -> badtok("invalid start of expr", First) end. -mk_integer_expr(Value) -> #e_integer{value = Value}. -mk_local_label_expr(Number, Direction) -> - #e_local_label{number = Number, direction = Direction}. -mk_symbol_expr(Symbol) -> #e_symbol{name = Symbol}. +mk_integer_expr(Value) -> #expr{symbol = false, offset = Value}. +mk_local_label_expr(Number, Direction) -> mk_symbol_expr({Number, Direction}). +mk_symbol_expr(Symbol) -> #expr{symbol = Symbol, offset = 0}. %% String Lists ---------------------------------------------------------------- diff --git a/erlang/apps/as/src/tunit.hrl b/erlang/apps/as/src/tunit.hrl index 85cfa35..502c6d9 100644 --- a/erlang/apps/as/src/tunit.hrl +++ b/erlang/apps/as/src/tunit.hrl @@ -23,14 +23,11 @@ %% An expression occurring in a statement. (TODO: extend) --record(e_integer, {value :: integer()}). --record(e_local_label, {number :: non_neg_integer(), direction :: $b | $f}). --record(e_symbol, {name :: string()}). - --type expr() :: #e_integer{} - | #e_local_label{} - | #e_symbol{} - . +-record(expr, + { symbol :: false | string() | {non_neg_integer(), $b | $f} + , offset :: integer() + }). +-type expr() :: #expr{}. %% A directive, label, or instruction is parsed to a statement, which is %% either interpreted immediately or appended to the representation of the