started with new typechecker
[cc1516.git] / sem.icl
1 implementation module sem
2
3 import qualified Data.Map as Map
4
5 from Data.Func import $
6 from StdFunc import o
7
8 import Data.Either
9
10 import StdString
11 import StdList
12 import StdEnum
13 import RWST
14 import GenEq
15
16 from Text import class Text(concat), instance Text String
17
18 import AST
19
20 :: Gamma :== 'Map'.Map String Type
21 :: Constraint :== String
22 :: Infer a :== RWST [String] [Constraint] Gamma (Either SemError) a
23 :: SemError
24 = ParseError Pos String
25 | UnifyError Pos Type Type
26 | FieldSelectorError Pos Type FieldSelector
27 | OperatorError Pos Op2 Type
28 | UndeclaredVariableError Pos String
29 | ArgumentMisMatchError Pos String
30 | Error String
31
32 variableStream :: [String]
33 variableStream = map toString [1..]
34
35 sem :: AST -> SemOutput
36 sem (AST vd fd) = Right $ (AST vd fd, 'Map'.newMap)
37
38 instance toString Gamma where
39 toString mp = concat [concat [k, ": ", toString v, "\n"]\\(k, v)<-'Map'.toList mp]
40
41 instance toString SemError where
42 toString se = "SemError: "