build pretty printer

This commit is contained in:
Connor Rigby 2017-11-03 18:54:26 -07:00
parent 8aab2b0439
commit 57dff695e9
6 changed files with 88 additions and 5 deletions

12
compile_cs.exs Normal file
View file

@ -0,0 +1,12 @@
defmodule Compiler do
alias Farmbot.CeleryScript.AST
def compile(file) do
File.read!(file)
|> do_compile
end
defp do_compile(bin, acc) do
end
end
Compiler.compile("sequence.celery")

View file

@ -2,5 +2,5 @@ defmodule Farmbot.CeleryScript.AST.Arg.Location do
@moduledoc false
@behaviour Farmbot.CeleryScript.AST.Arg
def verify(val), do: {:ok, val}
def verify(val), do: Farmbot.CeleryScript.AST.decode(val)
end

View file

@ -106,7 +106,6 @@ defmodule Farmbot.CeleryScript.AST do
mod when is_atom(mod) ->
case decode_body(map[:body] || []) do
{:ok, body} ->
IO.puts mod
case mod.decode_args(args) do
{:ok, decoded} ->
opts = [kind: mod,

View file

@ -1,7 +1,5 @@
defimpl Inspect, for: Farmbot.CeleryScript.AST do
def inspect(ast, _opts) do
kind = Module.split(ast.kind) |> List.last
# body = Enum.map(ast.body, &inspect(&1)) |> inspect()
"#CeleryScript<#{kind}: #{inspect(Map.keys(ast.args))}, #{inspect ast.body}>"
"##{Module.split(ast.kind) |> List.last}<#{inspect Map.keys(ast.args)}>"
end
end

View file

@ -0,0 +1,46 @@
defmodule Farmbot.CeleryScript.AST.Pretty do
@moduledoc false
@default_indent 2
@default_offset 0
defp pretty(options) do
!!Map.get(options, :pretty)
end
defp indent(options) do
Map.get(options, :indent, @default_indent)
end
defp offset(options) do
Map.get(options, :offset, @default_offset)
end
defp offset(options, value) do
Map.put(options, :offset, value)
end
defp spaces(count) do
:binary.copy(" ", count)
end
def print(ast) do
IO.puts(format(ast, %{pretty: true}))
end
def format(ast, opts) do
format(ast, pretty(opts), opts)
end
def format(ast, true, opts) do
indent = indent(opts)
offset = if(indent == 0, do: offset(opts) + 2, else: offset(opts) + indent)
options = offset(opts, offset)
# args = Enum.map(ast.args, fn({k, v}) -> "#{k}=#{format(v, %{pretty: true})}" end) |> Enum.join(", ")
args = Enum.map(ast.args, fn({k, v}) -> "#{k}" end) |> Enum.join(", ")
body = if(ast.body == [], do: "[]", else: "\n#{Enum.map(ast.body, fn(sub_ast) -> format(sub_ast, options) end) |> Enum.join("#{spaces(offset)}\n")}\n")
do_ = if(ast.body == [], do: nil, else: "[")
end_ = if(ast.body == [], do: nil, else: "]")
"#{spaces(offset)}#{Module.split(ast.kind) |> List.last() |> Macro.underscore()}(#{args}) #{do_}#{body}#{spaces(offset)}#{end_}"
end
end

28
sequence.celery Normal file
View file

@ -0,0 +1,28 @@
sequence(is_outdated, version) [
sequence(is_outdated, version) [
sequence(is_outdated, version) [
move_absolute(location, offset, speed) []
move_relative(speed, x, y, z) []
write_pin(pin_mode, pin_number, pin_value) []
read_pin(label, pin_mode, pin_number) []
wait(milliseconds) []
send_message(message, message_type) []
if(_else, _then, lhs, op, rhs) []
execute(sequence_id) []
execute_script(label) []
take_photo() []
move_absolute(location, offset, speed) []
]
]
move_absolute(location, offset, speed) []
move_relative(speed, x, y, z) []
write_pin(pin_mode, pin_number, pin_value) []
read_pin(label, pin_mode, pin_number) []
wait(milliseconds) []
send_message(message, message_type) []
if(_else, _then, lhs, op, rhs) []
execute(sequence_id) []
execute_script(label) []
take_photo() []
move_absolute(location, offset, speed) []
]