1%{
2#include <stdlib.h>
3#include <stdio.h>
4#include <string.h>
5#include <assert.h>
6#include "y.tab.h"
7
8#ifdef TEST_PARSER
9#include "../../../include/octopus/parser/ast.h"
10#else
11#include <octopus/parser/ast.h>
12#endif
13
14// not in C99 :-(
15char* strdup(const char*);
16void octyy_error(char *);
17%}
18%option reentrant
19%option extra-type="struct string_buffer *"
20%option bison-bridge
21%option noyywrap
22%option nounput
23%option noinput
24%option never-interactive
25
26RBRACKET \[
27LBRACKET \]
28RCURLY \{
29LCURLY \}
30COLON \:
31COMMA ,
32
33ALPHA  [A-Za-z]
34LALPHA [a-z]
35DIGIT  [0-9]
36DIGIT19 [1-9]
37DIGITS ({DIGIT})+
38
39ALPHA_NUMERIC {ALPHA}|{DIGIT}
40IDENT {LALPHA}({ALPHA_NUMERIC}|[._-])*
41VARIABLE [_]
42
43INTEGER {DIGIT}|{DIGIT19}{DIGITS}|-{DIGIT}|-{DIGIT19}{DIGITS}
44FRACTION \.{DIGITS}
45FLOAT  {INTEGER}{FRACTION}|{FRACTION}
46NUMBER {INTEGER}
47SCAN [%]{ALPHA}
48BOOL  true|false
49
50
51SPACE ([\ \n\r\t\f])+
52
53UNESCAPEDCHAR [ -!#-\[\]-~]
54ESCAPEDCHAR \\['"\\bfnrt/]
55CHAR {UNESCAPEDCHAR}|{ESCAPEDCHAR}
56CHARS {CHAR}+
57QUOTE [']
58REGEX_START r{QUOTE}
59
60%x REG
61%x OSTR
62
63%%
64{BOOL}      {
65                yylval->integer = (strcmp(yytext, "true") == 0) ? 1 : 0;
66                return BOOL;
67            }
68
69{FLOAT}     {
70                yylval->dl = atof(yytext);
71                return FLOAT;
72            }
73
74
75{IDENT}     {
76                yylval->str = strdup(yytext);
77                return IDENT;
78            }
79
80{SCAN}      {
81                yylval->c = yytext[1];
82                return SCAN;
83            }
84
85{VARIABLE}  {
86                return VARIABLE;
87            }
88
89{REGEX_START}      { yyextra->ptr = yyextra->buffer; BEGIN(REG); }
90
91<REG>\'        { /* saw closing quote - all done */
92     BEGIN(INITIAL);
93     *yyextra->ptr = '\0';
94     yylval->str = strdup(yyextra->buffer);
95     return REGEX;
96     }
97
98<REG>[^\']+        {
99     char *yptr = yytext;
100
101     while ( *yptr )
102             *yyextra->ptr++ = *yptr++;
103     }
104
105
106\'     { yyextra->ptr = yyextra->buffer; BEGIN(OSTR); }
107
108<OSTR>\'        { /* saw closing quote - all done */
109     BEGIN(INITIAL);
110     *yyextra->ptr = '\0';
111     yylval->str = strdup(yyextra->buffer);
112     return STRING;
113     }
114
115<OSTR>[^\']+        {
116     char *yptr = yytext;
117
118     while ( *yptr )
119             *yyextra->ptr++ = *yptr++;
120     }
121
122{NUMBER}   {
123                yylval->integer = atoll(yytext);
124                return NUMBER;
125            }
126
127{RCURLY}        return RCURLY;
128{LCURLY}        return LCURLY;
129{RBRACKET}      return RBRACKET;
130{COMMA}         return COMMA;
131{LBRACKET}      return LBRACKET;
132{COLON}         return COLON;
133
134">"             return GT;
135">="            return GE;
136"<"             return LT;
137"<="            return LE;
138"=="            return EQ;
139"!="            return NE;
140
141
142\n          { }
143{SPACE}     { /* eat up whitespace */ }
144
145<<EOF>>     return END_OF_INPUT;
146
147.           {
148                octyy_error("Unexpected input!");
149            }
150
151%%
152