Intcode assembler: allow data label values to be expressions
This commit is contained in:
parent
a096774fa8
commit
431af67bb1
|
@ -63,7 +63,7 @@ defmodule Day5 do
|
||||||
])
|
])
|
||||||
end
|
end
|
||||||
|
|
||||||
def run_cli(memory) do
|
def run_cli(memory, opts \\ []) do
|
||||||
parent = self()
|
parent = self()
|
||||||
|
|
||||||
proc =
|
proc =
|
||||||
|
@ -71,23 +71,33 @@ defmodule Day5 do
|
||||||
run(memory, parent)
|
run(memory, parent)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
Process.monitor(proc)
|
handle_cli_messages(proc, opts)
|
||||||
handle_cli_messages(proc)
|
|
||||||
end
|
end
|
||||||
|
|
||||||
def handle_cli_messages(proc) do
|
def handle_cli_messages(proc, opts) do
|
||||||
receive do
|
receive do
|
||||||
{:DOWN, _, _, _, _} ->
|
{:halt, _, memory} ->
|
||||||
IO.puts("Exited")
|
if Keyword.get(opts, :memory, false) do
|
||||||
|
memory
|
||||||
|
else
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
|
{:ok, _, memory} ->
|
||||||
|
if Keyword.get(opts, :memory, false) do
|
||||||
|
memory
|
||||||
|
else
|
||||||
|
:ok
|
||||||
|
end
|
||||||
|
|
||||||
{:in, _} ->
|
{:in, _} ->
|
||||||
res = IO.gets("intcode> ") |> String.trim() |> String.to_integer()
|
res = IO.gets("intcode> ") |> String.trim() |> String.to_integer()
|
||||||
send(proc, {:in, res})
|
send(proc, {:in, res})
|
||||||
handle_cli_messages(proc)
|
handle_cli_messages(proc, opts)
|
||||||
|
|
||||||
{:out, _, out} ->
|
{:out, _, out} ->
|
||||||
IO.puts("Output: #{out}")
|
IO.puts("Output: #{out}")
|
||||||
handle_cli_messages(proc)
|
handle_cli_messages(proc, opts)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -18,20 +18,15 @@ defmodule Assembler do
|
||||||
|> ignore(ascii_char([?:]))
|
|> ignore(ascii_char([?:]))
|
||||||
|> ignore(repeat(ascii_char([?\s])))
|
|> ignore(repeat(ascii_char([?\s])))
|
||||||
|
|
||||||
data_label =
|
|
||||||
label
|
|
||||||
|> choice([
|
|
||||||
integer(min: 1),
|
|
||||||
ignore(ascii_char([?-]))
|
|
||||||
|> integer(min: 1)
|
|
||||||
|> tag(:neg)
|
|
||||||
])
|
|
||||||
|> tag(:data_label)
|
|
||||||
|
|
||||||
param =
|
param =
|
||||||
optional(ignore(ascii_string([?\s], min: 1)))
|
optional(ignore(ascii_string([?\s], min: 1)))
|
||||||
|> ascii_string([{:not, ?,}], min: 1)
|
|> ascii_string([{:not, ?,}], min: 1)
|
||||||
|
|
||||||
|
data_label =
|
||||||
|
label
|
||||||
|
|> concat(param)
|
||||||
|
|> tag(:data_label)
|
||||||
|
|
||||||
instruction =
|
instruction =
|
||||||
ignore(ascii_string([?\s, ?\t], min: 0))
|
ignore(ascii_string([?\s, ?\t], min: 0))
|
||||||
|> ascii_string([?a..?z], min: 1)
|
|> ascii_string([?a..?z], min: 1)
|
||||||
|
@ -63,7 +58,13 @@ defmodule Assembler do
|
||||||
|> Enum.with_index()
|
|> Enum.with_index()
|
||||||
|> Enum.map(fn
|
|> Enum.map(fn
|
||||||
{{:expr, expr}, index} ->
|
{{:expr, expr}, index} ->
|
||||||
expr_tokens = if is_binary(expr), do: ExpressionEvaluator.parse(expr), else: expr
|
expr_tokens =
|
||||||
|
if is_binary(expr) do
|
||||||
|
{:ok, tokens, _, _, _, _} = ExpressionEvaluator.parse(expr)
|
||||||
|
tokens
|
||||||
|
else
|
||||||
|
expr
|
||||||
|
end
|
||||||
|
|
||||||
ExpressionEvaluator.do_eval(expr_tokens, fn
|
ExpressionEvaluator.do_eval(expr_tokens, fn
|
||||||
"_self" -> index
|
"_self" -> index
|
||||||
|
@ -134,11 +135,7 @@ defmodule Assembler do
|
||||||
end
|
end
|
||||||
|
|
||||||
def assemble_line([data_label: [name, value]], {memory, labels}) do
|
def assemble_line([data_label: [name, value]], {memory, labels}) do
|
||||||
value =
|
value = {:expr, value}
|
||||||
case value do
|
|
||||||
{:neg, [val]} -> -val
|
|
||||||
val when is_integer(val) -> val
|
|
||||||
end
|
|
||||||
|
|
||||||
{
|
{
|
||||||
[value | memory],
|
[value | memory],
|
||||||
|
@ -197,6 +194,15 @@ defmodule Assembler do
|
||||||
[99 | memory]
|
[99 | memory]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def assemble_insn(["data" | data], memory) do
|
||||||
|
data =
|
||||||
|
data
|
||||||
|
|> Enum.map(&String.to_integer/1)
|
||||||
|
|> Enum.reverse()
|
||||||
|
|
||||||
|
data ++ memory
|
||||||
|
end
|
||||||
|
|
||||||
# macros
|
# macros
|
||||||
assemble_macro ["mov", src, dest],
|
assemble_macro ["mov", src, dest],
|
||||||
"""
|
"""
|
||||||
|
|
Loading…
Reference in New Issue