-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathboolean_split_3.jison
executable file
·122 lines (106 loc) · 2.81 KB
/
boolean_split_3.jison
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
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
%{
var exp_list = null;
var exp_final;
%}
/* lexical grammar */
%lex
%%
\s+ /* skip whitespace */
[TF] return 'BOOL'
"=" return 'EQ'
"-]" return 'RIMP'
"[-" return 'LIMP'
(D) return 'NAND'
(R) return 'NOR'
"|" return 'OR'
(X) return 'XOR'
"&" return 'AND'
"!" return 'NOT'
"(" return 'LPAREN'
")" return 'RPAREN'
(CUR) return 'CUR'
<<EOF>> return 'EOF'
[a-eg-mo-su-zABCEGHIJKLMNOPQSUVWYZ] return 'VAR'
. return 'INVALID'
/lex
/* operator associations and precedence */
%left LPAREN RPAREN
%left NOT
%left AND NAND
%left OR XOR NOR
%left LIMP RIMP
%left EQ
%left BOOL
%left VAR
%start expressions
%% /* language grammar */
expressions
: top EOF
{ exp_final = exp_list; exp_list = null; return exp_final; }
;
top
: eq CUR EQ eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR LIMP eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR RIMP eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR OR eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR XOR eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR NOR eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR AND eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| eq CUR NAND eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($1); exp_list.push($4); }
| CUR NOT eq
{ if(exp_list == null) exp_list = new Array(); exp_list.push($3); }
;
eq
: eq EQ eq
{ $$ = $1 + " = " + $3; }
| imp
{ $$ = $1; }
;
imp
: imp RIMP imp
{ $$ = $1 + " -] " + $3; }
| imp LIMP imp
{ $$ = $1 + " [- " + $3; }
| or
{ $$ = $1; }
;
or
: or OR or
{ $$ = $1 + " | " + $3; }
| or XOR or
{ $$ = $1 + " X " + $3; }
| or NOR or
{ $$ = $1 + " NOR " + $3; }
| and
{ $$ = $1; }
;
and
: and AND and
{ $$ = $1 + " & " + $3; }
| and NAND and
{ $$ = $1 + " NAND " + $3; }
| not
{ $$ = $1; }
;
not
: NOT not
{ $$ = "!" + $2; }
| primary
{ $$ = $1; }
;
primary
: LPAREN eq RPAREN
{ $$ = "(" + $2 + ")"; }
| BOOL
{ $$ = yytext; }
| VAR
{ $$ = yytext; }
;