blob: 53e85556c16f3a479b0375967d388a57fdeabdfb [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
32#define YY_USER_ACTION \
33 do { \
34 yylloc->source = 0; \
35 yylloc->first_column = yycolumn + 1; \
Kenneth Graunke8f322212010-06-18 15:23:50 -070036 yylloc->first_line = yylineno; \
Kenneth Graunkedb938102010-06-16 17:41:12 -070037 yycolumn += yyleng; \
38 } while(0);
Kenneth Graunke388ab9f2010-07-07 11:40:51 -070039#define YY_USER_INIT yylineno = 0; yycolumn = 0;
Carl Worth3a37b872010-05-10 11:44:09 -070040%}
41
Kenneth Graunke465e03e2010-06-16 16:35:57 -070042%option bison-bridge bison-locations reentrant noyywrap
Carl Worth5070a202010-05-12 12:45:33 -070043%option extra-type="glcpp_parser_t *"
Kenneth Graunke254a4852010-06-16 11:51:43 -070044%option prefix="glcpp_"
Kenneth Graunkedb938102010-06-16 17:41:12 -070045%option stack
Carl Worth3a37b872010-05-10 11:44:09 -070046
Kenneth Graunkedb938102010-06-16 17:41:12 -070047%x DONE COMMENT
Kenneth Graunkef82d6732010-06-16 12:53:19 -070048
Carl Worth0b27b5f2010-05-10 16:16:06 -070049SPACE [[:space:]]
50NONSPACE [^[:space:]]
Carl Worth33cc4002010-05-12 12:17:10 -070051NEWLINE [\n]
Carl Worth0b27b5f2010-05-10 16:16:06 -070052HSPACE [ \t]
Carl Worthe36a4d52010-05-14 17:29:24 -070053HASH ^{HSPACE}*#{HSPACE}*
Carl Worth0b27b5f2010-05-10 16:16:06 -070054IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
Carl Worth63101692010-05-29 05:07:24 -070055PUNCTUATION [][(){}.&*~!/%<>^|;,=+-]
Carl Worth3ff81672010-05-25 13:09:03 -070056OTHER [^][(){}.&*~!/%<>^|;,=#[:space:]+-]+
Carl Worth33cc4002010-05-12 12:17:10 -070057
Carl Worth03f6d5d2010-05-24 11:29:02 -070058DECIMAL_INTEGER [1-9][0-9]*[uU]?
59OCTAL_INTEGER 0[0-7]*[uU]?
60HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
61
Carl Worth3a37b872010-05-10 11:44:09 -070062%%
63
Carl Worth25714152010-06-01 12:18:43 -070064 /* Single-line comments */
Kenneth Graunkee6ae7af2010-06-21 15:11:01 -070065"//"[^\n]*\n {
Kenneth Graunkedb938102010-06-16 17:41:12 -070066 yylineno++;
67 yycolumn = 0;
Carl Worth25714152010-06-01 12:18:43 -070068 return NEWLINE;
69}
70
71 /* Multi-line comments */
Kenneth Graunkedb938102010-06-16 17:41:12 -070072"/*" { yy_push_state(COMMENT, yyscanner); }
73<COMMENT>[^*\n]*
74<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; }
75<COMMENT>"*"+[^*/\n]*
76<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; }
77<COMMENT>"*"+"/" {
78 yy_pop_state(yyscanner);
Carl Worth25714152010-06-01 12:18:43 -070079 if (yyextra->space_tokens)
80 return SPACE;
81}
82
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070083 /* glcpp doesn't handle #extension, #version, or #pragma directives.
84 * Simply pass them through to the main compiler's lexer/parser. */
Kenneth Graunke03ee3382010-06-18 15:41:00 -070085{HASH}(extension|version|pragma)[^\n]+ {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -070086 yylval->str = xtalloc_strdup (yyextra, yytext);
Kenneth Graunke8f322212010-06-18 15:23:50 -070087 yylineno++;
88 yycolumn = 0;
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070089 return OTHER;
90}
91
Kenneth Graunke77260fc2010-06-17 14:36:34 -070092{HASH}ifdef/.*\n {
93 yyextra->space_tokens = 0;
94 return HASH_IFDEF;
95}
96
97{HASH}ifndef/.*\n {
98 yyextra->space_tokens = 0;
99 return HASH_IFNDEF;
100}
101
Kenneth Graunke12a820c2010-06-21 15:15:34 -0700102{HASH}if{HSPACE}/.*\n {
Carl Wortha771a402010-06-01 11:20:18 -0700103 yyextra->lexing_if = 1;
104 yyextra->space_tokens = 0;
105 return HASH_IF;
106}
107
108{HASH}elif/.*\n {
109 yyextra->lexing_if = 1;
110 yyextra->space_tokens = 0;
111 return HASH_ELIF;
112}
113
114{HASH}else/.*\n {
115 yyextra->space_tokens = 0;
116 return HASH_ELSE;
117}
118
119{HASH}endif/.*\n {
120 yyextra->space_tokens = 0;
121 return HASH_ENDIF;
122}
123
124 /* When skipping (due to an #if 0 or similar) consume anything
125 * up to a newline. We do this less priroty than any
126 * #if-related directive (#if, #elif, #else, #endif), but with
127 * more priority than any other directive or token to avoid
128 * any side-effects from skipped content.
129 *
130 * We use the lexing_if flag to avoid skipping any part of an
131 * if conditional expression. */
132[^\n]+/\n {
Kenneth Graunke8f322212010-06-18 15:23:50 -0700133 /* Since this rule always matches, YY_USER_ACTION gets called for it,
134 * wrongly incrementing yycolumn. We undo that effect here. */
135 yycolumn -= yyleng;
Carl Wortha771a402010-06-01 11:20:18 -0700136 if (yyextra->lexing_if ||
137 yyextra->skip_stack == NULL ||
138 yyextra->skip_stack->type == SKIP_NO_SKIP)
139 {
140 REJECT;
141 }
142}
143
Kenneth Graunke7e908a62010-07-02 15:31:26 -0700144{HASH}error.* {
145 char *p;
146 for (p = yytext; !isalpha(p[0]); p++); /* skip " # " */
147 p += 5; /* skip "error" */
148 glcpp_error(yylloc, yyextra, "#error%s", p);
149}
150
Carl Worth3ff81672010-05-25 13:09:03 -0700151{HASH}define{HSPACE}+/{IDENTIFIER}"(" {
Carl Worthf34a0002010-05-25 16:59:02 -0700152 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700153 return HASH_DEFINE_FUNC;
Carl Worthb20d33c2010-05-20 22:27:07 -0700154}
155
Carl Worth3ff81672010-05-25 13:09:03 -0700156{HASH}define {
Carl Worthf34a0002010-05-25 16:59:02 -0700157 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700158 return HASH_DEFINE_OBJ;
Carl Worthb20d33c2010-05-20 22:27:07 -0700159}
160
Carl Worth3ff81672010-05-25 13:09:03 -0700161{HASH}undef {
Carl Worthf34a0002010-05-25 16:59:02 -0700162 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700163 return HASH_UNDEF;
Carl Worth03f6d5d2010-05-24 11:29:02 -0700164}
165
Carl Worth3ff81672010-05-25 13:09:03 -0700166{HASH} {
Carl Worthf34a0002010-05-25 16:59:02 -0700167 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700168 return HASH;
Carl Worth81f01432010-05-14 17:08:45 -0700169}
170
Carl Worth8fed1cd2010-05-26 09:32:12 -0700171{DECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700172 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700173 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700174}
175
176{OCTAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700177 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700178 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700179}
180
181{HEXADECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700182 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700183 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700184}
185
Carl Worthf34a0002010-05-25 16:59:02 -0700186"<<" {
187 return LEFT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700188}
189
Carl Worthf34a0002010-05-25 16:59:02 -0700190">>" {
191 return RIGHT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700192}
193
Carl Worthf34a0002010-05-25 16:59:02 -0700194"<=" {
195 return LESS_OR_EQUAL;
196}
197
198">=" {
199 return GREATER_OR_EQUAL;
200}
201
202"==" {
203 return EQUAL;
204}
205
206"!=" {
207 return NOT_EQUAL;
208}
209
210"&&" {
211 return AND;
212}
213
214"||" {
215 return OR;
216}
217
218"##" {
219 return PASTE;
220}
221
Carl Worth8fed1cd2010-05-26 09:32:12 -0700222"defined" {
223 return DEFINED;
224}
225
Carl Worth16c1e982010-05-26 09:35:34 -0700226{IDENTIFIER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700227 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth16c1e982010-05-26 09:35:34 -0700228 return IDENTIFIER;
229}
230
Carl Worthf34a0002010-05-25 16:59:02 -0700231{PUNCTUATION} {
232 return yytext[0];
Carl Worthb1854fd2010-05-25 16:28:26 -0700233}
234
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700235{OTHER}+ {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700236 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700237 return OTHER;
Carl Worth3ff81672010-05-25 13:09:03 -0700238}
239
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700240{HSPACE}+ {
Carl Worthf34a0002010-05-25 16:59:02 -0700241 if (yyextra->space_tokens) {
Carl Worthf34a0002010-05-25 16:59:02 -0700242 return SPACE;
243 }
Carl Worth0a93cbb2010-05-13 10:29:07 -0700244}
Carl Worthfcbbb462010-05-13 09:36:23 -0700245
Carl Worth3ff81672010-05-25 13:09:03 -0700246\n {
Carl Wortha771a402010-06-01 11:20:18 -0700247 yyextra->lexing_if = 0;
Kenneth Graunkedb938102010-06-16 17:41:12 -0700248 yylineno++;
249 yycolumn = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700250 return NEWLINE;
Carl Worth33cc4002010-05-12 12:17:10 -0700251}
Carl Worth3a37b872010-05-10 11:44:09 -0700252
Kenneth Graunkef82d6732010-06-16 12:53:19 -0700253 /* Handle missing newline at EOF. */
254<INITIAL><<EOF>> {
255 BEGIN DONE; /* Don't keep matching this rule forever. */
256 yyextra->lexing_if = 0;
257 return NEWLINE;
258}
259
Carl Worth3a37b872010-05-10 11:44:09 -0700260%%
Kenneth Graunke1b1f43e2010-06-16 12:01:17 -0700261
262void
263glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader)
264{
265 yy_scan_string(shader, parser->scanner);
266}