-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathGrammar.y
92 lines (71 loc) · 2.63 KB
/
Grammar.y
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
{
module Grammar where
import Lexer
}
%name queryLang
%tokentype { Token }
%error { parseError }
%token
show { TokenShow _ }
where { TokenWhere _ }
if { TokenIf _ }
then { TokenThen _ }
else { TokenElse _ }
"<-" { TokenAssign _ }
'&' { TokenAnd _ }
'_' { TokenSkip _ }
'=' { TokenEq _ }
"!=" { TokenNEq _ }
'(' { TokenLParen _ }
')' { TokenRParen _ }
',' { TokenSeparator _ }
-- '"' { TokenQuote _ }
var { TokenVar _ $$ }
str { TokenString _ $$ }
%right for
%left '&'
--haskell happy documentation 2.5. Monadic Parsers
--%monad { E } { thenE } { returnE }
%%
Exp : show '(' BoundVars ')' where RequirementList { FinalExp $3 $6 }
BoundVars : var ',' BoundVars { $1:$3 }
| var { [$1] }
ColumnList : Column ',' ColumnList { $1:$3 }
| Column { [$1] }
Column : var { Var $1 }
| '_' { SkipVar }
RequirementList : Requirement '&' RequirementList { $1:$3 }
| Requirement { [$1] }
Requirement : str '(' ColumnList ')' { Table $1 $3 }
| var '=' var { Eq $1 $3 }
| var "!=" var { NEq $1 $3 }
| var '=' str { EqConst $1 $3 }
| var "!=" str { NEqConst $1 $3 }
| var "<-" var { AsignVarVar $1 $3 }
| var "<-" str { AsignVarStr $1 $3 }
| if '(' RequirementList ')' then '(' RequirementList ')' else '(' RequirementList ')' { IfTF $3 $7 $11 }
| if '(' RequirementList ')' then '(' RequirementList ')' { IfT $3 $7 }
{
---------------------DATA TYPES---------------------------
data Exp = FinalExp [String] RequirementList
deriving (Eq,Show)
data Column = Var String
| SkipVar
deriving (Eq,Show)
data Requirement = Table String ColumnList
| Eq String String
| NEq String String
| EqConst String String
| NEqConst String String
| AsignVarVar String String
| AsignVarStr String String
| IfTF RequirementList RequirementList RequirementList
| IfT RequirementList RequirementList
deriving (Eq,Show)
type RequirementList = [Requirement]
type ColumnList = [Column]
parseError :: [Token] -> a
parseError [] = error "Unknown Parse Error"
parseError (t:ts) = error ("Parse error at line:column " ++ (tokenPosn t))
parseError tokens = error "Parse error"
}