3 * Scanner for C declarations.
4 * Copyright © 2011 Nick Bowler
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.
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.
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/>.
24 %option nodefault noyywrap bison-locations reentrant never-interactive
25 %option extra-type="_Bool"
26 %option prefix="cdecl__yy"
29 #define lex_error(msg) do { \
30 cdecl__yyerror(yylloc, NULL, NULL, (msg)); \
34 #define dup_token() do { \
35 yylval->strval = malloc(yyleng+1); \
36 if (!yylval->strval) \
37 lex_error("failed to allocate memory"); \
38 strcpy(yylval->strval, yytext); \
44 IDENT [_[:alpha:]][_[:alnum:]]*
45 INTEGER 0x[[:xdigit:]]+|0[0-7]+|[[:digit:]]+
57 "..." return T_ELLIPSIS;
58 ";" return T_SEMICOLON;
59 "*" return T_ASTERISK;
62 "[" return T_LBRACKET;
63 "]" return T_RBRACKET;
66 "typedef" return T_TYPEDEF;
67 "extern" return T_EXTERN;
68 "static" return T_STATIC;
70 "register" return T_REGISTER;
72 "restrict" return T_RESTRICT;
73 "volatile" return T_VOLATILE;
74 "const" return T_CONST;
76 "inline" return T_INLINE;
80 "short" return T_SHORT;
83 "float" return T_FLOAT;
84 "double" return T_DOUBLE;
85 "signed" return T_SIGNED;
86 "unsigned" return T_UNSIGNED;
87 "_Bool" return T_BOOL;
88 "_Complex" return T_COMPLEX;
89 "_Imaginary" return T_IMAGINARY;
91 "struct" return T_STRUCT;
92 "union" return T_UNION;
99 yylval->uintval = strtoumax(yytext, &end, 0);
101 lex_error("integer constant out of range");
103 lex_error("invalid integer constant");
109 "variable-length" return T_VLA;
110 "type" return T_TYPE;
111 "declare" return T_DECLARE;
112 "pointer" return T_POINTER;
113 "function" return T_FUNCTION;
114 "returning" return T_RETURNING;
115 "array" return T_ARRAY;
121 {IDENT} { dup_token(); return T_IDENT; }
125 char buf[] = "syntax error, unexpected #";
126 *strchr(buf, '#') = *yytext;