(file) Return to cimmof.l CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Compiler

  1 martin 1.18 /*
  2             //%LICENSE////////////////////////////////////////////////////////////////
  3 martin 1.19 //
  4 martin 1.18 // Licensed to The Open Group (TOG) under one or more contributor license
  5             // agreements.  Refer to the OpenPegasusNOTICE.txt file distributed with
  6             // this work for additional information regarding copyright ownership.
  7             // Each contributor licenses this file to you under the OpenPegasus Open
  8             // Source License; you may not use this file except in compliance with the
  9             // License.
 10 martin 1.19 //
 11 martin 1.18 // Permission is hereby granted, free of charge, to any person obtaining a
 12             // copy of this software and associated documentation files (the "Software"),
 13             // to deal in the Software without restriction, including without limitation
 14             // the rights to use, copy, modify, merge, publish, distribute, sublicense,
 15             // and/or sell copies of the Software, and to permit persons to whom the
 16             // Software is furnished to do so, subject to the following conditions:
 17 martin 1.19 //
 18 martin 1.18 // The above copyright notice and this permission notice shall be included
 19             // in all copies or substantial portions of the Software.
 20 martin 1.19 //
 21 martin 1.18 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 22 martin 1.19 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 23 martin 1.18 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 24             // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 25             // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 26             // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 27             // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 28 martin 1.19 //
 29 martin 1.18 //////////////////////////////////////////////////////////////////////////
 30             */
 31 karl   1.10 
 32 bob    1.1  %option never-interactive
 33 e.boden 1.7  %option stack
 34              %option yylineno
 35 karl    1.14 %{
 36 bob     1.1  
 37 karl    1.20 
 38 bob     1.1  #include "cimmofParser.h"
 39              #include "memobjs.h"
 40              #include "cimmof_tab.h"
 41              
 42 kumpf   1.16 /* Avoid warn_unused_result warnings in Linux RPM build */
 43 kumpf   1.17 #ifndef ECHO
 44 karl    1.22 # define ECHO do { fwrite(yytext, yyleng, 1, yyout); } while(0)
 45 kumpf   1.17 #endif
 46 kumpf   1.16 
 47 bob     1.1  /*---------------------------------------------------------------*/
 48              /* These routines wrap certain flex functions, keeping down the  */
 49              /* number of external dependencies                               */
 50              /*---------------------------------------------------------------*/
 51              int get_yy_buf_size_wrapper() { return YY_BUF_SIZE; }
 52              
 53 karl    1.14 void * get_cimmof__current_buffer_wrapper() {
 54                return (void *)YY_CURRENT_BUFFER;
 55 bob     1.1  }
 56              
 57              void * create_cimmof_buffer_wrapper(const FILE *f, int size) {
 58                return (void *)yy_create_buffer((FILE *)f, size);
 59              }
 60              
 61 kumpf   1.5  int switch_to_buffer_wrapper(void *buffstate, Boolean closeCurrent) {
 62                if (closeCurrent)
 63                {
 64                   if (yyin != NULL)
 65                   {
 66                      fflush(yyin);
 67                      fclose(yyin);
 68                      yyin = NULL;
 69                   }
 70                   yy_delete_buffer(YY_CURRENT_BUFFER);
 71                }
 72 bob     1.1    yy_switch_to_buffer((YY_BUFFER_STATE)buffstate);
 73                return 0;
 74              }
 75              
 76 e.boden 1.7  char  strbuf[1024], *strbuf_p, slashx[2];
 77 bob     1.1  
 78 karl    1.21 /* Pointer to name for metaQualifiers communicated between lexer and parser */
 79              char * metaQualifierName;
 80              
 81 bob     1.1  
 82              %}
 83              
 84              
 85 gs.keenan 1.9  %x myStr myHex
 86 bob       1.1  %%
 87                
 88                
 89 karl      1.14 \n             { cimmofParser::Instance()->increment_lineno(); }
 90                \/\/.*[\r\n]?  { cimmofParser::Instance()->increment_lineno(); }
 91                [ \t\r]        { /* skip white space */ }
 92                class          { return(TOK_CLASS); }
 93                \{             { return(TOK_LEFTCURLYBRACE); }
 94                \}             { return(TOK_RIGHTCURLYBRACE); }
 95                \[             { return(TOK_LEFTSQUAREBRACKET); }
 96                \]             { return(TOK_RIGHTSQUAREBRACKET); }
 97                \(             { return(TOK_LEFTPAREN); }
 98                \)             { return(TOK_RIGHTPAREN); }
 99                \:             { return(TOK_COLON); }
