on 8fbfbce help sign in
elk/src/Parse/ParserLib.hs
36 lines 1.1 kB history raw
1module ParserLib where
3import Ast
4import Combinators
5import Data.Char (isUpper)
6import Tokens
8var_noSpace = do { t <- item; case t of { ID v -> return v; _ -> zero } }
9var = whitespace >> var_noSpace
10cap_var = do
11 whitespace; t <- item
12 case t of { ID (v:vs) -> if isUpper v then return (v:vs) else zero }
14chr = do { whitespace; t <- item; case t of { CHAR c -> return c; _ -> zero } }
16t_noSpace token = sat (==token)
17t_withSpace token = forcedWS >> sat (==token)
18t token = whitespace >> sat (==token)
20forcedWS = do { sat (==SPACES); star nl_space } +|+ plus nl_space
21 where nl_space = plus (sat (==NEWLINE)) >> sat (==SPACES)
22whitespace = optional forcedWS
24accessible exp = do
25 e <- exp
26 access <- optional $ op_parser_nospace (==".")
27 case access of
28 Just "." -> accessible (var >>= return . Access e)
29 Nothing -> return e
31op_parser_nospace pred =
32 do { t <- item
33 ; case t of { OP op -> if pred op then return op else zero; _ -> zero } }
34op_parser pred = whitespace >> op_parser_nospace pred
35anyOp = op_parser (const True)
36assign = op_parser (=="=")