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