blob: 29b276939743d600db5f510aa1dcf29f6981a316 [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>
Kenneth Graunke7e908a62010-07-02 15:31:26 -070027#include <ctype.h>
Carl Worth3a37b872010-05-10 11:44:09 -070028
Carl Wortha1e32bc2010-05-10 13:17:25 -070029#include "glcpp.h"
Carl Worth3a37b872010-05-10 11:44:09 -070030#include "glcpp-parse.h"
Kenneth Graunkedb938102010-06-16 17:41:12 -070031
Carl Wortha9bb4bc2010-07-20 15:03:20 -070032/* Flex annoyingly generates some functions without making them
33 * static. Let's declare them here. */
34int glcpp_get_column (yyscan_t yyscanner);
35void glcpp_set_column (int column_no , yyscan_t yyscanner);
36
Kenneth Graunkedb938102010-06-16 17:41:12 -070037#define YY_USER_ACTION \
38 do { \
39 yylloc->source = 0; \
40 yylloc->first_column = yycolumn + 1; \
Kenneth Graunke8f322212010-06-18 15:23:50 -070041 yylloc->first_line = yylineno; \
Kenneth Graunkedb938102010-06-16 17:41:12 -070042 yycolumn += yyleng; \
43 } while(0);
Kenneth Graunke388ab9f2010-07-07 11:40:51 -070044#define YY_USER_INIT yylineno = 0; yycolumn = 0;
Carl Worth3a37b872010-05-10 11:44:09 -070045%}
46
Kenneth Graunke465e03e2010-06-16 16:35:57 -070047%option bison-bridge bison-locations reentrant noyywrap
Carl Worth5070a202010-05-12 12:45:33 -070048%option extra-type="glcpp_parser_t *"
Kenneth Graunke254a4852010-06-16 11:51:43 -070049%option prefix="glcpp_"
Kenneth Graunkedb938102010-06-16 17:41:12 -070050%option stack
Carl Worth3a37b872010-05-10 11:44:09 -070051
Kenneth Graunkedb938102010-06-16 17:41:12 -070052%x DONE COMMENT
Kenneth Graunkef82d6732010-06-16 12:53:19 -070053
Carl Worth0b27b5f2010-05-10 16:16:06 -070054SPACE [[:space:]]
55NONSPACE [^[:space:]]
Carl Worth33cc4002010-05-12 12:17:10 -070056NEWLINE [\n]
Carl Worth0b27b5f2010-05-10 16:16:06 -070057HSPACE [ \t]
Carl Worthe36a4d52010-05-14 17:29:24 -070058HASH ^{HSPACE}*#{HSPACE}*
Carl Worth0b27b5f2010-05-10 16:16:06 -070059IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
Carl Worth63101692010-05-29 05:07:24 -070060PUNCTUATION [][(){}.&*~!/%<>^|;,=+-]
Carl Worth3ff81672010-05-25 13:09:03 -070061OTHER [^][(){}.&*~!/%<>^|;,=#[:space:]+-]+
Carl Worth33cc4002010-05-12 12:17:10 -070062
Carl Worth03f6d5d2010-05-24 11:29:02 -070063DECIMAL_INTEGER [1-9][0-9]*[uU]?
64OCTAL_INTEGER 0[0-7]*[uU]?
65HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
66
Carl Worth3a37b872010-05-10 11:44:09 -070067%%
68
Carl Worth25714152010-06-01 12:18:43 -070069 /* Single-line comments */
Kenneth Graunkee6ae7af2010-06-21 15:11:01 -070070"//"[^\n]*\n {
Kenneth Graunkedb938102010-06-16 17:41:12 -070071 yylineno++;
72 yycolumn = 0;
Carl Worth25714152010-06-01 12:18:43 -070073 return NEWLINE;
74}
75
76 /* Multi-line comments */
Kenneth Graunkedb938102010-06-16 17:41:12 -070077"/*" { yy_push_state(COMMENT, yyscanner); }
78<COMMENT>[^*\n]*
79<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; }
80<COMMENT>"*"+[^*/\n]*
81<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; }
82<COMMENT>"*"+"/" {
83 yy_pop_state(yyscanner);
Carl Worth25714152010-06-01 12:18:43 -070084 if (yyextra->space_tokens)
85 return SPACE;
86}
87
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070088 /* glcpp doesn't handle #extension, #version, or #pragma directives.
89 * Simply pass them through to the main compiler's lexer/parser. */
Kenneth Graunke03ee3382010-06-18 15:41:00 -070090{HASH}(extension|version|pragma)[^\n]+ {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -070091 yylval->str = xtalloc_strdup (yyextra, yytext);
Kenneth Graunke8f322212010-06-18 15:23:50 -070092 yylineno++;
93 yycolumn = 0;
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070094 return OTHER;
95}
96
Kenneth Graunke77260fc2010-06-17 14:36:34 -070097{HASH}ifdef/.*\n {
Carl Worth1d7e03e2010-07-20 14:13:32 -070098 yyextra->lexing_if = 1;
Kenneth Graunke77260fc2010-06-17 14:36:34 -070099 yyextra->space_tokens = 0;
100 return HASH_IFDEF;
101}
102
103{HASH}ifndef/.*\n {
Carl Worth1d7e03e2010-07-20 14:13:32 -0700104 yyextra->lexing_if = 1;
Kenneth Graunke77260fc2010-06-17 14:36:34 -0700105 yyextra->space_tokens = 0;
106 return HASH_IFNDEF;
107}
108
Carl Worth1d7e03e2010-07-20 14:13:32 -0700109{HASH}if/[^_a-zA-Z0-9].*\n {
Carl Wortha771a402010-06-01 11:20:18 -0700110 yyextra->lexing_if = 1;
111 yyextra->space_tokens = 0;
112 return HASH_IF;
113}
114
115{HASH}elif/.*\n {
116 yyextra->lexing_if = 1;
117 yyextra->space_tokens = 0;
118 return HASH_ELIF;
119}
120
121{HASH}else/.*\n {
122 yyextra->space_tokens = 0;
123 return HASH_ELSE;
124}
125
126{HASH}endif/.*\n {
127 yyextra->space_tokens = 0;
128 return HASH_ENDIF;
129}
130
131 /* When skipping (due to an #if 0 or similar) consume anything
Carl Worth1d7e03e2010-07-20 14:13:32 -0700132 * up to a newline. We do this with less priority than any
Carl Wortha771a402010-06-01 11:20:18 -0700133 * #if-related directive (#if, #elif, #else, #endif), but with
134 * more priority than any other directive or token to avoid
135 * any side-effects from skipped content.
136 *
137 * We use the lexing_if flag to avoid skipping any part of an
138 * if conditional expression. */
139[^\n]+/\n {
Kenneth Graunke8f322212010-06-18 15:23:50 -0700140 /* Since this rule always matches, YY_USER_ACTION gets called for it,
141 * wrongly incrementing yycolumn. We undo that effect here. */
142 yycolumn -= yyleng;
Carl Wortha771a402010-06-01 11:20:18 -0700143 if (yyextra->lexing_if ||
144 yyextra->skip_stack == NULL ||
145 yyextra->skip_stack->type == SKIP_NO_SKIP)
146 {
147 REJECT;
148 }
149}
150
Kenneth Graunke7e908a62010-07-02 15:31:26 -0700151{HASH}error.* {
152 char *p;
153 for (p = yytext; !isalpha(p[0]); p++); /* skip " # " */
154 p += 5; /* skip "error" */
155 glcpp_error(yylloc, yyextra, "#error%s", p);
156}
157
Carl Worth3ff81672010-05-25 13:09:03 -0700158{HASH}define{HSPACE}+/{IDENTIFIER}"(" {
Carl Worthf34a0002010-05-25 16:59:02 -0700159 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700160 return HASH_DEFINE_FUNC;
Carl Worthb20d33c2010-05-20 22:27:07 -0700161}
162
Carl Worth3ff81672010-05-25 13:09:03 -0700163{HASH}define {
Carl Worthf34a0002010-05-25 16:59:02 -0700164 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700165 return HASH_DEFINE_OBJ;
Carl Worthb20d33c2010-05-20 22:27:07 -0700166}
167
Carl Worth3ff81672010-05-25 13:09:03 -0700168{HASH}undef {
Carl Worthf34a0002010-05-25 16:59:02 -0700169 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700170 return HASH_UNDEF;
Carl Worth03f6d5d2010-05-24 11:29:02 -0700171}
172
Carl Worth3ff81672010-05-25 13:09:03 -0700173{HASH} {
Carl Worthf34a0002010-05-25 16:59:02 -0700174 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700175 return HASH;
Carl Worth81f01432010-05-14 17:08:45 -0700176}
177
Carl Worth8fed1cd2010-05-26 09:32:12 -0700178{DECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700179 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700180 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700181}
182
183{OCTAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700184 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700185 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700186}
187
188{HEXADECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700189 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700190 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700191}
192
Carl Worthf34a0002010-05-25 16:59:02 -0700193"<<" {
194 return LEFT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700195}
196
Carl Worthf34a0002010-05-25 16:59:02 -0700197">>" {
198 return RIGHT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700199}
200
Carl Worthf34a0002010-05-25 16:59:02 -0700201"<=" {
202 return LESS_OR_EQUAL;
203}
204
205">=" {
206 return GREATER_OR_EQUAL;
207}
208
209"==" {
210 return EQUAL;
211}
212
213"!=" {
214 return NOT_EQUAL;
215}
216
217"&&" {
218 return AND;
219}
220
221"||" {
222 return OR;
223}
224
225"##" {
226 return PASTE;
227}
228
Carl Worth8fed1cd2010-05-26 09:32:12 -0700229"defined" {
230 return DEFINED;
231}
232
Carl Worth16c1e982010-05-26 09:35:34 -0700233{IDENTIFIER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700234 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth16c1e982010-05-26 09:35:34 -0700235 return IDENTIFIER;
236}
237
Carl Worthf34a0002010-05-25 16:59:02 -0700238{PUNCTUATION} {
239 return yytext[0];
Carl Worthb1854fd2010-05-25 16:28:26 -0700240}
241
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700242{OTHER}+ {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700243 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700244 return OTHER;
Carl Worth3ff81672010-05-25 13:09:03 -0700245}
246
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700247{HSPACE}+ {
Carl Worthf34a0002010-05-25 16:59:02 -0700248 if (yyextra->space_tokens) {
Carl Worthf34a0002010-05-25 16:59:02 -0700249 return SPACE;
250 }
Carl Worth0a93cbb2010-05-13 10:29:07 -0700251}
Carl Worthfcbbb462010-05-13 09:36:23 -0700252
Carl Worth3ff81672010-05-25 13:09:03 -0700253\n {
Carl Wortha771a402010-06-01 11:20:18 -0700254 yyextra->lexing_if = 0;
Kenneth Graunkedb938102010-06-16 17:41:12 -0700255 yylineno++;
256 yycolumn = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700257 return NEWLINE;
Carl Worth33cc4002010-05-12 12:17:10 -0700258}
Carl Worth3a37b872010-05-10 11:44:09 -0700259
Kenneth Graunkef82d6732010-06-16 12:53:19 -0700260 /* Handle missing newline at EOF. */
261<INITIAL><<EOF>> {
262 BEGIN DONE; /* Don't keep matching this rule forever. */
263 yyextra->lexing_if = 0;
264 return NEWLINE;
265}
266
Carl Worth3a37b872010-05-10 11:44:09 -0700267%%
Kenneth Graunke1b1f43e2010-06-16 12:01:17 -0700268
269void
270glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader)
271{
272 yy_scan_string(shader, parser->scanner);
273}