from Data.Maybe import :: Maybe
from StdOverloaded import class toString
-/*
- * Type errors can happen in either
- * - variable declarations (x :: Int = True)
- * - function declarations (f :: (Char -> Int) = (+)1)
- * - Expressions (1 + 'a')
- * So these are the items that will get position metadata
- */
-
:: Pos = {line :: Int, col :: Int}
-
:: AST = AST [VarDecl] [FunDecl]
:: VarDecl = VarDecl Pos Type String Expr
:: Type
:: Op1 = UnNegation | UnMinus
:: Op2 = BiPlus | BiMinus | BiTimes | BiDivide | BiMod | BiEquals | BiLesser |
BiGreater | BiLesserEq | BiGreaterEq | BiUnEqual | BiAnd | BiOr | BiCons
-
:: FunDecl = FunDecl Pos String [String] (Maybe FunType) [VarDecl] [Stmt]
:: FunType = FunType [Type] (Maybe Type)
:: FunCall = FunCall String [Expr]
parser :: LexerOutput -> ParserOutput
parser (Left e) = Left e
-parser (Right r) = fst $ runParser parseProgram r
+parser (Right r) = case runParser parseProgram r of
+ (Right ast, [(p, t):xs]) = Left $ PositionalError p.line p.col (
+ "Unable to parse from: " +++ printToString t)
+ x = fst x
parseProgram :: Parser Token AST
parseProgram = AST <$> (many parseVarDecl) <*> (some parseFunDecl)
program :: String,
lex :: Bool,
parse :: Bool,
- selftest :: Bool,
fp :: Maybe String,
help :: Bool}
<<< " --version Show the version\n"
<<< " --[no-]lex Lexer output(default: disabled)\n"
<<< " --[no-]parse Parser output(default: enabled)\n"
- <<< " --[no-]selftest Feed pprint parse back(default: disabled)\n"
= snd $ fclose stdin w
# (contents, stdin, w) = readFileOrStdin stdin args.fp w
= case contents of
version=False,
lex=False,
parse=True,
- selftest=False,
fp=Nothing,
help=False}, w)
where
pa ["--no-lex":r] o = pa r {o & lex=False}
pa ["--parse":r] o = pa r {o & parse=True}
pa ["--no-parse":r] o = pa r {o & parse=False}
- pa ["--selftest":r] o = pa r {o & selftest=True}
- pa ["--no-selftest":r] o = pa r {o & selftest=False}
pa [x:r] o = pa r {o & fp=Just x}
readFileOrStdin :: *File (Maybe String) *World -> *(Either String [Char], *File, *World)