100                ;              { return(TOK_SEMICOLON); }
101 kumpf     1.15 [+-]?[0-9]*\.[0-9]+([eE][+-]?[0-9]+)? {
102 karl      1.14                    cimmof_lval.strval = new String(yytext);
103                                   return(TOK_REAL_VALUE); }
104 kumpf     1.15 [+-]?0[0-7]+   { cimmof_lval.strval = new String(yytext);
105 karl      1.14                    return(TOK_OCTAL_VALUE); }
106 kumpf     1.15 [+-]?0x[0-9A-Fa-f]+ { cimmof_lval.strval = new String(yytext);
107 karl      1.14                    return(TOK_HEX_VALUE); }
108 kumpf     1.15 [+-]?[01]+[Bb] { cimmof_lval.strval = new String(yytext);
109 karl      1.14                    return(TOK_BINARY_VALUE); }
110 kumpf     1.15 [1-9][0-9]*    { cimmof_lval.strval = new String(yytext);
111 karl      1.14                    return(TOK_POSITIVE_DECIMAL_VALUE); }
112 kumpf     1.15 [+-]?[0-9]+    { /* Note: All non-zero unsigned integers are handled above */
113                                 cimmof_lval.strval = new String(yytext);
114 karl      1.14                    return(TOK_SIGNED_DECIMAL_VALUE); }
115                \=             { return(TOK_EQUAL); }
116                ,              { return(TOK_COMMA); }
117                \'.+\'         { cimmof_lval.strval = new String(yytext);
118                                   return(TOK_CHAR_VALUE); }
119                
120                    /*--- bugzilla 544 fix; handle string escapes ---
121                
122                       an impl. decision: invalid escape sequences
123                       are simply ignored, and left in the string.
124                
125                       an impl. decision: yyleng is set to the len
126                       of resulting string, not the len of the matched
127                       token(s), since they are different, with escapes.
128                       (but note; cimmof.y does not use yyleng!)
129                
130                       an impl. req't: strings are returned to parser
131 karl      1.21        with enclosing "s.
132 karl      1.14     */
133                
134                \"             { BEGIN(myStr); strbuf_p = strbuf;
135                               /**strbuf_p++ = '"';*/ }
136                <myStr>\"      { BEGIN(INITIAL);
137                               /**strbuf_p++ = '"';*/  *strbuf_p = '\0';
138                                  cimmof_leng = strbuf_p - strbuf;
139                                  cimmof_lval.strval = new String(strbuf);
140                                  return TOK_STRING_VALUE; }
141                <myStr><<EOF>> |
142                <myStr>\n      { BEGIN(INITIAL);
143                               /**strbuf_p++ = '"';*/  *strbuf_p = '\0';
144                                  cimmof_leng = strbuf_p - strbuf;
145                                  cimmof_lval.strval = new String(strbuf);
146                                  return TOK_UNEXPECTED_CHAR; }
147                <myStr>\\b     { /* backspace */        *strbuf_p++ = '\b'; }
148                <myStr>\\f     { /* form feed */        *strbuf_p++ = '\f'; }
149                <myStr>\\n     { /* line feed */        *strbuf_p++ = '\n'; }
150                <myStr>\\r     { /* carriage return */  *strbuf_p++ = '\r'; }
151                <myStr>\\t     { /* horizontal tab */   *strbuf_p++ = '\t'; }
152                <myStr>\\'     { /* single quote */     *strbuf_p++ = '\''; }
153 karl      1.14 <myStr>\\\"    { /* double quote */     *strbuf_p++ = '"';  }
154                <myStr>\\\\    { /* backslash */        *strbuf_p++ = '\\'; }
155                <myStr>\\[xX]  { yy_push_state(myHex);
156                                  memcpy(slashx,yytext,2);
157                               }
158                <myStr>\\(.|\n)         { *strbuf_p++ = '\\';
159                                        *strbuf_p++ = yytext[1]; }
160                <myStr>[^\\\n\"]+       { char *t = yytext;
161                                            while( *t ) *strbuf_p++ = *t++;
162                                            *strbuf_p = '\0'; }
163                <myHex>[0-9A-Fa-f]{1,4} { /* get escaped hex digits */
164                                            char  hexfmt[4];   unsigned int n;
165                                            sprintf( hexfmt, "%%%dx", yyleng );
166                                            sscanf(yytext, hexfmt, &n);
167                                            if (n>255) {
168                                                memcpy(strbuf_p,slashx,2);
169                                                strbuf_p += 2;
170                                                char *t = yytext;
171                                                while( *t ) *strbuf_p++ = *t++;
172                                            }
173                                            else *strbuf_p++ = (char)n;
174 karl      1.14                                 yy_pop_state();
175                                        }
176                <myHex>.                { memcpy(strbuf_p,slashx,2);
177                                              strbuf_p += 2;
178                                              *strbuf_p++ = *yytext;
179                                              yy_pop_state();
180                                        }
181                                        /* --- end of bugzilla 544 fix --- */
182                
183                
184                \/\*                    {   int c1=0, c2=yyinput();
185                                                for(;;) {
186                                                     if (c2==EOF) break;
187                                                     if (c1=='*' && c2=='/') break;
188                                                     c1=c2;
189                                                     c2=yyinput();
190                                                }
191                                        }
192                <<EOF>>                              { yyterminate(); }
193                [Nn][Uu][Ll][Ll]                     { return(TOK_NULL_VALUE); }
194                [Tt][Rr][Uu][Ee]                     { return(TOK_TRUE); }
195 karl      1.14 [Ff][Aa][Ll][Ss][Ee]                 { return(TOK_FALSE); }
196                \.                                   { return(TOK_PERIOD); }
197                \#[Pp][Rr][Aa][Gg][Mm][Aa]           { return(TOK_PRAGMA); }
198                [Ii][Nn][Ss][Tt][Aa][Nn][Cc][Ee]     { return(TOK_INSTANCE); }
199                [Oo][Ff]                             { return(TOK_OF); }
200 bob       1.1  [Qq][Uu][Aa][Ll][Ii][Ff][Ii][Ee][Rr] {return(TOK_QUALIFIER); }
201 karl      1.14 [Ss][Cc][Oo][Pp][Ee]                 { return(TOK_SCOPE); }
202 karl      1.21 
203                [Aa][Ss][Ss][Oo][Cc][Ii][Aa][Tt][Ii][Oo][Nn] {
204                                                       metaQualifierName = strdup(yytext);
205                                                       return(TOK_ASSOCIATION); }
206 karl      1.22 [Ii][Nn][Dd][Ii][Cc][Aa][Tt][Ii][Oo][Nn] {
207 karl      1.21                                        metaQualifierName = strdup(yytext);
208                                                       return(TOK_INDICATION); }
209                
210 karl      1.14 [Pp][Rr][Oo][Pp][Ee][Rr][Tt][Yy]     { return(TOK_PROPERTY); }
211 bob       1.1  [Rr][Ee][Ff][Ee][Rr][Ee][Nn][Cc][Ee] { return(TOK_REFERENCE); }
212 karl      1.14 [Mm][Ee][Tt][Hh][Oo][Dd]             { return(TOK_METHOD); }
213 bob       1.1  [Pp][Aa][Rr][Aa][Mm][Ee][Tt][Ee][Rr] {return(TOK_PARAMETER); }
214 karl      1.14 [Aa][Nn][Yy]                         { return(TOK_ANY); }
215 karl      1.21 
216 karl      1.14 [Rr][Ee][Ff]                         { return(TOK_REF); }
217                [Ff][Ll][Aa][Vv][Oo][Rr]             { return(TOK_FLAVOR); }
218 bob       1.1  [Ee][Nn][Aa][Bb][Ll][Ee][Oo][Vv][Ee][Rr][Rr][Ii][Dd][Ee] {
219 karl      1.14                                          return(TOK_ENABLEOVERRIDE); }
220 bob       1.1  [Dd][Ii][Ss][Aa][Bb][Ll][Ee][Oo][Vv][Ee][Rr][Rr][Ii][Dd][Ee] {
221 karl      1.14                                          return(TOK_DISABLEOVERRIDE); }
222                [Rr][Ee][Ss][Tt][Rr][Ii][Cc][Tt][Ee][Dd] { return(TOK_RESTRICTED); }
223                [Tt][Oo][Ss][Uu][Bb][Cc][Ll][Aa][Ss][Ss] { return(TOK_TOSUBCLASS); }
224                [Tt][Rr][Aa][Nn][Ss][Ll][Aa][Tt][Aa][Bb][Ll][Ee] { return(TOK_TRANSLATABLE); }
225                [Ii][Nn][Cc][Ll][Uu][Dd][Ee]         { return(TOK_INCLUDE); }
226                $[_$0-9a-zA-Z]+                      { cimmof_lval.strval = new String(yytext);
227                                                       return TOK_ALIAS_IDENTIFIER; }
228                [Aa][Ss]                             { return TOK_AS; }
229                [Ss][Tt][Rr][Ii][Nn][Gg]             { return(TOK_DT_STR); }
230                [Bb][Oo][Oo][Ll][Ee][Aa][Nn]         { return(TOK_DT_BOOL); }
231                [Dd][Aa][Tt][Ee][Tt][Ii][Mm][Ee]     { return(TOK_DT_DATETIME); }
232                [Uu][Ii][Nn][Tt]8                    { return(TOK_DT_UINT8); }
233                [Uu][Ii][Nn][Tt]16                   { return(TOK_DT_UINT16); }
234                [Uu][Ii][Nn][Tt]32                   { return(TOK_DT_UINT32); }
235                [Uu][Ii][Nn][Tt]64                   { return(TOK_DT_UINT64); }
236                [Ss][Ii][Nn][Tt]8                    { return(TOK_DT_SINT8); }
237                [Ss][Ii][Nn][Tt]16                   { return(TOK_DT_SINT16); }
238                [Ss][Ii][Nn][Tt]32                   { return(TOK_DT_SINT32); }
239                [Ss][Ii][Nn][Tt]64                   { return(TOK_DT_SINT64); }
240                [Rr][Ee][Aa][Ll]32                   { return(TOK_DT_REAL32); }
241                [Rr][Ee][Aa][Ll]64                   { return(TOK_DT_REAL64); }
242 karl      1.14 [Cc][Hh][Aa][Rr]8                    { return(TOK_DT_CHAR8); }
243                [Cc][Hh][Aa][Rr]16                   { return(TOK_DT_CHAR16); }
244                [_a-zA-Z][_$0-9a-zA-Z]*              { cimmof_lval.strval = new String(yytext);
245                                                         return(TOK_SIMPLE_IDENTIFIER); }
246                .                                    { cimmof_lval.strval = new String(yytext);
247                                                         return(TOK_UNEXPECTED_CHAR); }
248 bob       1.1  
249                %%
250                
251 karl      1.23 void cimmof_yy_less(int n) { yyless(n); }
252                
253                // Implemented to hide bison functions that are defined but not used
254                // so compiler unused warnings can be enabled.  The functions defined in ths
255                // dummy function are those current defined by Flex but never called by
256                // Pegasus lex definitions. Since each compiler has different rules for
257                // hiding unused functions, we implement each that we know.
258                // CLANG can use the pragma below.
259                // GCC hides the unused function through the recursive call
260                // NOT tested with other compilers.
261                #ifdef __clang__
262                #pragma clang diagnostic push
263                #pragma clang diagnostic ignored "-Wunused-function"
264                #endif
265                static void UNUSED_LEX_FUNCTIONS()
266                {
267                   UNUSED_LEX_FUNCTIONS();    // call itself to avoid unused function warning
268                   yyunput(3, (char *)"");    // call unused lex functions
269                   yy_top_state();
270                }
271                #ifdef __clang__
272 karl      1.23 #pragma clang diagnostic pop
273                #endif

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2