version 1.1.2.6, 2001/12/02 22:03:23
|
version 1.10, 2008/12/01 17:51:20
|
|
|
|
//%LICENSE//////////////////////////////////////////////////////////////// |
|
// |
|
// Licensed to The Open Group (TOG) under one or more contributor license |
|
// agreements. Refer to the OpenPegasusNOTICE.txt file distributed with |
|
// this work for additional information regarding copyright ownership. |
|
// Each contributor licenses this file to you under the OpenPegasus Open |
|
// Source License; you may not use this file except in compliance with the |
|
// License. |
|
// |
|
// Permission is hereby granted, free of charge, to any person obtaining a |
|
// copy of this software and associated documentation files (the "Software"), |
|
// to deal in the Software without restriction, including without limitation |
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense, |
|
// and/or sell copies of the Software, and to permit persons to whom the |
|
// Software is furnished to do so, subject to the following conditions: |
|
// |
|
// The above copyright notice and this permission notice shall be included |
|
// in all copies or substantial portions of the Software. |
|
// |
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. |
|
// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
|
// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
// |
|
////////////////////////////////////////////////////////////////////////// |
/* | /* |
**============================================================================== | **============================================================================== |
** | ** |
|
|
# include <alloca.h> | # include <alloca.h> |
#endif | #endif |
| |
#if 1 |
#if 0 |
# define WQL_TRACE(X) printf X | # define WQL_TRACE(X) printf X |
#else | #else |
# define WQL_TRACE(X) | # define WQL_TRACE(X) |
#endif | #endif |
| |
extern int WQL_lex(); | extern int WQL_lex(); |
extern int WQL_error(char*); |
extern int WQL_error(const char*); |
|
|
|
// |
|
// Define the global parser state object: |
|
// |
| |
PEGASUS_USING_PEGASUS; | PEGASUS_USING_PEGASUS; |
| |
|
|
%token <intValue> TOK_TRUE | %token <intValue> TOK_TRUE |
%token <intValue> TOK_FALSE | %token <intValue> TOK_FALSE |
%token <intValue> TOK_NULL | %token <intValue> TOK_NULL |
|
%token <intValue> TOK_ISA |
|
%token <intValue> TOK_DOT |
| |
%token <intValue> TOK_EQ | %token <intValue> TOK_EQ |
%token <intValue> TOK_NE | %token <intValue> TOK_NE |
|
|
%type <nodeValue> propertyList | %type <nodeValue> propertyList |
%type <nodeValue> predicate | %type <nodeValue> predicate |
%type <nodeValue> comparisonPredicate | %type <nodeValue> comparisonPredicate |
%type <nodeValue> comparisonTerm |
// %type <nodeValue> comparisonTerm |
%type <nodeValue> nullPredicate | %type <nodeValue> nullPredicate |
%type <nodeValue> searchCondition | %type <nodeValue> searchCondition |
%type <nodeValue> fromClause | %type <nodeValue> fromClause |
|
|
%type <nodeValue> selectList | %type <nodeValue> selectList |
%type <nodeValue> selectExpression | %type <nodeValue> selectExpression |
%type <strValue> className | %type <strValue> className |
|
%type <intValue> truthValue |
| |
%left TOK_OR | %left TOK_OR |
%left TOK_AND | %left TOK_AND |
|
|
start | start |
: selectStatement | : selectStatement |
{ | { |
printf("YACC: start\n"); |
WQL_TRACE(("YACC: start\n")); |
} | } |
| |
selectStatement | selectStatement |
|
|
selectList | selectList |
: '*' | : '*' |
{ | { |
globalParserState->statement->appendPropertyName("*"); |
globalParserState->statement->setAllProperties(true); |
} | } |
| propertyList | | propertyList |
{ | { |
|
|
propertyList | propertyList |
: propertyName | : propertyName |
{ | { |
globalParserState->statement->appendPropertyName($1); |
globalParserState->statement->appendSelectPropertyName(CIMName($1)); |
} | } |
| propertyList ',' propertyName | | propertyList ',' propertyName |
{ | { |
globalParserState->statement->appendPropertyName($3); |
globalParserState->statement->appendSelectPropertyName(CIMName($3)); |
} | } |
| |
selectExpression | selectExpression |
|
|
: TOK_FROM className | : TOK_FROM className |
{ | { |
WQL_TRACE(("YACC: fromClause: TOK_FROM className(%s)\n", $2)); | WQL_TRACE(("YACC: fromClause: TOK_FROM className(%s)\n", $2)); |
globalParserState->statement->setClassName($2); |
globalParserState->statement->setClassName(CIMName($2)); |
delete [] $2; |
|
} | } |
| |
whereClause | whereClause |
|
|
: searchCondition TOK_OR searchCondition | : searchCondition TOK_OR searchCondition |
{ | { |
WQL_TRACE(("YACC: TOK_OR\n")); | WQL_TRACE(("YACC: TOK_OR\n")); |
|
globalParserState->statement->appendOperation(WQL_OR); |
} | } |
| searchCondition TOK_AND searchCondition | | searchCondition TOK_AND searchCondition |
{ | { |
WQL_TRACE(("YACC: TOK_AND\n")); | WQL_TRACE(("YACC: TOK_AND\n")); |
|
globalParserState->statement->appendOperation(WQL_AND); |
} | } |
| TOK_NOT searchCondition | | TOK_NOT searchCondition |
{ | { |
|
WQL_TRACE(("YACC: TOK_NOT\n")); |
| |
|
globalParserState->statement->appendOperation(WQL_NOT); |
} | } |
| '(' searchCondition ')' | | '(' searchCondition ')' |
{ | { |
|
|
} | } |
| predicate TOK_IS truthValue | | predicate TOK_IS truthValue |
{ | { |
|
WQLOperation op = $3 ? WQL_IS_TRUE : WQL_IS_FALSE; |
|
globalParserState->statement->appendOperation(op); |
} | } |
| predicate TOK_IS TOK_NOT truthValue | | predicate TOK_IS TOK_NOT truthValue |
{ | { |
|
WQLOperation op = $4 ? WQL_IS_NOT_TRUE : WQL_IS_NOT_FALSE; |
|
globalParserState->statement->appendOperation(op); |
} | } |
| |
|
/******************************************************************************/ |
|
|
predicate | predicate |
: comparisonPredicate | : comparisonPredicate |
{ | { |
|
|
: comparisonTerm TOK_LT comparisonTerm | : comparisonTerm TOK_LT comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_LT\n")); | WQL_TRACE(("YACC: TOK_LT\n")); |
|
globalParserState->statement->appendOperation(WQL_LT); |
} | } |
| comparisonTerm TOK_GT comparisonTerm | | comparisonTerm TOK_GT comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_GT\n")); | WQL_TRACE(("YACC: TOK_GT\n")); |
|
globalParserState->statement->appendOperation(WQL_GT); |
} | } |
| comparisonTerm TOK_LE comparisonTerm | | comparisonTerm TOK_LE comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_LE\n")); | WQL_TRACE(("YACC: TOK_LE\n")); |
|
globalParserState->statement->appendOperation(WQL_LE); |
} | } |
| comparisonTerm TOK_GE comparisonTerm | | comparisonTerm TOK_GE comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_GE\n")); | WQL_TRACE(("YACC: TOK_GE\n")); |
|
globalParserState->statement->appendOperation(WQL_GE); |
} | } |
| comparisonTerm TOK_EQ comparisonTerm | | comparisonTerm TOK_EQ comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_EQ\n")); | WQL_TRACE(("YACC: TOK_EQ\n")); |
|
globalParserState->statement->appendOperation(WQL_EQ); |
} | } |
| comparisonTerm TOK_NE comparisonTerm | | comparisonTerm TOK_NE comparisonTerm |
{ | { |
WQL_TRACE(("YACC: TOK_NE\n")); | WQL_TRACE(("YACC: TOK_NE\n")); |
|
globalParserState->statement->appendOperation(WQL_NE); |
|
} |
|
| propertyName TOK_ISA className |
|
{ |
|
WQL_TRACE(("YACC: TOK_ISA\n")); |
|
#ifndef PEGASUS_SNIA_EXTENSIONS |
|
// If SNIA tests, allow the ISA but do not pass className |
|
yyerror("ISA Token Not Supported"); |
|
#endif |
} | } |
| |
nullPredicate | nullPredicate |
: comparisonTerm TOK_IS TOK_NULL | : comparisonTerm TOK_IS TOK_NULL |
{ | { |
WQL_TRACE(("YACC: TOK_IS TOK_NULL\n")); |
WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NULL\n")); |
|
globalParserState->statement->appendOperation(WQL_IS_NULL); |
} | } |
| comparisonTerm TOK_IS TOK_NOT TOK_NULL | | comparisonTerm TOK_IS TOK_NOT TOK_NULL |
{ | { |
WQL_TRACE(("YACC: TOK_NOT TOK_NULL\n")); |
WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NOT NULL\n")); |
|
globalParserState->statement->appendOperation(WQL_IS_NOT_NULL); |
} | } |
| |
truthValue | truthValue |
: TOK_TRUE | : TOK_TRUE |
{ | { |
|
$$ = 1; |
} | } |
| TOK_FALSE | | TOK_FALSE |
{ | { |
|
$$ = 0; |
} | } |
|
/************** |
|
propertyName |
|
: TOK_IDENTIFIER |
|
{ |
|
WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1)); |
|
$$ = $1; |
|
} |
|
*****************/ |
propertyName | propertyName |
: TOK_IDENTIFIER | : TOK_IDENTIFIER |
{ | { |
WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1)); | WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1)); |
$$ = $1; | $$ = $1; |
} | } |
|
| TOK_IDENTIFIER TOK_DOT TOK_IDENTIFIER |
|
{ |
|
WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s.%s)\n", $1, $3)); |
|
#ifdef PEGASUS_SNIA_EXTENSIONS |
|
// Pass anything as a property name to fool parser for SNIA testing |
|
$$ = strdup("dummy"); |
|
#else |
|
yyerror("Scoped (dotted) property names not supported"); |
|
#endif |
|
} |
|
|
| |
className : TOK_IDENTIFIER | className : TOK_IDENTIFIER |
{ | { |
|
|
comparisonTerm | comparisonTerm |
: propertyName | : propertyName |
{ | { |
|
globalParserState->statement->appendOperand( |
|
WQLOperand($1, WQL_PROPERTY_NAME_TAG)); |
|
globalParserState->statement->appendWherePropertyName(CIMName($1)); |
} | } |
| TOK_INTEGER | | TOK_INTEGER |
{ | { |
|
globalParserState->statement->appendOperand( |
|
WQLOperand($1, WQL_INTEGER_VALUE_TAG)); |
} | } |
| TOK_DOUBLE | | TOK_DOUBLE |
{ | { |
|
globalParserState->statement->appendOperand( |
|
WQLOperand($1, WQL_DOUBLE_VALUE_TAG)); |
} | } |
| TOK_STRING | | TOK_STRING |
{ | { |
|
globalParserState->statement->appendOperand( |
|
WQLOperand($1, WQL_STRING_VALUE_TAG)); |
} | } |
| truthValue | | truthValue |
{ | { |
|
globalParserState->statement->appendOperand( |
|
WQLOperand($1 != 0, WQL_BOOLEAN_VALUE_TAG)); |
} | } |
| |
%% | %% |