]> git.draconx.ca Git - cdecl99.git/blob - src/scan.l
Use assert(0) instead of abort for exceptional cases.
[cdecl99.git] / src / scan.l
1 %top{
2 /*
3  *  Scanner for C declarations.
4  *  Copyright © 2011 Nick Bowler
5  *
6  *  This program is free software: you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation, either version 3 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
18  */
19
20  #include "parse.h"
21 }
22
23 %option noyywrap bison-locations
24
25 %{
26 #define lex_error(msg) do { \
27         yyerror(yylloc, NULL, (msg)); \
28         return T_LEX_ERROR; \
29 } while(0)
30 %}
31
32 IDENT [_[:alpha:]][_[:alnum:]]*
33 INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
34
35 %%
36
37 ";" return T_SEMICOLON;
38 "*" return T_ASTERISK;
39 "(" return T_LPAREN;
40 ")" return T_RPAREN;
41 "[" return T_LBRACKET;
42 "]" return T_RBRACKET;
43 "," return T_COMMA;
44
45 "typedef"  return T_TYPEDEF;
46 "extern"   return T_EXTERN;
47 "static"   return T_STATIC;
48 "auto"     return T_AUTO;
49 "register" return T_REGISTER;
50
51 "restrict" return T_RESTRICT;
52 "volatile" return T_VOLATILE;
53 "const"    return T_CONST;
54
55 "inline"   return T_INLINE;
56
57 "void"     return T_VOID;
58 "char"     return T_CHAR;
59 "short"    return T_SHORT;
60 "int"      return T_INT;
61 "long"     return T_LONG;
62 "float"    return T_FLOAT;
63 "double"   return T_DOUBLE;
64 "signed"   return T_SIGNED;
65 "unsigned" return T_UNSIGNED;
66 "_Bool"    return T_BOOL;
67 "_Complex" return T_COMPLEX;
68
69 "struct"   return T_STRUCT;
70 "union"    return T_UNION;
71 "enum"     return T_ENUM;
72
73 {INTEGER} {
74         char *end;
75
76         errno = 0;
77         yylval->uintval = strtoumax(yytext, &end, 0);
78         if (errno == ERANGE)
79                 lex_error("integer constant out of range");
80         if (*end)
81                 lex_error("invalid integer constant");
82
83         return T_UINT;
84 }
85
86 {IDENT} {
87         yylval->strval = malloc(yyleng+1);
88         if (!yylval->strval)
89                 lex_error("failed to allocate memory");
90
91         strcpy(yylval->strval, yytext);
92         return T_IDENT;
93 }
94
95 [[:space:]]+
96 . {
97         char buf[] = "syntax error, unexpected #";
98         *strchr(buf, '#') = *yytext;
99         lex_error(buf);
100 }