-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathboolean_evaluate.jison
executable file
·92 lines (78 loc) · 1.54 KB
/
boolean_evaluate.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
/* 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'
. 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
{ return $1; }
;
eq
: eq EQ eq
{ $$ = (!$1 || $3) && ($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 && $3 || $1 && !$3; }
| or NOR or
{ $$ = !($1 || $3) }
| and
{ $$ = $1; }
;
and
: and AND and
{ $$ = $1 && $3; }
| and NAND and
{ $$ = !($1 && $3); }
| not
{ $$ = $1; }
;
not
: NOT not
{ $$ = !$2; }
| primary
{ $$ = $1; }
;
primary
: LPAREN eq RPAREN
{ $$ = $2; }
| BOOL
{ $$ = yytext == 'T'; }
;