blob: ee1f6e3aeea33ecfd851f0d41c2a8139360266a0 [file] [log] [blame]
Carl Worth3a37b872010-05-10 11:44:09 -07001%{
2/*
3 * Copyright © 2010 Intel Corporation
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
14 * Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22 * DEALINGS IN THE SOFTWARE.
23 */
24
25#include <stdio.h>
26#include <string.h>
27
Carl Wortha1e32bc2010-05-10 13:17:25 -070028#include "glcpp.h"
Carl Worth3a37b872010-05-10 11:44:09 -070029#include "glcpp-parse.h"
30%}
31
Carl Worth38aa8352010-05-10 11:52:29 -070032%option reentrant noyywrap
Carl Worth5070a202010-05-12 12:45:33 -070033%option extra-type="glcpp_parser_t *"
Carl Worth3a37b872010-05-10 11:44:09 -070034
Carl Worth81f01432010-05-14 17:08:45 -070035%x ST_DEFINE
Carl Wortha807fb72010-05-18 22:10:04 -070036%x ST_DEFINE_OBJ_OR_FUNC
37%x ST_DEFINE_PARAMETER
38%x ST_DEFINE_VALUE
Carl Worthb20d33c2010-05-20 22:27:07 -070039%x ST_IF
Carl Worth1a295002010-05-17 13:19:04 -070040%x ST_UNDEF
41%x ST_UNDEF_END
Carl Worth81f01432010-05-14 17:08:45 -070042
Carl Worth0b27b5f2010-05-10 16:16:06 -070043SPACE [[:space:]]
44NONSPACE [^[:space:]]
Carl Worth33cc4002010-05-12 12:17:10 -070045NEWLINE [\n]
Carl Worth0b27b5f2010-05-10 16:16:06 -070046HSPACE [ \t]
Carl Worthe36a4d52010-05-14 17:29:24 -070047HASH ^{HSPACE}*#{HSPACE}*
Carl Worth0b27b5f2010-05-10 16:16:06 -070048IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
Carl Worthfcbbb462010-05-13 09:36:23 -070049TOKEN [^[:space:](),]+
Carl Worth33cc4002010-05-12 12:17:10 -070050
Carl Worth03f6d5d2010-05-24 11:29:02 -070051DECIMAL_INTEGER [1-9][0-9]*[uU]?
52OCTAL_INTEGER 0[0-7]*[uU]?
53HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
54
Carl Worth3a37b872010-05-10 11:44:09 -070055%%
56
Carl Worthb20d33c2010-05-20 22:27:07 -070057{HASH}if{HSPACE}* {
58 BEGIN ST_IF;
59 return IF;
60}
61
62{HASH}elif{HSPACE}* {
63 BEGIN ST_IF;
64 return ELIF;
65}
66
Carl Worth03f6d5d2010-05-24 11:29:02 -070067<ST_IF>{DECIMAL_INTEGER} {
68 yylval.ival = strtoll (yytext, NULL, 10);
69 return INTEGER;
70}
71
72<ST_IF>{OCTAL_INTEGER} {
73 yylval.ival = strtoll (yytext + 1, NULL, 8);
74 return INTEGER;
75}
76
77<ST_IF>{HEXADECIMAL_INTEGER} {
78 yylval.ival = strtoll (yytext + 2, NULL, 16);
Carl Worthb20d33c2010-05-20 22:27:07 -070079 return INTEGER;
80}
81
Carl Worthbcbd5872010-05-24 10:37:38 -070082<ST_IF>"defined" {
83 return DEFINED;
84}
85
86<ST_IF>"<<" {
87 return LEFT_SHIFT;
88}
89
90<ST_IF>">>" {
91 return RIGHT_SHIFT;
92}
93
94<ST_IF>"<=" {
95 return LESS_OR_EQUAL;
96}
97
98<ST_IF>">=" {
99 return GREATER_OR_EQUAL;
100}
101
102<ST_IF>"==" {
103 return EQUAL;
104}
105
106<ST_IF>"!=" {
107 return NOT_EQUAL;
108}
109
110<ST_IF>"&&" {
111 return AND;
112}
113
114<ST_IF>"||" {
115 return OR;
116}
117
Carl Worth89b933a2010-05-24 11:26:42 -0700118<ST_IF>[-+*/%<>&^|()~] {
Carl Worthbcbd5872010-05-24 10:37:38 -0700119 return yytext[0];
120}
121
122<ST_IF>{IDENTIFIER} {
123 yylval.str = xtalloc_strdup (yyextra, yytext);
124 return IDENTIFIER;
125}
126
Carl Worthb20d33c2010-05-20 22:27:07 -0700127<ST_IF>{HSPACE}+
128
129<ST_IF>\n {
130 BEGIN INITIAL;
131 return NEWLINE;
132}
133
134{HASH}endif{HSPACE}* {
135 return ENDIF;
136}
137
138{HASH}else{HSPACE}* {
139 return ELSE;
140}
141
Carl Worth0a93cbb2010-05-13 10:29:07 -0700142{HASH}undef{HSPACE}* {
Carl Worth1a295002010-05-17 13:19:04 -0700143 BEGIN ST_UNDEF;
Carl Worthcd27e642010-05-12 13:11:50 -0700144 return UNDEF;
145}
146
Carl Worth1a295002010-05-17 13:19:04 -0700147<ST_UNDEF>{IDENTIFIER} {
148 BEGIN ST_UNDEF_END;
Carl Wortha807fb72010-05-18 22:10:04 -0700149 yylval.str = xtalloc_strdup (yyextra, yytext);
150 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -0700151}
152
Carl Wortha807fb72010-05-18 22:10:04 -0700153<ST_UNDEF_END>{HSPACE}*
154
Carl Worth1a295002010-05-17 13:19:04 -0700155<ST_UNDEF_END>\n {
156 BEGIN INITIAL;
Carl Worth1a295002010-05-17 13:19:04 -0700157}
158
Carl Worth0a93cbb2010-05-13 10:29:07 -0700159 /* We use the ST_DEFINE and ST_DEFVAL states so that we can
160 * pass a space token, (yes, a token for whitespace!), since
161 * the preprocessor specification requires distinguishing
162 * "#define foo()" from "#define foo ()".
163 */
164{HASH}define{HSPACE}* {
Carl Worth81f01432010-05-14 17:08:45 -0700165 BEGIN ST_DEFINE;
Carl Worth0a93cbb2010-05-13 10:29:07 -0700166 return DEFINE;
167}
Carl Worth012295f2010-05-12 13:19:23 -0700168
Carl Worth81f01432010-05-14 17:08:45 -0700169<ST_DEFINE>{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700170 BEGIN ST_DEFINE_OBJ_OR_FUNC;
Carl Worth81f01432010-05-14 17:08:45 -0700171 yylval.str = xtalloc_strdup (yyextra, yytext);
172 return IDENTIFIER;
173}
174
Carl Wortha807fb72010-05-18 22:10:04 -0700175<ST_DEFINE_OBJ_OR_FUNC>\n {
Carl Worth1a295002010-05-17 13:19:04 -0700176 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700177 return NEWLINE;
Carl Worth1a295002010-05-17 13:19:04 -0700178}
179
Carl Wortha807fb72010-05-18 22:10:04 -0700180<ST_DEFINE_OBJ_OR_FUNC>{HSPACE}+ {
181 BEGIN ST_DEFINE_VALUE;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700182 return SPACE;
Carl Worth1a295002010-05-17 13:19:04 -0700183}
184
Carl Wortha807fb72010-05-18 22:10:04 -0700185<ST_DEFINE_OBJ_OR_FUNC>"(" {
186 BEGIN ST_DEFINE_PARAMETER;
Carl Worth1a295002010-05-17 13:19:04 -0700187 return '(';
188}
189
Carl Wortha807fb72010-05-18 22:10:04 -0700190<ST_DEFINE_PARAMETER>{IDENTIFIER} {
Carl Worth1a295002010-05-17 13:19:04 -0700191 yylval.str = xtalloc_strdup (yyextra, yytext);
Carl Wortha807fb72010-05-18 22:10:04 -0700192 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -0700193}
194
Carl Wortha807fb72010-05-18 22:10:04 -0700195<ST_DEFINE_PARAMETER>"," {
196 return ',';
197}
198
199<ST_DEFINE_PARAMETER>")" {
200 BEGIN ST_DEFINE_VALUE;
201 return ')';
202}
203
204<ST_DEFINE_PARAMETER>{HSPACE}+
205
Carl Worthaaa9acb2010-05-19 13:28:24 -0700206<ST_DEFINE_VALUE>{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700207 yylval.token.type = TOKEN;
208 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700209 return TOKEN;
210}
211
212<ST_DEFINE_VALUE>[(),] {
Carl Worthb5693832010-05-20 08:01:44 -0700213 yylval.token.type = TOKEN;
214 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700215 return TOKEN;
216}
217
218<ST_DEFINE_VALUE>{HSPACE}+
219
220<ST_DEFINE_VALUE>\n {
Carl Worth81f01432010-05-14 17:08:45 -0700221 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700222 return NEWLINE;
Carl Worth81f01432010-05-14 17:08:45 -0700223}
224
Carl Worth0a93cbb2010-05-13 10:29:07 -0700225{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700226 int parameter_index;
227 yylval.str = xtalloc_strdup (yyextra, yytext);
228 switch (glcpp_parser_classify_token (yyextra, yylval.str,
229 &parameter_index))
230 {
Carl Wortha807fb72010-05-18 22:10:04 -0700231 case TOKEN_CLASS_IDENTIFIER:
232 return IDENTIFIER;
233 break;
Carl Worthb5693832010-05-20 08:01:44 -0700234 case TOKEN_CLASS_IDENTIFIER_FINALIZED:
235 return IDENTIFIER_FINALIZED;
236 break;
Carl Wortha807fb72010-05-18 22:10:04 -0700237 case TOKEN_CLASS_FUNC_MACRO:
238 return FUNC_MACRO;
239 break;
240 case TOKEN_CLASS_OBJ_MACRO:
241 return OBJ_MACRO;
242 break;
243
244 }
Carl Worthcd27e642010-05-12 13:11:50 -0700245}
246
Carl Worth0a93cbb2010-05-13 10:29:07 -0700247[(),] {
248 return yytext[0];
249}
Carl Worthfcbbb462010-05-13 09:36:23 -0700250
Carl Worth012295f2010-05-12 13:19:23 -0700251{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700252 yylval.token.type = TOKEN;
253 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worth33cc4002010-05-12 12:17:10 -0700254 return TOKEN;
255}
Carl Worth3a37b872010-05-10 11:44:09 -0700256
Carl Worth012295f2010-05-12 13:19:23 -0700257\n {
Carl Worth876e5102010-05-20 14:38:06 -0700258 yyextra->need_newline = 1;
Carl Worth012295f2010-05-12 13:19:23 -0700259}
260
Carl Worthe36a4d52010-05-14 17:29:24 -0700261{HSPACE}+
Carl Worth012295f2010-05-12 13:19:23 -0700262
Carl Worth3a37b872010-05-10 11:44:09 -0700263%%