-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathboolean_print.jison
executable file
·100 lines (85 loc) · 2.46 KB
/
boolean_print.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
%{
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'
<<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
: eq EOF
{ exp_final = exp_list; exp_list = null; return exp_final; }
;
eq
: eq EQ eq
{ $$ = $1 + " = " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CUR= " + $3); }
| imp
{ $$ = $1;}
;
imp
: imp RIMP imp
{ $$ = $1 + " -] " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CUR-] " + $3); }
| imp LIMP imp
{ $$ = $1 + " [- " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CUR[- " + $3); }
| or
{ $$ = $1;}
;
or
: or OR or
{ $$ = $1 + " | " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CUR| " + $3); }
| or XOR or
{ $$ = $1 + " X " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CURX " + $3); }
| or NOR or
{ $$ = $1 + " R " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CURR " + $3); }
| and
{ $$ = $1;}
;
and
: and AND and
{ $$ = $1 + " & " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CUR& " + $3); }
| and NAND and
{ $$ = $1 + " D " + $3; if(exp_list == null) exp_list = new Array(); exp_list.push($1 + " CURD " + $3); }
| not
{ $$ = $1;}
;
not
: NOT not
{ $$ = "!" + $2; if(exp_list == null) exp_list = new Array(); exp_list.push("CUR!" + $2); }
| primary
{ $$ = $1; }
;
primary
: LPAREN eq RPAREN
{ $$ = "(" + $2 + ")"; }
| BOOL
{ $$ = yytext; }
| VAR
{ $$ = yytext; }
;