Merge pull request #2330 from jwillemsen/jwi-stdminmax
[ACE_TAO.git] / ACE / ace / ETCL / ETCL.ll
blobfde5839ac573c1d288b13dece22c0169e3b49adf
1 %option noyywrap
3 %{
4 // ========================================================================
5 //
6 // = LIBRARY
7 //   orbsvcs/ECTL
8 // 
9 // = FILENAME
10 //   ETCL.ll
12 // = AUTHOR
13 //   Carlos O'Ryan <coryan@uci.edu> based on previous work by
14 //   Seth Widoff <sbw1@cs.wustl.edu>
16 // ========================================================================
18 #include "ace/ETCL/ETCL_Interpreter.h"
19 #include "ace/ETCL/ETCL_y.h"
21 ACE_BEGIN_VERSIONED_NAMESPACE_DECL
23 static const char * extract_string(char*);
25 #define YY_LEX_DEBUG
27 #ifdef CONSTRAINT_DEBUG
28 #define YY_LEX_DEBUG OS::fprintf(stderr, "%s\n", yytext)
29 #endif /* CONSTRAINT_DEBUG */
31 #define YY_DECL int ETCL_yylex (ETCL_YYSTYPE *lvalp, void* state)
33 #define YY_BREAK
34 #define YY_NO_UNPUT
38 white_space     [ \t]
39 letter          [a-zA-Z]
40 digit           [0-9]
41 alpha_num       ({letter}|{digit})
42 integer         {digit}+ 
43 float           ({digit}*\.{digit}+)([eE][-+]?{digit}+)? 
44 string          '(([^'\\]*)|([^'\\]*\\')|([^'\\]*\\\\))*'
45 base            {letter}({alpha_num}|[_])*
46 ident           {base}|\\{base}
47 newline         \n
51 min             { YY_LEX_DEBUG; return ETCL_MIN; }
52 max             { YY_LEX_DEBUG; return ETCL_MAX; }
53 first           { YY_LEX_DEBUG; return ETCL_FIRST; }
54 random          { YY_LEX_DEBUG; return ETCL_RANDOM; }
55 with            { YY_LEX_DEBUG; return ETCL_WITH; }
56 exist           { YY_LEX_DEBUG; return ETCL_EXIST; }
57 not             { YY_LEX_DEBUG; return ETCL_NOT; }
58 and             { YY_LEX_DEBUG; return ETCL_AND; }
59 or              { YY_LEX_DEBUG; return ETCL_OR; }
60 in              { YY_LEX_DEBUG; return ETCL_IN; }
61 "~"             { YY_LEX_DEBUG; return ETCL_TWIDDLE; }
62 "+"             { YY_LEX_DEBUG; return ETCL_PLUS; }
63 "-"             { YY_LEX_DEBUG; return ETCL_MINUS; }
64 "*"             { YY_LEX_DEBUG; return ETCL_MULT; }
65 "/"             { YY_LEX_DEBUG; return ETCL_DIV; }
66 "<"             { YY_LEX_DEBUG; return ETCL_LT; }
67 "<="            { YY_LEX_DEBUG; return ETCL_LE; }
68 ">"             { YY_LEX_DEBUG; return ETCL_GT; }
69 ">="            { YY_LEX_DEBUG; return ETCL_GE; }
70 "=="            { YY_LEX_DEBUG; return ETCL_EQ; }
71 "!="            { YY_LEX_DEBUG; return ETCL_NE; }
72 "("             { YY_LEX_DEBUG; return ETCL_LPAREN; }
73 ")"             { YY_LEX_DEBUG; return ETCL_RPAREN; }
74 "$"             { YY_LEX_DEBUG; return ETCL_DOLLAR; }
75 "."             { YY_LEX_DEBUG; return ETCL_DOT; }
76 "default"       { YY_LEX_DEBUG; return ETCL_DEFAULT; }
77 "_d"            { YY_LEX_DEBUG; return ETCL_DISCRIMINANT; }
78 "_type_id"      { YY_LEX_DEBUG; return ETCL_TYPE_ID; }
79 "_repos_id"     { YY_LEX_DEBUG; return ETCL_REPOS_ID; }
80 "_length"       { YY_LEX_DEBUG; return ETCL_LENGTH; }
81 "["             { YY_LEX_DEBUG; return ETCL_LBRA; }
82 "]"             { YY_LEX_DEBUG; return ETCL_RBRA; }
83 TRUE            { 
84                   lvalp->constraint = 
85                     new ETCL_Literal_Constraint ((CORBA::Boolean) 1);
86                   YY_LEX_DEBUG; return ETCL_BOOLEAN;
87                 }
88 FALSE           { 
89                   lvalp->constraint = 
90                     new ETCL_Literal_Constraint ((CORBA::Boolean) 0);
91                   YY_LEX_DEBUG; return ETCL_BOOLEAN;
92                 }
93 {integer}       { 
94                   lvalp->constraint = 
95                     new ETCL_Literal_Constraint (ACE_OS::atoi (yytext));
96                   YY_LEX_DEBUG; return ETCL_INTEGER; 
97                 }
98 {float}         {
99                   double v;
100                   sscanf (yytext, "%lf", &v); 
101                   lvalp->constraint = 
102                     new ETCL_Literal_Constraint (v);
103                   YY_LEX_DEBUG; return ETCL_FLOAT; 
104                 }
105 {string}        { 
106                   lvalp->constraint =
107                     new ETCL_Literal_Constraint (extract_string (yytext));
108                   YY_LEX_DEBUG; return ETCL_STRING; 
109                 }
110 {ident}         { 
111                   lvalp->constraint = 
112                     new ETCL_Identifier (yytext);
113                   YY_LEX_DEBUG; return ETCL_IDENT; 
114                 }
115 {white_space}   { 
116                   YY_LEX_DEBUG; break; // Ignore
117                 }
118 .               { 
119                   YY_LEX_DEBUG; break; // @@ TODO
120                 }
123 const char*
124 extract_string(char* str)
126   char *t = str;
127   for (char * i = str + 1; *i != '\''; ++i, ++t)
128     {
129       if (*i == '\\')
130         {
131           ++i;
132           if (*i == 0)
133             return 0;
134           else if (*i == 't')
135             *t = '\t';
136           else if (*i == 'n')
137             *t = '\n';
138           else if (*i == '\\')
139             *t = '\\';
140           else
141             *t = *i;
142           continue;
143         }
145       *t = *i;     
146     }
148   *t = '\0';
149   return str;
153 yywrap (void)
155   return 1;
158 ACE_END_VERSIONED_NAMESPACE_DECL