[mugiwara] easier parser to read
[ozulis.git] / src / plugins / lang / mugiwara / bison-parser / lexer.l
blob3fe6a015289a274744363a9d5da79eac61254694
1 %option reentrant noyywrap batch
2 %option bison-bridge bison-locations yylineno
3 %option warn
5 %{
6 #include <stdio.h>
7 #include <stdlib.h>
9 #include <ozulis/core/assert.hh>
10 #include <ozulis/ast/ast.hh>
11 #include <ozulis/ast/node-factory.hh>
12 #include "parser.hh"
14 #define YY_USER_ACTION                                  \
15   yylloc->first_line = yylineno;                        \
16   yylloc->last_line = yylineno;                         \
17   yylloc->first_column = yylloc->last_column;           \
18   yylloc->last_column += yyleng;
20 #define MAKE_BOOL(Value)                                                \
21   do {                                                                  \
22     yylval->nbExp = new ozulis::ast::NumberExp();                       \
23     yylval->nbExp->type = ozulis::ast::NodeFactory::createBoolType();   \
24     yylval->nbExp->number = Value;                                      \
25     return NUMBER;                                                      \
26   } while (0)
28 static ozulis::ast::NumberExp *
29 makeInteger(double value, int size, bool isSigned);
31 static ozulis::ast::NumberExp *
32 makeFloat(double value);
38 \n                      /* ignore end of line */yylloc->last_column = 0;
39 [ \t]+                  /* ignore whitespace */;
40 \/\/.*$                 /* line comment */
41 #.*$                    /* line comment */
43 ;                       return ';';
44 \.                      return '.';
45 :                       return ':';
46 ,                       return ',';
48 =                       return '=';
49 ==                      return EQEQ;
50 !=                      return NEQ;
51 \<                      return '<';
52 \<=                     return LTEQ;
53 >                       return '>';
54 >=                      return GTEQ;
56 \(                      return '(';
57 \)                      return ')';
59 \[                      return '[';
60 \]                      return ']';
62 \{                      return '{';
63 \}                      return '}';
65 \+                      return '+';
66 -                       return '-';
67 \*                      return '*';
68 \/                      return '/';
69 %                       return '%';
71 \|                      return '|';
72 &                       return '&';
73 \^                      return '^';
74 \<\<                    return SHL;
75 >>                      return LSHR;
76 >>>                     return ASHR;
77 ~                       return '~';
79 !                       return '!';
80 \|\|                    return OROR;
81 &&                      return ANDAND;
83 @                       return '@';
84 \$                      return '$';
86 \"[^\"]*\"              return STRING;
88 const                   return CONST;
89 goto                    return GOTO;
90 cast                    return CAST;
91 if                      return IF;
92 else                    return ELSE;
93 while                   return WHILE;
94 do                      return DO;
95 for                     return FOR;
96 return                  return RETURN;
97 true                    MAKE_BOOL(1);
98 false                   MAKE_BOOL(0);
100 [a-zA-Z][a-zA-Z0-9_]*   yylval->string = strdup(yytext); return ID;
102 ([0-9]+)?\.[0-9]+    {
103   yylval->nbExp = makeFloat(strtod(yytext, 0));
104   return NUMBER;
107 [0-9]+    {
108   yylval->nbExp = makeInteger(strtod(yytext, 0), 32, true);
109   return NUMBER;
112 [0-9]+U    {
113   yylval->nbExp = makeInteger(strtod(yytext, 0), 32, false);
114   return NUMBER;
117 [0-9]+L    {
118   yylval->nbExp = makeInteger(strtod(yytext, 0), 64, true);
119   return NUMBER;
122 [0-9]+UL    {
123   yylval->nbExp = makeInteger(strtod(yytext, 0), 64, false);
124   return NUMBER;
127 .               return *yytext;
131 static ozulis::ast::NumberExp *
132 makeInteger(double value, int size, bool isSigned)
134   ozulis::ast::NumberExp * nbExp = new ozulis::ast::NumberExp();
135   ozulis::ast::IntegerType * nbType = new ozulis::ast::IntegerType();
136   nbType->size = size;
137   nbType->isSigned = isSigned;
138   nbExp->type = nbType;
139   nbExp->number = value;
140   return nbExp;
143 static ozulis::ast::NumberExp *
144 makeFloat(double value)
146   ozulis::ast::NumberExp * nbExp = new ozulis::ast::NumberExp();
147   ozulis::ast::FloatType * nbType = new ozulis::ast::FloatType();
148   nbExp->type = nbType;
149   nbExp->number = value;
150   return nbExp;