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
122
123
124
125
126
|
%{
#include <stdlib.h>
#include <stdio.h>
#include "ktraderparse.h"
void yyerror(const char *s);
int yylex();
void KTraderParse_initFlex( const char *s );
%}
%union
{
char valb;
int vali;
double vald;
char *name;
void *ptr;
}
%token NOT
%token EQ
%token NEQ
%token LEQ
%token GEQ
%token LE
%token GR
%token OR
%token AND
%token TOKEN_IN
%token EXIST
%token MAX
%token MIN
%token <valb> VAL_BOOL
%token <name> VAL_STRING
%token <name> VAL_ID
%token <vali> VAL_NUM
%token <vald> VAL_FLOAT
%type <ptr> bool
%type <ptr> bool_or
%type <ptr> bool_and
%type <ptr> bool_compare
%type <ptr> expr_in
%type <ptr> expr_twiddle
%type <ptr> expr
%type <ptr> term
%type <ptr> factor_non
%type <ptr> factor
/* Grammar follows */
%%
constraint: /* empty */ { KTraderParse_setParseTree( 0L ); }
| bool { KTraderParse_setParseTree( $<ptr>1 ); }
;
bool: bool_or { $$ = $<ptr>1; }
;
bool_or: bool_and OR bool_or { $$ = KTraderParse_newOR( $<ptr>1, $<ptr>3 ); }
| bool_and { $$ = $<ptr>1; }
;
bool_and: bool_compare AND bool_and { $$ = KTraderParse_newAND( $<ptr>1, $<ptr>3 ); }
| bool_compare { $$ = $<ptr>1; }
;
bool_compare: expr_in EQ expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 1 ); }
| expr_in NEQ expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 2 ); }
| expr_in GEQ expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 3 ); }
| expr_in LEQ expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 4 ); }
| expr_in LE expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 5 ); }
| expr_in GR expr_in { $$ = KTraderParse_newCMP( $<ptr>1, $<ptr>3, 6 ); }
| expr_in { $$ = $<ptr>1; }
;
expr_in: expr_twiddle TOKEN_IN VAL_ID { $$ = KTraderParse_newIN( $<ptr>1, KTraderParse_newID( $<name>3 ) ); }
| expr_twiddle { $$ = $<ptr>1; }
;
expr_twiddle: expr '~' expr { $$ = KTraderParse_newMATCH( $<ptr>1, $<ptr>3 ); }
| expr { $$ = $<ptr>1; }
;
expr: expr '+' term { $$ = KTraderParse_newCALC( $<ptr>1, $<ptr>3, 1 ); }
| expr '-' term { $$ = KTraderParse_newCALC( $<ptr>1, $<ptr>3, 2 ); }
| term { $$ = $<ptr>1; }
;
term: term '*' factor_non { $$ = KTraderParse_newCALC( $<ptr>1, $<ptr>3, 3 ); }
| term '/' factor_non { $$ = KTraderParse_newCALC( $<ptr>1, $<ptr>3, 4 ); }
| factor_non { $$ = $<ptr>1; }
;
factor_non: NOT factor { $$ = KTraderParse_newNOT( $<ptr>2 ); }
| factor { $$ = $<ptr>1; }
;
factor: '(' bool_or ')' { $$ = KTraderParse_newBRACKETS( $<ptr>2 ); }
| EXIST VAL_ID { $$ = KTraderParse_newEXIST( $<name>2 ); }
| VAL_ID { $$ = KTraderParse_newID( $<name>1 ); }
| VAL_NUM { $$ = KTraderParse_newNUM( $<vali>1 ); }
| VAL_FLOAT { $$ = KTraderParse_newFLOAT( $<vald>1 ); }
| VAL_STRING { $$ = KTraderParse_newSTRING( $<name>1 ); }
| VAL_BOOL { $$ = KTraderParse_newBOOL( $<valb>1 ); }
| MAX VAL_ID { $$ = KTraderParse_newMAX2( $<name>2 ); }
| MIN VAL_ID { $$ = KTraderParse_newMIN2( $<name>2 ); }
;
/* End of grammar */
%%
void yyerror ( const char *s ) /* Called by yyparse on error */
{
KTraderParse_error( s );
}
void KTraderParse_mainParse( const char *_code )
{
KTraderParse_initFlex( _code );
yyparse();
}
|