%{ #include #include "state.h" #include "wql.h" #if 0 # define YACCTRACE(MSG) \ printf("WQL_TRACE: %s(%d): %s\n", __FILE__, __LINE__, #MSG) #else # define YACCTRACE(MSG) #endif extern int wqllex(); extern void wqlerror(const char* msg); extern int yylex(); extern void yyerror(const char* msg); extern void* wqlmalloc(size_t size); extern MI_Char* wqlstrdup(const MI_Char* str); %} %union { WQL_Symbol symbol; MI_Char* string; long long integer; double real; unsigned char boolean; } %left WQL_OR %left WQL_AND %nonassoc WQL_NOT %token WQL_ERROR %token WQL_LT %token WQL_FROM %token WQL_LE %token WQL_WHERE %token WQL_NE %token WQL_GT %token WQL_REAL %token WQL_EQ %token WQL_SELECT %token WQL_GE %token WQL_NULL %token WQL_IDENTIFIER; %token WQL_BOOLEAN; %token WQL_INTEGER; %token WQL_REAL; %token WQL_STRING; %type Operand; %% Start : WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER { YACCTRACE(Start1); wqlstate.wql->className = $4; } | WQL_SELECT SelectList WQL_FROM WQL_IDENTIFIER WQL_WHERE Condition { YACCTRACE(Start2); wqlstate.wql->className = $4; } SelectList : '*' { YACCTRACE(SelectList1); } | PropertyList { YACCTRACE(SelectList12); } PropertyList : WQL_IDENTIFIER { YACCTRACE(PropertyList1); if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES) { yyerror("property array overflow"); YYABORT; } wqlstate.wql->properties[wqlstate.wql->nproperties++] = $1; } | PropertyList ',' WQL_IDENTIFIER { YACCTRACE(PropertyList2); if (wqlstate.wql->nproperties == WQL_MAX_PROPERTIES) { yyerror("property array overflow"); YYABORT; } wqlstate.wql->properties[wqlstate.wql->nproperties++] = $3; } Condition : '(' Condition ')' { YACCTRACE(Condition1); } | WQL_NOT Condition { WQL_Symbol operator; YACCTRACE(Condition2); if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_NOT; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Condition WQL_AND Condition { WQL_Symbol operator; YACCTRACE(Condition3); if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_AND; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Condition WQL_OR Condition { WQL_Symbol operator; YACCTRACE(Condition4); if (wqlstate.wql->nsymbols == WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_OR; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Predicate { YACCTRACE(Condition5); } Predicate : Operand WQL_EQ Operand { WQL_Symbol operator; YACCTRACE(Predicate1); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_EQ; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Operand WQL_NE Operand { WQL_Symbol operator; YACCTRACE(Predicate2); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_NE; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Operand WQL_LT Operand { WQL_Symbol operator; YACCTRACE(Predicate3); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_LT; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Operand WQL_LE Operand { WQL_Symbol operator; YACCTRACE(Predicate4); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_LE; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Operand WQL_GT Operand { WQL_Symbol operator; YACCTRACE(Predicate5); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_GT; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } | Operand WQL_GE Operand { WQL_Symbol operator; YACCTRACE(Predicate6); if (wqlstate.wql->nsymbols + 3 > WQL_MAX_SYMBOLS) { yyerror("symbol array overflow"); YYABORT; } memset(&operator, 0, sizeof(WQL_Symbol)); operator.type = WQL_TYPE_GE; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $1; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = $3; wqlstate.wql->symbols[wqlstate.wql->nsymbols++] = operator; } Operand : WQL_BOOLEAN { YACCTRACE(Operand1); $$.value.boolean = $1; $$.type = WQL_TYPE_BOOLEAN; } | WQL_INTEGER { YACCTRACE(Operand2); $$.value.integer = $1; $$.type = WQL_TYPE_INTEGER; } | WQL_REAL { YACCTRACE(Operand3); $$.value.real = $1; $$.type = WQL_TYPE_REAL; } | WQL_STRING { YACCTRACE(Operand4); $$.value.string = $1; $$.type = WQL_TYPE_STRING; } | WQL_IDENTIFIER { YACCTRACE(Operand5); $$.value.string = $1; $$.type = WQL_TYPE_IDENTIFIER; } | WQL_NULL { YACCTRACE(Operand6); $$.value.integer = 0; $$.type = WQL_TYPE_NULL; } %%