implementation module parse
+import GenPrint
import StdString
import StdTuple
import StdList
import StdMisc
from Data.List import intercalate, replicate, instance Functor []
from Text import class Text(concat), instance Text String
-import GenPrint
import yard
import lex
parseStmt :: Parser Token Stmt
parseStmt = parseIfStmt <|> parseWhileStmt <|>
parseSColon parseAssStmt <|> parseSColon parseReturnStmt <|>
- (parseSColon parseFunCall >>= \(ident, args)->pure $ FunStmt ident args)
+ (parseSColon parseFunCall
+ >>= \(ident, args, fs)->pure $ FunStmt ident args fs)
where
parseSColon :: (Parser Token a) -> Parser Token a
parseSColon p = p <* satTok SColonToken
parseBasicExpr :: Parser Token Expr
parseBasicExpr = peekPos >>= \pos ->
+ (trans2 (StringToken []) (\(StringToken cs)->makeStrExpr pos cs)) <|>
(TupleExpr pos <$> (parseTuple parseExpr)) <|>
parseBBraces parseExpr <|>
trans1 EmptyListToken (EmptyListExpr pos) <|>
trans2 (NumberToken zero) (\(NumberToken i)->IntExpr pos i) <|>
trans2 (CharToken zero) (\(CharToken c)->CharExpr pos c) <|>
(Op1Expr pos <$> parseOp1 <*> parseExpr) <|>
- (parseFunCall >>= \(ident, args)->parseFieldSelectors >>= \fs->
+ (parseFunCall >>= \(ident, args, fs)->
pure $ FunExpr pos ident args fs) <|>
(VarExpr pos <$> parseVarDef)
-parseFunCall :: Parser Token (String, [Expr])
-parseFunCall = liftM2 tuple
+makeStrExpr :: Pos [Char] -> Expr
+makeStrExpr p [] = EmptyListExpr p
+makeStrExpr p [x:xs] = Op2Expr p (CharExpr zero x) BiCons (makeStrExpr p xs)
+
+parseFunCall :: Parser Token (String, [Expr], [FieldSelector])
+parseFunCall = liftM3 (\x y z->(x, y, z))
parseIdent
(parseBBraces $ parseSepList CommaToken parseExpr)
+ parseFieldSelectors
parseVarDef :: Parser Token VarDef
parseVarDef = liftM2 VarDef parseIdent parseFieldSelectors
parseFieldSelectors :: Parser Token [FieldSelector]
-parseFieldSelectors = many (satTok DotToken *> (
- (parseIdent >>= \i.if (i == "hd") (pure FieldHd) empty) <|>
- (parseIdent >>= \i.if (i == "tl") (pure FieldTl) empty) <|>
- (parseIdent >>= \i.if (i == "fst") (pure FieldFst) empty) <|>
- (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty)))
+parseFieldSelectors = many (satTok DotToken *>
+ parseIdent >>= \i->case i of
+ "hd" = pure FieldHd
+ "tl" = pure FieldTl
+ "fst" = pure FieldFst
+ "snd" = pure FieldSnd
+ _ = empty)
parseOp1 :: Parser Token Op1
parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation
(pure tok) (fail <?> PositionalError line col
("ParseError: Unexpected token: " +++ printToString token))
where
- eq (IdentToken _) (IdentToken _) = True
+ eq (IdentToken _) (IdentToken _) = True
eq (NumberToken _) (NumberToken _) = True
- eq (CharToken _) (CharToken _) = True
+ eq (CharToken _) (CharToken _) = True
+ eq (StringToken _) (StringToken _) = True
eq x y = gEq {|*|} x y
parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
(liftM pure p) <|> pure empty
parseIdent :: Parser Token String
-parseIdent = trans2 (IdentToken "") (\(IdentToken e).toString e)
+parseIdent = trans2 (IdentToken "") (\(IdentToken e)->toString e)
//liftM only goes to liftM5
liftM6 f m1 m2 m3 m4 m5 m6 = f <$> m1 <*> m2 <*> m3 <*> m4 <*> m5 <*> m6