Current section

Files

Jump to
per lib per.ex
Raw

lib/per.ex

defmodule Per do
def file(f) do
case :file.read_file(f) do
{:ok,b} -> {:ok,:unicode.characters_to_list(b)}
{:error,e} -> :io.format(:lists.concat(['File ',f, ' : ',e,'~n']))
{:error,:file} end end
def lexer({:error,s}) do {:error,s} end
def lexer({:ok,s}) do
case :per_lex.string(s) do
{:ok,t,_} -> {:ok,t}
{:error,{l,a,x},_} -> :io.format(:lists.concat(['Line ',l,' ',a,' : ',:erlang.element(2,x),'~n']))
{:error,:lexer} end end
def parser({:error,t}) do {:error,t} end
def parser({:ok,t}) do
case :per_parse.parse(t) do
{:ok,ast} -> {:ok,ast};
{:error,{l,a,s}} -> :io.format(:lists.concat(['Line ', l, ' ', a, ' : ', s,'~n']))
{:error,:parser} end end
def parse(f), do: snd(parser(lexer({:ok,f})))
def a(f), do: snd(parser(lexer(file(f))))
def fst({x,_}), do: x
def snd({:error,x}), do: {:error,x}
def snd({_,[x]}), do: x
def snd({_,x}), do: x
end