X-Git-Url: https://git.draconx.ca/gitweb/cdecl99.git/blobdiff_plain/363f15bd4b53bd90b86610b143695762037ae706..e7b2e067cd007f12227af623649a8e9204a352b1:/src/scan.l diff --git a/src/scan.l b/src/scan.l index 75657fb..54cea88 100644 --- a/src/scan.l +++ b/src/scan.l @@ -17,23 +17,43 @@ * along with this program. If not, see . */ - #include "parse.h" +#include +#include "parse.h" } -%option noyywrap bison-locations reentrant +%option nodefault noyywrap bison-locations reentrant never-interactive +%option extra-type="_Bool" +%option prefix="cdecl__yy" %{ #define lex_error(msg) do { \ - yyerror(yylloc, NULL, NULL, (msg)); \ + cdecl__yyerror(yylloc, NULL, NULL, (msg)); \ return T_LEX_ERROR; \ } while(0) + +#define dup_token() do { \ + yylval->strval = malloc(yyleng+1); \ + if (!yylval->strval) \ + lex_error("failed to allocate memory"); \ + strcpy(yylval->strval, yytext); \ +} while(0) %} +%s ENGLISH + IDENT [_[:alpha:]][_[:alnum:]]* INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+ %% +%{ + if (yyextra) { + yyextra = 0; + BEGIN(ENGLISH); + return T_ENGLISH; + } +%} + "..." return T_ELLIPSIS; ";" return T_SEMICOLON; "*" return T_ASTERISK; @@ -85,15 +105,21 @@ INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+ return T_UINT; } -{IDENT} { - yylval->strval = malloc(yyleng+1); - if (!yylval->strval) - lex_error("failed to allocate memory"); - - strcpy(yylval->strval, yytext); - return T_IDENT; +{ + "variable-length" return T_VLA; + "type" return T_TYPE; + "declare" return T_DECLARE; + "pointer" return T_POINTER; + "function" return T_FUNCTION; + "returning" return T_RETURNING; + "array" return T_ARRAY; + "to" return T_TO; + "of" return T_OF; + "as" return T_AS; } +{IDENT} { dup_token(); return T_IDENT; } + [[:space:]]+ . { char buf[] = "syntax error, unexpected #";