build pretty printer
This commit is contained in:
parent
8aab2b0439
commit
57dff695e9
12
compile_cs.exs
Normal file
12
compile_cs.exs
Normal 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")
|
|
@ -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
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
|
46
lib/farmbot/celery_script/ast/pretty_print.ex
Normal file
46
lib/farmbot/celery_script/ast/pretty_print.ex
Normal 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
28
sequence.celery
Normal 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) []
|
||||
]
|
Loading…
Reference in a new issue