more sample programs, added strings, added desugar for strings

This commit is contained in:
sebastianselander 2023-05-08 20:22:57 +02:00
parent 2226a6ad33
commit 2fab7f2bdf
4 changed files with 52 additions and 4 deletions

View file

@ -82,6 +82,7 @@ define infixSymbol e1 vn e3 = EApp (EApp (EVarS (VSymbol vn)) e1) e3;
LInt. Lit ::= Integer; LInt. Lit ::= Integer;
LChar. Lit ::= Char; LChar. Lit ::= Char;
LString. Lit ::= String ;
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
-- * AUX -- * AUX

View file

@ -0,0 +1,41 @@
data Skewheap where
Empty : Skewheap
Node : Skewheap -> Int -> Skewheap -> Skewheap
data Maybe a where
Nothing : Maybe a
Just : a -> Maybe a
data Pair a b where
Pair : a -> b -> Pair a b
data List a where
Nil : List a
Cons : a -> List a -> List a
empty = Empty
singleton x = Node Empty x Empty
peek : Skewheap -> Maybe Int
peek tree = case tree of
Node _ x _ => Just x
_ => Nothing
pop tree = case tree of
Node l x r => Just (Pair x (merge l r))
Empty => Nothing
merge tree1 tree2 = case tree1 of
Node left1 val1 right1 => case tree2 of
Node left2 val2 right2 => case val1 < val2 of
True => Node (merge right1 (Node left2 val2 right2)) val1 left1
False => Node (merge right2 (Node left1 val1 right1)) val2 left2
_ => tree1
Empty => tree2
insert x tree = merge (singleton x) tree
main = case peek (insert 1 (insert 2 (insert 3 (singleton 4)))) of
Nothing => (0 - 1)
Just x => x

View file

@ -71,10 +71,14 @@ desugarExp = \case
EAnn e t -> EAnn (desugarExp e) (desugarType t) EAnn e t -> EAnn (desugarExp e) (desugarType t)
EVarS (VSymbol (Symbol symb)) -> EVar (LIdent $ fixName symb) EVarS (VSymbol (Symbol symb)) -> EVar (LIdent $ fixName symb)
EVarS (VIdent (LIdent ident)) -> EVar $ LIdent $ fixName ident EVarS (VIdent (LIdent ident)) -> EVar $ LIdent $ fixName ident
EVar i -> EVar i EVar (LIdent i) -> EVar (LIdent $ fixName i)
ELit (LString str) -> toList str
ELit l -> ELit l ELit l -> ELit l
EInj i -> EInj i EInj i -> EInj i
toList :: String -> Exp
toList = foldr (EApp . EApp (EInj (UIdent "Cons")) . ELit . LChar) (EInj (UIdent "Nil"))
desugarBranch :: Branch -> Branch desugarBranch :: Branch -> Branch
desugarBranch (Branch p e) = Branch (desugarPattern p) (desugarExp e) desugarBranch (Branch p e) = Branch (desugarPattern p) (desugarExp e)
@ -89,6 +93,7 @@ desugarPattern = \case
desugarLit :: Lit -> Lit desugarLit :: Lit -> Lit
desugarLit (LInt i) = LInt i desugarLit (LInt i) = LInt i
desugarLit (LChar c) = LChar c desugarLit (LChar c) = LChar c
desugarLit (LString c) = LString c
fixName :: String -> String fixName :: String -> String
fixName = concatMap mapSymbols fixName = concatMap mapSymbols

View file

@ -69,7 +69,7 @@ initOpts =
, debug = False , debug = False
, gc = True , gc = True
, typechecker = Nothing , typechecker = Nothing
, preludeOpt = True , preludeOpt = False
} }
enableHelp :: Options -> Options enableHelp :: Options -> Options
@ -110,7 +110,8 @@ main' opts s =
file <- readFile s file <- readFile s
printToErr "-- Parse Tree -- " printToErr "-- Parse Tree -- "
parsed <- fromErr . pProgram . resolveLayout True $ myLexer (file ++ prelude) let file' = if opts.preludeOpt then file else file ++ prelude
parsed <- fromErr . pProgram . resolveLayout True $ myLexer file'
log parsed log parsed
printToErr "-- Desugar --" printToErr "-- Desugar --"