Checking in miniswig: It's a flex/bison based parser that is able to parse
[supertux.git] / tools / miniswig / lexer.ll
1 %{
2 #include <math.h>
3 #include <stdlib.h>
4 #include "tree.h"
5 #include "parser.hpp"
6 #include "globals.h"
7
8 #define YY_DECL int yylex YY_PROTO(( YYSTYPE* yylval ))
9
10 #define YY_INPUT(buf, result, max_size)                     \
11 {                                                           \
12     input->read(buf, max_size);                             \
13     result = input->gcount();                               \
14 }
15     
16 %}
17
18 %option noyywrap
19 %option yylineno
20 /* %option never-interactive */
21
22 %%
23
24 [[:space:]]+                            /* eat spaces */
25 \/\*.*\*\/                              /* eat comment */
26 \/\/[^\n]*\n                            /* eat comment */        
27 class                                   { return T_CLASS; }
28 struct                                  { return T_STRUCT; }
29 static                                  { return T_STATIC; }
30 const                                   { return T_CONST; }
31 unsigned                                { return T_UNSIGNED; }
32 signed                                  { return T_SIGNED; }
33 void                                    { return T_VOID; }
34 bool                                    { return T_BOOL; }
35 char                                    { return T_CHAR; }
36 short                                   { return T_SHORT; }
37 int                                     { return T_INT; }
38 long                                    { return T_LONG; }
39 float                                   { return T_FLOAT; }
40 double                                  { return T_DOUBLE; }
41 public                                  { return T_PUBLIC; }
42 protected                               { return T_PROTECTED; }
43 private                                 { return T_PRIVATE; }
44 [a-zA-Z_][a-zA-Z_0-9]*                  {
45         // is it a type?
46         for(std::vector<AtomicType*>::iterator i = unit->types.begin();
47                 i != unit->types.end(); ++i) {
48             AtomicType* type = *i;
49             if(type->name == yytext) {
50                 yylval->atomic_type = type;
51                 return T_ATOMIC_TYPE;
52             }
53         }
54         // or a namespace? (hack for now...)
55         if(strcmp(yytext, "std") == 0) {
56             yylval->_namespace = unit->namespaces[0];
57             return T_NAMESPACE;
58         }
59         yylval->str = strdup(yytext);
60         return T_ID;
61 }
62 \:\:                                    { return T_DDCOL; }
63 [0-9]+                                  { 
64                                             yylval->ival = atoi(yytext);
65                                             return T_INT;
66                                         }
67 [0-9]*\.[0-9]+(e[0-9]+)?                { 
68                                             yylval->fval = atof(yytext);
69                                             return T_FLOAT;
70                                         }
71 \".*\"                                  {
72                                             yylval->str = strdup(yytext);
73                                             return T_STRING;
74                                         }
75 .                                       { return yytext[0]; }
76
77 %%
78