(file) Return to WQL.y CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / WQL

  1 a.dunfey 1.8.8.1 //%2006////////////////////////////////////////////////////////////////////////
  2 karl     1.5     //
  3                  // Copyright (c) 2000, 2001, 2002 BMC Software; Hewlett-Packard Development
  4                  // Company, L.P.; IBM Corp.; The Open Group; Tivoli Systems.
  5                  // Copyright (c) 2003 BMC Software; Hewlett-Packard Development Company, L.P.;
  6                  // IBM Corp.; EMC Corporation, The Open Group.
  7                  // Copyright (c) 2004 BMC Software; Hewlett-Packard Development Company, L.P.;
  8                  // IBM Corp.; EMC Corporation; VERITAS Software Corporation; The Open Group.
  9                  // Copyright (c) 2005 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 10                  // EMC Corporation; VERITAS Software Corporation; The Open Group.
 11 a.dunfey 1.8.8.1 // Copyright (c) 2006 Hewlett-Packard Development Company, L.P.; IBM Corp.;
 12                  // EMC Corporation; Symantec Corporation; The Open Group.
 13 karl     1.5     //
 14                  // Permission is hereby granted, free of charge, to any person obtaining a copy
 15                  // of this software and associated documentation files (the "Software"), to
 16                  // deal in the Software without restriction, including without limitation the
 17                  // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 18                  // sell copies of the Software, and to permit persons to whom the Software is
 19                  // furnished to do so, subject to the following conditions:
 20                  // 
 21                  // THE ABOVE COPYRIGHT NOTICE AND THIS PERMISSION NOTICE SHALL BE INCLUDED IN
 22                  // ALL COPIES OR SUBSTANTIAL PORTIONS OF THE SOFTWARE. THE SOFTWARE IS PROVIDED
 23                  // "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
 24                  // LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
 25                  // PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
 26                  // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
 27                  // ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 28                  // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 29                  //
 30                  //==============================================================================
 31 mike     1.2     /*
 32                  **==============================================================================
 33                  **
 34                  ** Includes
 35                  **
 36                  **==============================================================================
 37                  */
 38                  
 39                  %{
 40                  
 41                  #include <Pegasus/Common/Config.h>
 42                  #include <Pegasus/WQL/WQLOperation.h>
 43                  #include <Pegasus/WQL/WQLOperand.h>
 44                  #include <Pegasus/WQL/WQLParserState.h>
 45                  #include <Pegasus/WQL/WQLSelectStatement.h>
 46                  #include <string.h>
 47                  #include <stdlib.h>
 48                  
 49                  #ifdef PEGASUS_OS_TYPE_WINDOWS
 50                  # include <malloc.h>
 51                  #endif
 52 mike     1.2     
 53                  #if defined(PEGASUS_COMPILER_ACC) && defined(PEGASUS_OS_HPUX)
 54                  # include <alloca.h>
 55                  #endif
 56                  
 57                  #if 0
 58                  # define WQL_TRACE(X) printf X
 59                  #else
 60                  # define WQL_TRACE(X)
 61                  #endif
 62                  
 63                  extern int WQL_lex();
 64 kumpf    1.3     extern int WQL_error(const char*);
 65 mike     1.2     
 66                  //
 67                  // Define the global parser state object:
 68                  //
 69                  
 70                  PEGASUS_USING_PEGASUS;
 71                  
 72                  PEGASUS_NAMESPACE_BEGIN
 73                  
 74                  extern WQLParserState* globalParserState;
 75                  
 76                  PEGASUS_NAMESPACE_END
 77                  
 78                  %}
 79                  
 80                  /*
 81                  **==============================================================================
 82                  **
 83                  ** Union used to pass tokens from Lexer to this Parser.
 84                  **
 85                  **==============================================================================
 86 mike     1.2     */
 87                  
 88                  %union 
 89                  {
 90                     int intValue;
 91                     double doubleValue;
 92                     char* strValue;
 93                     void* nodeValue;
 94                  }
 95                  
 96                  /*
 97                  **==============================================================================
 98                  **
 99                  ** Tokens, types, and associative rules.
100                  **
101                  **==============================================================================
102                  */
103                  
104                  %token <intValue> TOK_INTEGER
105                  %token <doubleValue> TOK_DOUBLE
106                  %token <strValue> TOK_STRING
107 mike     1.2     %token <intValue> TOK_TRUE
108                  %token <intValue> TOK_FALSE
109                  %token <intValue> TOK_NULL
110 karl     1.6     %token <intValue> TOK_ISA
111 karl     1.8     %token <intValue> TOK_DOT
112 mike     1.2     
113                  %token <intValue> TOK_EQ
114                  %token <intValue> TOK_NE
115                  %token <intValue> TOK_LT
116                  %token <intValue> TOK_LE
117                  %token <intValue> TOK_GT
118                  %token <intValue> TOK_GE
119                  
120                  %token <intValue> TOK_NOT
121                  %token <intValue> TOK_OR
122                  %token <intValue> TOK_AND
123                  %token <intValue> TOK_IS
124                  
125                  %token <strValue> TOK_IDENTIFIER
126                  %token <intValue> TOK_SELECT
127                  %token <intValue> TOK_WHERE
128                  %token <intValue> TOK_FROM
129                  
130                  %token <intValue> TOK_UNEXPECTED_CHAR
131                  
132                  %type <strValue> propertyName
133 mike     1.2     %type <nodeValue> propertyList
134                  %type <nodeValue> predicate
135                  %type <nodeValue> comparisonPredicate
136                  // %type <nodeValue> comparisonTerm
137                  %type <nodeValue> nullPredicate
138                  %type <nodeValue> searchCondition
139                  %type <nodeValue> fromClause
140                  %type <nodeValue> whereClause
141                  %type <nodeValue> selectStatement
142                  %type <nodeValue> selectList
143                  %type <nodeValue> selectExpression
144                  %type <strValue> className
145                  %type <intValue> truthValue
146                  
147                  %left TOK_OR
148                  %left TOK_AND
149                  %nonassoc TOK_NOT
150                  
151                  %%
152                  
153                  /*
154 mike     1.2     **==============================================================================
155                  **
156                  ** The grammar itself.
157                  **
158                  **==============================================================================
159                  */
160                  
161                  start
162                      : selectStatement
163                      {
164                  	WQL_TRACE(("YACC: start\n"));
165                      }
166                  
167                  selectStatement
168                      : TOK_SELECT selectList selectExpression
169                      {
170                  
171                      }
172                  
173                  selectList
174                      : '*'
175 mike     1.2         {
176 kumpf    1.4     	globalParserState->statement->setAllProperties(true);
177 mike     1.2         }
178                      | propertyList
179                      {
180                  
181                      }
182                  
183                  propertyList 
184                      : propertyName
185                      {
186 kumpf    1.4     	globalParserState->statement->appendSelectPropertyName(CIMName($1));
187 mike     1.2         }
188                      | propertyList ',' propertyName
189                      {
190 kumpf    1.4     	globalParserState->statement->appendSelectPropertyName(CIMName($3));
191 mike     1.2         }
192                  
193                  selectExpression
194                      : fromClause whereClause
195                      {
196                  
197                      }
198                      | fromClause
199                      {
200                  
201                      }
202                  
203                  fromClause
204                      : TOK_FROM className
205                      {
206                  	WQL_TRACE(("YACC: fromClause: TOK_FROM className(%s)\n", $2));
207 kumpf    1.4     	globalParserState->statement->setClassName(CIMName($2));
208 mike     1.2         }
209                  
210                  whereClause 
211                      : TOK_WHERE searchCondition
212                      {
213                  
214                      }
215                  
216                  searchCondition 
217                      : searchCondition TOK_OR searchCondition
218                      {
219                  	WQL_TRACE(("YACC: TOK_OR\n"));
220                  	globalParserState->statement->appendOperation(WQL_OR);
221                      }
222                      | searchCondition TOK_AND searchCondition
223                      {
224                  	WQL_TRACE(("YACC: TOK_AND\n"));
225                  	globalParserState->statement->appendOperation(WQL_AND);
226                      }
227                      | TOK_NOT searchCondition
228                      {
229 mike     1.2     	WQL_TRACE(("YACC: TOK_NOT\n"));
230                  
231                  	globalParserState->statement->appendOperation(WQL_NOT);
232                      }
233                      | '(' searchCondition ')'
234                      {
235                  
236                      }
237                      | predicate
238                      {
239                  
240                      }
241                      | predicate TOK_IS truthValue
242                      {
243                  	WQLOperation op = $3 ? WQL_IS_TRUE : WQL_IS_FALSE;
244                  	globalParserState->statement->appendOperation(op);
245                      }
246                      | predicate TOK_IS TOK_NOT truthValue
247                      {
248                  	WQLOperation op = $4 ? WQL_IS_NOT_TRUE : WQL_IS_NOT_FALSE;
249                  	globalParserState->statement->appendOperation(op);
250 mike     1.2         }
251                  
252                  /******************************************************************************/
253                  
254                  predicate
255                      : comparisonPredicate
256                      {
257                  
258                      }
259                      | nullPredicate
260                      {
261                  
262                      }
263                  
264                  comparisonPredicate
265                      : comparisonTerm TOK_LT comparisonTerm 
266                      {
267                  	WQL_TRACE(("YACC: TOK_LT\n"));
268                  	globalParserState->statement->appendOperation(WQL_LT);
269                      }
270                      | comparisonTerm TOK_GT comparisonTerm
271 mike     1.2         {
272                  	WQL_TRACE(("YACC: TOK_GT\n"));
273                  	globalParserState->statement->appendOperation(WQL_GT);
274                      }
275                      | comparisonTerm TOK_LE comparisonTerm
276                      {
277                  	WQL_TRACE(("YACC: TOK_LE\n"));
278                  	globalParserState->statement->appendOperation(WQL_LE);
279                      }
280                      | comparisonTerm TOK_GE comparisonTerm
281                      {
282                  	WQL_TRACE(("YACC: TOK_GE\n"));
283                  	globalParserState->statement->appendOperation(WQL_GE);
284                      }
285                      | comparisonTerm TOK_EQ comparisonTerm
286                      {
287                  	WQL_TRACE(("YACC: TOK_EQ\n"));
288                  	globalParserState->statement->appendOperation(WQL_EQ);
289                      }
290                      | comparisonTerm TOK_NE comparisonTerm
291                      {
292 mike     1.2     	WQL_TRACE(("YACC: TOK_NE\n"));
293                  	globalParserState->statement->appendOperation(WQL_NE);
294                      }
295 karl     1.6         | propertyName TOK_ISA className
296                      {
297 karl     1.7         WQL_TRACE(("YACC: TOK_ISA\n"));
298 karl     1.8     #ifndef PEGASUS_SNIA_EXTENSIONS
299                          // If SNIA tests, allow the ISA but do not pass className
300 karl     1.7             yyerror("ISA Token Not Supported");
301 karl     1.8     #endif
302 karl     1.6         }
303 mike     1.2     
304                  nullPredicate
305                      : comparisonTerm TOK_IS TOK_NULL
306                      {
307                  	WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NULL\n"));
308                  	globalParserState->statement->appendOperation(WQL_IS_NULL);
309                      }
310                      | comparisonTerm TOK_IS TOK_NOT TOK_NULL
311                      {
312                  	WQL_TRACE(("YACC: nullPredicate : comparisonTerm IS NOT NULL\n"));
313                  	globalParserState->statement->appendOperation(WQL_IS_NOT_NULL);
314                      }
315                  
316                  truthValue 
317                      : TOK_TRUE 
318                      {
319                  	$$ = 1;
320                      }
321                      | TOK_FALSE
322                      {
323                  	$$ = 0;
324 mike     1.2         }
325 karl     1.8     /**************
326 mike     1.2     propertyName 
327                      : TOK_IDENTIFIER
328                      {
329                  	WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1));
330                  	$$ = $1;
331                      }
332 karl     1.8     *****************/
333                  propertyName
334                      : TOK_IDENTIFIER
335                      {
336                          WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s)\n", $1));
337                          $$ = $1;
338                      }
339                      | TOK_IDENTIFIER TOK_DOT TOK_IDENTIFIER
340                      {
341                          WQL_TRACE(("YACC: propertyName : TOK_IDENTIFIER(%s.%s)\n", $1, $3));
342                  #ifdef PEGASUS_SNIA_EXTENSIONS
343                          // Pass anything as a property name to fool parser for SNIA testing
344                          $$ = strdup("dummy");
345                  #else
346                          yyerror("Scoped (dotted) property names not supported");
347                  #endif
348                      }
349                  
350 mike     1.2     
351                  className : TOK_IDENTIFIER
352                      {
353                  	WQL_TRACE(("YACC: TOK_IDENTIFIER %s\n", $1));
354                  	$$ = $1;
355                      }
356                  
357                  comparisonTerm
358                      : propertyName
359                      {
360                  	globalParserState->statement->appendOperand(
361                  	    WQLOperand($1, WQL_PROPERTY_NAME_TAG));
362 kumpf    1.4     	globalParserState->statement->appendWherePropertyName(CIMName($1));
363 mike     1.2         }
364                      | TOK_INTEGER
365                      {
366                  	globalParserState->statement->appendOperand(
367                  	    WQLOperand($1, WQL_INTEGER_VALUE_TAG));
368                      }
369                      | TOK_DOUBLE
370                      {
371                  	globalParserState->statement->appendOperand(
372                  	    WQLOperand($1, WQL_DOUBLE_VALUE_TAG));
373                      }
374                      | TOK_STRING
375                      {
376                  	globalParserState->statement->appendOperand(
377                  	    WQLOperand($1, WQL_STRING_VALUE_TAG));
378                      }
379                      | truthValue
380                      {
381                  	globalParserState->statement->appendOperand(
382                  	    WQLOperand($1 != 0, WQL_BOOLEAN_VALUE_TAG));
383                      }
384 mike     1.2     
385                  %%

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2