blob: 84166fb76fc2fcf2edffc6e206007f13bb9f492f [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 Worthb20d33c2010-05-20 22:27:07 -070048INTEGER [0-9]+
Carl Worth0b27b5f2010-05-10 16:16:06 -070049IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
Carl Worthfcbbb462010-05-13 09:36:23 -070050TOKEN [^[:space:](),]+
Carl Worth33cc4002010-05-12 12:17:10 -070051
Carl Worth3a37b872010-05-10 11:44:09 -070052%%
53
Carl Worthb20d33c2010-05-20 22:27:07 -070054{HASH}if{HSPACE}* {
55 BEGIN ST_IF;
56 return IF;
57}
58
59{HASH}elif{HSPACE}* {
60 BEGIN ST_IF;
61 return ELIF;
62}
63
64<ST_IF>{INTEGER} {
65 yylval.ival = atoi (yytext);
66 return INTEGER;
67}
68
Carl Worthbcbd5872010-05-24 10:37:38 -070069<ST_IF>"defined" {
70 return DEFINED;
71}
72
73<ST_IF>"<<" {
74 return LEFT_SHIFT;
75}
76
77<ST_IF>">>" {
78 return RIGHT_SHIFT;
79}
80
81<ST_IF>"<=" {
82 return LESS_OR_EQUAL;
83}
84
85<ST_IF>">=" {
86 return GREATER_OR_EQUAL;
87}
88
89<ST_IF>"==" {
90 return EQUAL;
91}
92
93<ST_IF>"!=" {
94 return NOT_EQUAL;
95}
96
97<ST_IF>"&&" {
98 return AND;
99}
100
101<ST_IF>"||" {
102 return OR;
103}
104
105<ST_IF>[-+*/%<>&^|()] {
106 return yytext[0];
107}
108
109<ST_IF>{IDENTIFIER} {
110 yylval.str = xtalloc_strdup (yyextra, yytext);
111 return IDENTIFIER;
112}
113
Carl Worthb20d33c2010-05-20 22:27:07 -0700114<ST_IF>{HSPACE}+
115
116<ST_IF>\n {
117 BEGIN INITIAL;
118 return NEWLINE;
119}
120
121{HASH}endif{HSPACE}* {
122 return ENDIF;
123}
124
125{HASH}else{HSPACE}* {
126 return ELSE;
127}
128
Carl Worth0a93cbb2010-05-13 10:29:07 -0700129{HASH}undef{HSPACE}* {
Carl Worth1a295002010-05-17 13:19:04 -0700130 BEGIN ST_UNDEF;
Carl Worthcd27e642010-05-12 13:11:50 -0700131 return UNDEF;
132}
133
Carl Worth1a295002010-05-17 13:19:04 -0700134<ST_UNDEF>{IDENTIFIER} {
135 BEGIN ST_UNDEF_END;
Carl Wortha807fb72010-05-18 22:10:04 -0700136 yylval.str = xtalloc_strdup (yyextra, yytext);
137 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -0700138}
139
Carl Wortha807fb72010-05-18 22:10:04 -0700140<ST_UNDEF_END>{HSPACE}*
141
Carl Worth1a295002010-05-17 13:19:04 -0700142<ST_UNDEF_END>\n {
143 BEGIN INITIAL;
Carl Worth1a295002010-05-17 13:19:04 -0700144}
145
Carl Worth0a93cbb2010-05-13 10:29:07 -0700146 /* We use the ST_DEFINE and ST_DEFVAL states so that we can
147 * pass a space token, (yes, a token for whitespace!), since
148 * the preprocessor specification requires distinguishing
149 * "#define foo()" from "#define foo ()".
150 */
151{HASH}define{HSPACE}* {
Carl Worth81f01432010-05-14 17:08:45 -0700152 BEGIN ST_DEFINE;
Carl Worth0a93cbb2010-05-13 10:29:07 -0700153 return DEFINE;
154}
Carl Worth012295f2010-05-12 13:19:23 -0700155
Carl Worth81f01432010-05-14 17:08:45 -0700156<ST_DEFINE>{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700157 BEGIN ST_DEFINE_OBJ_OR_FUNC;
Carl Worth81f01432010-05-14 17:08:45 -0700158 yylval.str = xtalloc_strdup (yyextra, yytext);
159 return IDENTIFIER;
160}
161
Carl Wortha807fb72010-05-18 22:10:04 -0700162<ST_DEFINE_OBJ_OR_FUNC>\n {
Carl Worth1a295002010-05-17 13:19:04 -0700163 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700164 return NEWLINE;
Carl Worth1a295002010-05-17 13:19:04 -0700165}
166
Carl Wortha807fb72010-05-18 22:10:04 -0700167<ST_DEFINE_OBJ_OR_FUNC>{HSPACE}+ {
168 BEGIN ST_DEFINE_VALUE;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700169 return SPACE;
Carl Worth1a295002010-05-17 13:19:04 -0700170}
171
Carl Wortha807fb72010-05-18 22:10:04 -0700172<ST_DEFINE_OBJ_OR_FUNC>"(" {
173 BEGIN ST_DEFINE_PARAMETER;
Carl Worth1a295002010-05-17 13:19:04 -0700174 return '(';
175}
176
Carl Wortha807fb72010-05-18 22:10:04 -0700177<ST_DEFINE_PARAMETER>{IDENTIFIER} {
Carl Worth1a295002010-05-17 13:19:04 -0700178 yylval.str = xtalloc_strdup (yyextra, yytext);
Carl Wortha807fb72010-05-18 22:10:04 -0700179 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -0700180}
181
Carl Wortha807fb72010-05-18 22:10:04 -0700182<ST_DEFINE_PARAMETER>"," {
183 return ',';
184}
185
186<ST_DEFINE_PARAMETER>")" {
187 BEGIN ST_DEFINE_VALUE;
188 return ')';
189}
190
191<ST_DEFINE_PARAMETER>{HSPACE}+
192
Carl Worthaaa9acb2010-05-19 13:28:24 -0700193<ST_DEFINE_VALUE>{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700194 yylval.token.type = TOKEN;
195 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700196 return TOKEN;
197}
198
199<ST_DEFINE_VALUE>[(),] {
Carl Worthb5693832010-05-20 08:01:44 -0700200 yylval.token.type = TOKEN;
201 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700202 return TOKEN;
203}
204
205<ST_DEFINE_VALUE>{HSPACE}+
206
207<ST_DEFINE_VALUE>\n {
Carl Worth81f01432010-05-14 17:08:45 -0700208 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700209 return NEWLINE;
Carl Worth81f01432010-05-14 17:08:45 -0700210}
211
Carl Worth0a93cbb2010-05-13 10:29:07 -0700212{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700213 int parameter_index;
214 yylval.str = xtalloc_strdup (yyextra, yytext);
215 switch (glcpp_parser_classify_token (yyextra, yylval.str,
216 &parameter_index))
217 {
Carl Wortha807fb72010-05-18 22:10:04 -0700218 case TOKEN_CLASS_IDENTIFIER:
219 return IDENTIFIER;
220 break;
Carl Worthb5693832010-05-20 08:01:44 -0700221 case TOKEN_CLASS_IDENTIFIER_FINALIZED:
222 return IDENTIFIER_FINALIZED;
223 break;
Carl Wortha807fb72010-05-18 22:10:04 -0700224 case TOKEN_CLASS_FUNC_MACRO:
225 return FUNC_MACRO;
226 break;
227 case TOKEN_CLASS_OBJ_MACRO:
228 return OBJ_MACRO;
229 break;
230
231 }
Carl Worthcd27e642010-05-12 13:11:50 -0700232}
233
Carl Worth0a93cbb2010-05-13 10:29:07 -0700234[(),] {
235 return yytext[0];
236}
Carl Worthfcbbb462010-05-13 09:36:23 -0700237
Carl Worth012295f2010-05-12 13:19:23 -0700238{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700239 yylval.token.type = TOKEN;
240 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worth33cc4002010-05-12 12:17:10 -0700241 return TOKEN;
242}
Carl Worth3a37b872010-05-10 11:44:09 -0700243
Carl Worth012295f2010-05-12 13:19:23 -0700244\n {
Carl Worth876e5102010-05-20 14:38:06 -0700245 yyextra->need_newline = 1;
Carl Worth012295f2010-05-12 13:19:23 -0700246}
247
Carl Worthe36a4d52010-05-14 17:29:24 -0700248{HSPACE}+
Carl Worth012295f2010-05-12 13:19:23 -0700249
Carl Worth3a37b872010-05-10 11:44:09 -0700250%%