-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathParser.hs
More file actions
102 lines (73 loc) · 1.93 KB
/
Copy pathParser.hs
File metadata and controls
102 lines (73 loc) · 1.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
module Parser where
import Tokens
import Parse
import Lex
import SExpr
import CEK
wrap :: Parser Token a -> Parser Token a
wrap p = pSym LParenT *> p <* pSym RParenT
parseExpr :: Parser Token SExpr
parseExpr = parseApp
<|> parseLambda
<|> parseBinop
<|> parseVar
<|> parseBool
<|> parseInt
<|> parseIF
<|> parseLet
<|> parsePrint
parseApp :: Parser Token SExpr
parseApp = wrap $ AppS <$> parseExpr <*> parseExpr
parseLambda :: Parser Token SExpr
parseLambda = wrap $ (\(VarS x) -> LambdaS x) <$> (pSym LambdaT *> parseVar) <*> parseExpr
parseBinop :: Parser Token SExpr
parseBinop = wrap $ (\opT -> BinopS (fromT opT)) <$> parseOp <*> parseExpr <*> parseExpr
parseIF :: Parser Token SExpr
parseIF = wrap $ IFS <$> (pSym IFT *> parseExpr) <*> parseExpr <*> parseExpr
parseLet :: Parser Token SExpr
parseLet = wrap $ (\(VarS x,s) -> LetS (x,s)) <$> (pSym LetT *> (wrap $ (,) <$> parseVar <*> parseExpr)) <*> parseExpr
parsePrint :: Parser Token SExpr
parsePrint = wrap $ PrintS <$> (pSym PrintT *> parseExpr)
parseVar :: Parser Token SExpr
parseVar = (\(VarT x) -> VarS x) <$> pSatisfy isVar where
isVar t = case t of
VarT _ -> True
otherwise -> False
parseInt :: Parser Token SExpr
parseInt = (\(IntT n) -> ValS n) <$> pSatisfy isIntTok where
isIntTok t = case t of
IntT _ -> True
otherwise -> False
parseBool :: Parser Token SExpr
parseBool = (\(BoolT b) -> BoolS b) <$> pSatisfy isBoolTok where
isBoolTok t = case t of
BoolT _ -> True
otherwise -> False
parseOp :: Parser Token Token
parseOp = pChoice $ map pSym [ AddT
, MulT
, DivT
, SubT
, ModT
, EqT
, LtT
, GtT
, LeqT
, GeqT
, ANDT
, ORT]
fromT :: Token -> Op
fromT t = case t of
AddT -> Add
MulT -> Mul
DivT -> Div
SubT -> Sub
ModT -> Mod
EqT -> Eq
LtT -> Lt
GtT -> Gt
LeqT -> Leq
GeqT -> Geq
ANDT -> AND
ORT -> OR
_ -> error "not an operator"