update README
[cc1516.git] / src / parse.icl
index d64efcb..acd7d9c 100644 (file)
@@ -18,14 +18,11 @@ import yard
 import lex
 
 parser :: LexerOutput -> ParserOutput
-parser (Left e) = Left $ toString $ LexError e
-parser (Right r) = case runParser parseProgram r of
-       (Right p, _) = Right p
-       (Left e, _) = Left $ toString e
+parser (Left e) = Left e
+parser (Right r) = fst $ runParser parseProgram r
 
 parseProgram :: Parser Token AST
 parseProgram = liftM2 AST (many parseVarDecl) (some parseFunDecl) 
-       <* satTok EndOfFileToken
 
 parseFunDecl :: Parser Token FunDecl
 parseFunDecl = liftM5 FunDecl
@@ -151,8 +148,7 @@ parseVarDef = liftM2 VarDef
                (parseIdent >>= \i.if (i == "snd") (pure FieldSnd) empty))))
 
 parseOp1 :: Parser Token Op1
-parseOp1 = trans1 DashToken UnMinus <|> 
-       trans1 ExclamationToken UnNegation
+parseOp1 = trans1 DashToken UnMinus <|> trans1 ExclamationToken UnNegation
 
 parseBBraces :: (Parser Token a) -> Parser Token a
 parseBBraces p = satTok BraceOpenToken *> p <* satTok BraceCloseToken
@@ -169,7 +165,7 @@ parseTuple p = satTok BraceOpenToken *>
        <* satTok BraceCloseToken
 
 trans2 :: TokenValue (TokenValue -> a) -> Parser Token a
-trans2 t f = satTok t >>= \(_, r).pure (f r)
+trans2 t f = liftM (\{token}->f token) $ satTok t
 
 trans1 :: TokenValue a -> Parser Token a
 trans1 t r = trans2 t $ const r
@@ -177,14 +173,13 @@ trans1 t r = trans2 t $ const r
 derive gPrint TokenValue
 derive gEq TokenValue
 satTok :: TokenValue -> Parser Token Token
-satTok t = top >>= \tok=:(pos, tv) -> if (eq t tok) 
-                                            (return tok) 
-                                            (fail <?> (printToString tv+++printToString t, pos))
+satTok t = top >>= \tok=:{line,column,token} -> if (eq t token) 
+       (return tok) (fail <?> PositionalError line column ("ParseError: Unexpected token: " +++ printToString token))
        where
-               eq (IdentToken _) (_, IdentToken _) = True
-               eq (NumberToken _) (_, NumberToken _) = True
-               eq (CharToken _) (_, CharToken _) = True
-               eq x (_, y) = gEq {|*|} x y
+               eq (IdentToken _)  (IdentToken _) = True
+               eq (NumberToken _) (NumberToken _) = True
+               eq (CharToken _)   (CharToken _) = True
+               eq x y = gEq {|*|} x y
 
 parseSepList :: TokenValue (Parser Token a) -> Parser Token [a]
 parseSepList sep p = 
@@ -192,7 +187,7 @@ parseSepList sep p =
        (liftM pure p) <|> pure empty
 
 parseIdent :: Parser Token String
-parseIdent = trans2 (IdentToken []) (\(IdentToken e).toString e)
+parseIdent = trans2 (IdentToken "") (\(IdentToken e).toString e)
 
 instance toString AST where
        toString (AST v f) = concat (