@@ -9,48 +9,49 @@ import ParserLib
9import ParseTypes (datatype)
9import ParseTypes (datatype)
10import ParsePatterns
10import ParsePatterns
11import Tokens
11import Tokens
12+import Control.Monad (liftM)
13-------- Basic Terms --------
14-------- Basic Terms --------
15−num_term = do { whitespace; t <- item
16+numTerm = do { whitespace; t <- item
16 ; case t of { NUMBER n -> return $ Number n; _ -> zero } }
17 ; case t of { NUMBER n -> return $ Number n; _ -> zero } }
17−str_term = do { whitespace; t <- item
18+strTerm = do { whitespace; t <- item
18 ; case t of { STRING cs -> return . list $ map Chr cs
19 ; case t of { STRING cs -> return . list $ map Chr cs
19 ; _ -> zero } }
20 ; _ -> zero } }
21−var_term = do var >>= return . Var
22+varTerm = Var `liftM` var
22−chr_term = do chr >>= return . Chr
23+chrTerm = Chr `liftM` chr
24−true_term = do { t TRUE; return $ Boolean True }
25+trueTerm = do { t TRUE; return $ Boolean True }
25−false_term = do { t FALSE; return $ Boolean False }
26+falseTerm = do { t FALSE; return $ Boolean False }
28-------- Complex Terms --------
29-------- Complex Terms --------
30−list_term = (do { t LBRACKET; start <- expr; t DOT2; end <- expr; t RBRACKET
31+listTerm = (do { t LBRACKET; start <- expr; t DOT2; end <- expr; t RBRACKET
31 ; return $ Range start end }) +|+
32 ; return $ Range start end }) +|+
32 (do { t LBRACKET; es <- sepBy (t COMMA) expr; t RBRACKET
33 (do { t LBRACKET; es <- sepBy (t COMMA) expr; t RBRACKET
33 ; return $ list es })
34 ; return $ list es })
35−parens_term = (do { t LPAREN; op <- anyOp; t RPAREN
36+parensTerm = (do { t LPAREN; op <- anyOp; t RPAREN
36 ; return . Lambda "x" . Lambda "y" $
37 ; return . Lambda "x" . Lambda "y" $
37 Binop op (Var "x") (Var "y") }) +|+
38 Binop op (Var "x") (Var "y") }) +|+
38 (do { t LPAREN; es <- sepBy (t COMMA) expr; t RPAREN
39 (do { t LPAREN; es <- sepBy (t COMMA) expr; t RPAREN
39 ; return $ case es of { [e] -> e; _ -> tuple es } })
40 ; return $ case es of { [e] -> e; _ -> tuple es } })
41−term = select [ num_term
42+term = select [ numTerm
42− , str_term
43+ , strTerm
43− , accessible var_term
44+ , accessible varTerm
44− , chr_term
45+ , chrTerm
45− , true_term
46+ , trueTerm
46− , false_term
47+ , falseTerm
47− , list_term
48+ , listTerm
48− , accessible parens_term
49+ , accessible parensTerm
51-------- Applications --------
52-------- Applications --------
53−app_expr = do
54+appExpr = do
54 tlist <- plus term
55 tlist <- plus term
55 return $ case tlist of
56 return $ case tlist of
@@ -59,20 +60,20 @@ app_expr = do
60-------- Expressions with infix operators --------
61-------- Expressions with infix operators --------
62−binary_expr = binops app_expr anyOp
63+binaryExpr = binops appExpr anyOp
65-------- Normal Expressions --------
66-------- Normal Expressions --------
67−if_expr = do { t IF; e1 <- expr; t THEN; e2 <- expr; t ELSE; e3 <- expr
68+ifExpr = do { t IF; e1 <- expr; t THEN; e2 <- expr; t ELSE; e3 <- expr
68 ; return $ If e1 e2 e3 }
69 ; return $ If e1 e2 e3 }
70−lambda_expr = do { t LAMBDA; vs <- plus var; t ARROW; e <- expr
71+lambdaExpr = do { t LAMBDA; vs <- plus var; t ARROW; e <- expr
71− ; return $ foldr (\x e -> Lambda x e) e vs }
72+ ; return $ foldr Lambda e vs }
73−assign_expr = whitespace >> assign_expr_nospace
74+assignExpr = whitespace >> assignExprNospace
74−assign_expr_nospace = do
75+assignExprNospace = do
75− p:ps <- plus pattern_term; assign; e <- expr
76+ p:ps <- plus patternTerm; assign; e <- expr
76 case p:ps of
77 case p:ps of
77 PVar x : _ -> return (x, foldr func e ps)
78 PVar x : _ -> return (x, foldr func e ps)
78 where func PAnything e' = Lambda "_" e'
79 where func PAnything e' = Lambda "_" e'
@@ -81,30 +82,30 @@ assign_expr_nospace = do
81-- _ : [] -> return $ \hole -> Case e [(p,hole)]
82-- _ : [] -> return $ \hole -> Case e [(p,hole)]
84−let_expr = do
85+letExpr = do
85 t LET; brace <- optional $ t LBRACE
86 t LET; brace <- optional $ t LBRACE
86 case brace of
87 case brace of
87− Nothing -> do f <- assign_expr; t IN; e <- expr; return (Let [f] e)
88+ Nothing -> do f <- assignExpr; t IN; e <- expr; return (Let [f] e)
88− Just LBRACE -> do fs <- sepBy1 (t SEMI) assign_expr; t RBRACE; t IN;
89+ Just LBRACE -> do fs <- sepBy1 (t SEMI) assignExpr; t RBRACE; t IN;
89 e <- expr; return (Let fs e)
90 e <- expr; return (Let fs e)
91−case_expr = do
92+caseExpr = do
92 t CASE; e <- expr; t OF; t LBRACE
93 t CASE; e <- expr; t OF; t LBRACE
93 cases <- sepBy1 (t SEMI)
94 cases <- sepBy1 (t SEMI)
94− (do { p <- pattern_expr; t ARROW; e <- expr; return (p,e) })
95+ (do { p <- patternExpr; t ARROW; e <- expr; return (p,e) })
96 return $ Case e cases
97 return $ Case e cases
98-------- All Expressions --------
99-------- All Expressions --------
100−expr = select [ let_expr
101+expr = select [ letExpr
101− , binary_expr
102+ , binaryExpr
102− , if_expr
103+ , ifExpr
103− , case_expr
104+ , caseExpr
104− , lambda_expr
105+ , lambdaExpr
107−def = assign_expr_nospace >>= return . (:[])
108+def = (:[]) `liftM` assignExprNospace
110 ds <- plus (whitespace >> plus (sat (==NEWLINE)) >> def +|+ datatype)
111 ds <- plus (whitespace >> plus (sat (==NEWLINE)) >> def +|+ datatype)