2022-02-08 19:26:58 -05:00
|
|
|
|
module Luau.Syntax.ToString where
|
|
|
|
|
|
2022-02-09 18:14:29 -05:00
|
|
|
|
open import Luau.Syntax using (Block; Stat; Expr; nil; var; addr; _$_; function⟨_⟩_end; return; function_⟨_⟩_end ;local_←_; _∙_; done; block_is_end)
|
2022-02-08 19:26:58 -05:00
|
|
|
|
open import FFI.Data.String using (String; _++_)
|
2022-02-09 18:14:29 -05:00
|
|
|
|
open import Luau.Addr.ToString using (addrToString)
|
|
|
|
|
open import Luau.Var.ToString using (varToString)
|
2022-02-08 19:26:58 -05:00
|
|
|
|
|
|
|
|
|
exprToString′ : String → Expr → String
|
|
|
|
|
statToString′ : String → Stat → String
|
|
|
|
|
blockToString′ : String → Block → String
|
|
|
|
|
|
|
|
|
|
exprToString′ lb nil =
|
|
|
|
|
"nil"
|
2022-02-09 18:14:29 -05:00
|
|
|
|
exprToString′ lb (addr a) =
|
|
|
|
|
addrToString(a)
|
2022-02-08 19:26:58 -05:00
|
|
|
|
exprToString′ lb (var x) =
|
2022-02-09 18:14:29 -05:00
|
|
|
|
varToString(x)
|
2022-02-08 19:26:58 -05:00
|
|
|
|
exprToString′ lb (M $ N) =
|
|
|
|
|
(exprToString′ lb M) ++ "(" ++ (exprToString′ lb N) ++ ")"
|
|
|
|
|
exprToString′ lb (function⟨ x ⟩ B end) =
|
|
|
|
|
"function(" ++ x ++ ")" ++ lb ++
|
|
|
|
|
" " ++ (blockToString′ (lb ++ " ") B) ++ lb ++
|
|
|
|
|
"end"
|
2022-02-09 18:14:29 -05:00
|
|
|
|
exprToString′ lb (block b is B end) =
|
|
|
|
|
"(function " ++ b ++ "()" ++ lb ++
|
|
|
|
|
" " ++ (blockToString′ (lb ++ " ") B) ++ lb ++
|
|
|
|
|
"end)()"
|
2022-02-08 19:26:58 -05:00
|
|
|
|
|
|
|
|
|
statToString′ lb (function f ⟨ x ⟩ B end) =
|
|
|
|
|
"local function " ++ f ++ "(" ++ x ++ ")" ++ lb ++
|
|
|
|
|
" " ++ (blockToString′ (lb ++ " ") B) ++ lb ++
|
|
|
|
|
"end"
|
|
|
|
|
statToString′ lb (local x ← M) =
|
|
|
|
|
"local " ++ x ++ " = " ++ (exprToString′ lb M)
|
|
|
|
|
statToString′ lb (return M) =
|
|
|
|
|
"return " ++ (exprToString′ lb M)
|
|
|
|
|
|
2022-02-09 18:14:29 -05:00
|
|
|
|
blockToString′ lb (S ∙ done) = statToString′ lb S
|
2022-02-08 19:26:58 -05:00
|
|
|
|
blockToString′ lb (S ∙ B) = statToString′ lb S ++ lb ++ blockToString′ lb B
|
2022-02-09 18:14:29 -05:00
|
|
|
|
blockToString′ lb (done) = ""
|
2022-02-08 19:26:58 -05:00
|
|
|
|
|
|
|
|
|
exprToString : Expr → String
|
|
|
|
|
exprToString = exprToString′ "\n"
|
|
|
|
|
|
|
|
|
|
statToString : Stat → String
|
|
|
|
|
statToString = statToString′ "\n"
|
|
|
|
|
|
|
|
|
|
blockToString : Block → String
|
|
|
|
|
blockToString = blockToString′ "\n"
|