blob: 825ce3d370925457e8cd822bac12587d609684ae [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
69<ST_IF>{HSPACE}+
70
71<ST_IF>\n {
72 BEGIN INITIAL;
73 return NEWLINE;
74}
75
76{HASH}endif{HSPACE}* {
77 return ENDIF;
78}
79
80{HASH}else{HSPACE}* {
81 return ELSE;
82}
83
Carl Worth0a93cbb2010-05-13 10:29:07 -070084{HASH}undef{HSPACE}* {
Carl Worth1a295002010-05-17 13:19:04 -070085 BEGIN ST_UNDEF;
Carl Worthcd27e642010-05-12 13:11:50 -070086 return UNDEF;
87}
88
Carl Worth1a295002010-05-17 13:19:04 -070089<ST_UNDEF>{IDENTIFIER} {
90 BEGIN ST_UNDEF_END;
Carl Wortha807fb72010-05-18 22:10:04 -070091 yylval.str = xtalloc_strdup (yyextra, yytext);
92 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -070093}
94
Carl Wortha807fb72010-05-18 22:10:04 -070095<ST_UNDEF_END>{HSPACE}*
96
Carl Worth1a295002010-05-17 13:19:04 -070097<ST_UNDEF_END>\n {
98 BEGIN INITIAL;
Carl Worth1a295002010-05-17 13:19:04 -070099}
100
Carl Worth0a93cbb2010-05-13 10:29:07 -0700101 /* We use the ST_DEFINE and ST_DEFVAL states so that we can
102 * pass a space token, (yes, a token for whitespace!), since
103 * the preprocessor specification requires distinguishing
104 * "#define foo()" from "#define foo ()".
105 */
106{HASH}define{HSPACE}* {
Carl Worth81f01432010-05-14 17:08:45 -0700107 BEGIN ST_DEFINE;
Carl Worth0a93cbb2010-05-13 10:29:07 -0700108 return DEFINE;
109}
Carl Worth012295f2010-05-12 13:19:23 -0700110
Carl Worth81f01432010-05-14 17:08:45 -0700111<ST_DEFINE>{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700112 BEGIN ST_DEFINE_OBJ_OR_FUNC;
Carl Worth81f01432010-05-14 17:08:45 -0700113 yylval.str = xtalloc_strdup (yyextra, yytext);
114 return IDENTIFIER;
115}
116
Carl Wortha807fb72010-05-18 22:10:04 -0700117<ST_DEFINE_OBJ_OR_FUNC>\n {
Carl Worth1a295002010-05-17 13:19:04 -0700118 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700119 return NEWLINE;
Carl Worth1a295002010-05-17 13:19:04 -0700120}
121
Carl Wortha807fb72010-05-18 22:10:04 -0700122<ST_DEFINE_OBJ_OR_FUNC>{HSPACE}+ {
123 BEGIN ST_DEFINE_VALUE;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700124 return SPACE;
Carl Worth1a295002010-05-17 13:19:04 -0700125}
126
Carl Wortha807fb72010-05-18 22:10:04 -0700127<ST_DEFINE_OBJ_OR_FUNC>"(" {
128 BEGIN ST_DEFINE_PARAMETER;
Carl Worth1a295002010-05-17 13:19:04 -0700129 return '(';
130}
131
Carl Wortha807fb72010-05-18 22:10:04 -0700132<ST_DEFINE_PARAMETER>{IDENTIFIER} {
Carl Worth1a295002010-05-17 13:19:04 -0700133 yylval.str = xtalloc_strdup (yyextra, yytext);
Carl Wortha807fb72010-05-18 22:10:04 -0700134 return IDENTIFIER;
Carl Worth1a295002010-05-17 13:19:04 -0700135}
136
Carl Wortha807fb72010-05-18 22:10:04 -0700137<ST_DEFINE_PARAMETER>"," {
138 return ',';
139}
140
141<ST_DEFINE_PARAMETER>")" {
142 BEGIN ST_DEFINE_VALUE;
143 return ')';
144}
145
146<ST_DEFINE_PARAMETER>{HSPACE}+
147
Carl Worthaaa9acb2010-05-19 13:28:24 -0700148<ST_DEFINE_VALUE>{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700149 yylval.token.type = TOKEN;
150 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700151 return TOKEN;
152}
153
154<ST_DEFINE_VALUE>[(),] {
Carl Worthb5693832010-05-20 08:01:44 -0700155 yylval.token.type = TOKEN;
156 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worthaaa9acb2010-05-19 13:28:24 -0700157 return TOKEN;
158}
159
160<ST_DEFINE_VALUE>{HSPACE}+
161
162<ST_DEFINE_VALUE>\n {
Carl Worth81f01432010-05-14 17:08:45 -0700163 BEGIN INITIAL;
Carl Worthaaa9acb2010-05-19 13:28:24 -0700164 return NEWLINE;
Carl Worth81f01432010-05-14 17:08:45 -0700165}
166
Carl Worth0a93cbb2010-05-13 10:29:07 -0700167{IDENTIFIER} {
Carl Wortha807fb72010-05-18 22:10:04 -0700168 int parameter_index;
169 yylval.str = xtalloc_strdup (yyextra, yytext);
170 switch (glcpp_parser_classify_token (yyextra, yylval.str,
171 &parameter_index))
172 {
Carl Wortha807fb72010-05-18 22:10:04 -0700173 case TOKEN_CLASS_IDENTIFIER:
174 return IDENTIFIER;
175 break;
Carl Worthb5693832010-05-20 08:01:44 -0700176 case TOKEN_CLASS_IDENTIFIER_FINALIZED:
177 return IDENTIFIER_FINALIZED;
178 break;
Carl Wortha807fb72010-05-18 22:10:04 -0700179 case TOKEN_CLASS_FUNC_MACRO:
180 return FUNC_MACRO;
181 break;
182 case TOKEN_CLASS_OBJ_MACRO:
183 return OBJ_MACRO;
184 break;
185
186 }
Carl Worthcd27e642010-05-12 13:11:50 -0700187}
188
Carl Worth0a93cbb2010-05-13 10:29:07 -0700189[(),] {
190 return yytext[0];
191}
Carl Worthfcbbb462010-05-13 09:36:23 -0700192
Carl Worth012295f2010-05-12 13:19:23 -0700193{TOKEN} {
Carl Worthb5693832010-05-20 08:01:44 -0700194 yylval.token.type = TOKEN;
195 yylval.token.value = xtalloc_strdup (yyextra, yytext);
Carl Worth33cc4002010-05-12 12:17:10 -0700196 return TOKEN;
197}
Carl Worth3a37b872010-05-10 11:44:09 -0700198
Carl Worth012295f2010-05-12 13:19:23 -0700199\n {
Carl Worth876e5102010-05-20 14:38:06 -0700200 yyextra->need_newline = 1;
Carl Worth012295f2010-05-12 13:19:23 -0700201}
202
Carl Worthe36a4d52010-05-14 17:29:24 -0700203{HSPACE}+
Carl Worth012295f2010-05-12 13:19:23 -0700204
Carl Worth3a37b872010-05-10 11:44:09 -0700205%%