]> git.draconx.ca Git - cdecl99.git/blobdiff - src/scan.l
Use assert(0) instead of abort for exceptional cases.
[cdecl99.git] / src / scan.l
index 5c1a960651d591f4cfd75bcc10658a55b260df95..b17d4ee6802d44acfafdb974a9b0313fc8bb86fa 100644 (file)
 
 %option noyywrap bison-locations
 
+%{
+#define lex_error(msg) do { \
+       yyerror(yylloc, NULL, (msg)); \
+       return T_LEX_ERROR; \
+} while(0)
+%}
+
+IDENT [_[:alpha:]][_[:alnum:]]*
+INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
+
 %%
 
+";" return T_SEMICOLON;
+"*" return T_ASTERISK;
+"(" return T_LPAREN;
+")" return T_RPAREN;
+"[" return T_LBRACKET;
+"]" return T_RBRACKET;
+"," return T_COMMA;
+
+"typedef"  return T_TYPEDEF;
+"extern"   return T_EXTERN;
+"static"   return T_STATIC;
+"auto"     return T_AUTO;
+"register" return T_REGISTER;
+
+"restrict" return T_RESTRICT;
+"volatile" return T_VOLATILE;
+"const"    return T_CONST;
+
+"inline"   return T_INLINE;
+
+"void"     return T_VOID;
+"char"     return T_CHAR;
+"short"    return T_SHORT;
+"int"      return T_INT;
+"long"     return T_LONG;
+"float"    return T_FLOAT;
+"double"   return T_DOUBLE;
+"signed"   return T_SIGNED;
+"unsigned" return T_UNSIGNED;
+"_Bool"    return T_BOOL;
+"_Complex" return T_COMPLEX;
+
+"struct"   return T_STRUCT;
+"union"    return T_UNION;
+"enum"     return T_ENUM;
+
+{INTEGER} {
+       char *end;
+
+       errno = 0;
+       yylval->uintval = strtoumax(yytext, &end, 0);
+       if (errno == ERANGE)
+               lex_error("integer constant out of range");
+       if (*end)
+               lex_error("invalid integer constant");
+
+       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;
+}
+
+[[:space:]]+
+. {
+       char buf[] = "syntax error, unexpected #";
+       *strchr(buf, '#') = *yytext;
+       lex_error(buf);
+}