module Axel.Quote where
import qualified Axel.AST as AST
( Expression(EFunctionApplication, EIdentifier, ELiteral)
, FunctionApplication(FunctionApplication)
, Literal(LChar, LInt, LString)
)
import qualified Axel.Parse as Parse
( Expression(LiteralChar, LiteralInt, LiteralString, SExpression,
Symbol)
)
quoteList :: [Parse.Expression] -> AST.Expression
quoteList =
foldr
(\x acc ->
AST.EFunctionApplication
(AST.FunctionApplication
(AST.EIdentifier ":")
[quoteParseExpression x, acc]))
(AST.EIdentifier "[]")
quoteParseExpression :: Parse.Expression -> AST.Expression
quoteParseExpression (Parse.LiteralChar x) =
AST.EFunctionApplication $
AST.FunctionApplication
(AST.EIdentifier "AST.LiteralChar")
[AST.ELiteral $ AST.LChar x]
quoteParseExpression (Parse.LiteralInt x) =
AST.EFunctionApplication $
AST.FunctionApplication
(AST.EIdentifier "AST.LiteralInt")
[AST.ELiteral $ AST.LInt x]
quoteParseExpression (Parse.LiteralString x) =
AST.EFunctionApplication $
AST.FunctionApplication
(AST.EIdentifier "AST.LiteralString")
[AST.ELiteral $ AST.LString x]
quoteParseExpression (Parse.SExpression xs) =
AST.EFunctionApplication $
AST.FunctionApplication (AST.EIdentifier "AST.SExpression") [quoteList xs]
quoteParseExpression (Parse.Symbol x) =
AST.EFunctionApplication $
AST.FunctionApplication
(AST.EIdentifier "AST.Symbol")
[AST.ELiteral $ AST.LString x]