-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparser.y
More file actions
94 lines (74 loc) · 2.34 KB
/
parser.y
File metadata and controls
94 lines (74 loc) · 2.34 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
{
module Main where
import Data.Char
import LambdaCalculus
import SimpleTypes
import QuantRank2IntersectionTypes
}
%name parse
%tokentype { Token }
%error { parseError }
%token
'\\' { TokenLambda }
'.' { TokenPoint }
' ' { TokenSpace }
var { TokenVar $$ }
'(' { TokenOB }
')' { TokenCB }
typeinf0 { TokenInf0 }
qtypeinf2 { TokenQInf2 }
%left ' '
%%
Exp : TyInf { TyInf $1 }
| Term { Term $1 }
Term : var { Var (TeVar $1) }
| Abs { $1 }
| App { $1 }
| '(' Term ')' { $2 }
Abs : '\\' var '.' Term { Abs (TeVar $2) $4 }
App : Term ' ' Term { App $1 $3 }
TyInf : typeinf0 '(' Term ')' { TyInf0 $3 (typeInf $3 0) }
| qtypeinf2 '(' Term ')' { QTyInf2 $3 (quantR2typeInf $3 0) }
{
parseError :: [Token] -> a
parseError _ = error "Parse error"
data Exp
= TyInf TyInf
| Term Term
data TyInf
= TyInf0 Term (Basis, Type0, Int)
| QTyInf2 Term (Env, Type2, Int ,Int)
type Neutral = [TeVar]
instance Show Exp where
show (TyInf x) = show x
show (Term x) = "\tTerm = " ++ show x ++ ['\n']
instance Show TyInf where
show (TyInf0 term (basis, t0, _)) = "\tTerm = " ++ show term ++ "\n\tBasis = " ++ show basis ++ "\n\tType = " ++ show t0 ++ ['\n']
show (QTyInf2 term (env, t2, c, _)) = "\tTerm = " ++ show term ++ "\n\tEnvironment = " ++ show env ++ "\n\tType = " ++ show t2 ++ "\n\tCount = " ++ show c ++ ['\n']
data Token
= TokenLambda
| TokenPoint
| TokenSpace
| TokenVar String
| TokenOB
| TokenCB
| TokenInf0
| TokenQInf2
deriving Show
lexer :: String -> [Token]
lexer [] = []
lexer (c:cs)
| isAlphaNum c = lexVar (c:cs)
lexer ('\\':cs) = TokenLambda : lexer cs
lexer ('.':cs) = TokenPoint : lexer cs
lexer (' ':cs) = TokenSpace : lexer cs
lexer ('(':cs) = TokenOB : lexer cs
lexer (')':cs) = TokenCB : lexer cs
lexVar cs =
case span isAlphaNum cs of
("ti0",rest) -> TokenInf0 : lexer rest
("qti2",rest) -> TokenQInf2 : lexer rest
(var,rest) -> TokenVar var : lexer rest
main = do getLine >>= print . parse . lexer
main
}