blob: 3703ad90fe23d8f323554336932c623b56e174c0 [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"
Kenneth Graunkedb938102010-06-16 17:41:12 -070030
31#define YY_USER_ACTION \
32 do { \
33 yylloc->source = 0; \
34 yylloc->first_column = yycolumn + 1; \
35 yylloc->first_line = yylineno + 1; \
36 yycolumn += yyleng; \
37 } while(0);
Carl Worth3a37b872010-05-10 11:44:09 -070038%}
39
Kenneth Graunke465e03e2010-06-16 16:35:57 -070040%option bison-bridge bison-locations reentrant noyywrap
Carl Worth5070a202010-05-12 12:45:33 -070041%option extra-type="glcpp_parser_t *"
Kenneth Graunke254a4852010-06-16 11:51:43 -070042%option prefix="glcpp_"
Kenneth Graunkedb938102010-06-16 17:41:12 -070043%option stack
Carl Worth3a37b872010-05-10 11:44:09 -070044
Kenneth Graunkedb938102010-06-16 17:41:12 -070045%x DONE COMMENT
Kenneth Graunkef82d6732010-06-16 12:53:19 -070046
Carl Worth0b27b5f2010-05-10 16:16:06 -070047SPACE [[:space:]]
48NONSPACE [^[:space:]]
Carl Worth33cc4002010-05-12 12:17:10 -070049NEWLINE [\n]
Carl Worth0b27b5f2010-05-10 16:16:06 -070050HSPACE [ \t]
Carl Worthe36a4d52010-05-14 17:29:24 -070051HASH ^{HSPACE}*#{HSPACE}*
Carl Worth0b27b5f2010-05-10 16:16:06 -070052IDENTIFIER [_a-zA-Z][_a-zA-Z0-9]*
Carl Worth63101692010-05-29 05:07:24 -070053PUNCTUATION [][(){}.&*~!/%<>^|;,=+-]
Carl Worth3ff81672010-05-25 13:09:03 -070054OTHER [^][(){}.&*~!/%<>^|;,=#[:space:]+-]+
Carl Worth33cc4002010-05-12 12:17:10 -070055
Carl Worth03f6d5d2010-05-24 11:29:02 -070056DECIMAL_INTEGER [1-9][0-9]*[uU]?
57OCTAL_INTEGER 0[0-7]*[uU]?
58HEXADECIMAL_INTEGER 0[xX][0-9a-fA-F]+[uU]?
59
Carl Worth3a37b872010-05-10 11:44:09 -070060%%
61
Carl Worth25714152010-06-01 12:18:43 -070062 /* Single-line comments */
63"//"[^\n]+\n {
Kenneth Graunkedb938102010-06-16 17:41:12 -070064 yylineno++;
65 yycolumn = 0;
Carl Worth25714152010-06-01 12:18:43 -070066 return NEWLINE;
67}
68
69 /* Multi-line comments */
Kenneth Graunkedb938102010-06-16 17:41:12 -070070"/*" { yy_push_state(COMMENT, yyscanner); }
71<COMMENT>[^*\n]*
72<COMMENT>[^*\n]*\n { yylineno++; yycolumn = 0; }
73<COMMENT>"*"+[^*/\n]*
74<COMMENT>"*"+[^*/\n]*\n { yylineno++; yycolumn = 0; }
75<COMMENT>"*"+"/" {
76 yy_pop_state(yyscanner);
Carl Worth25714152010-06-01 12:18:43 -070077 if (yyextra->space_tokens)
78 return SPACE;
79}
80
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070081 /* glcpp doesn't handle #extension, #version, or #pragma directives.
82 * Simply pass them through to the main compiler's lexer/parser. */
83{HASH}(extension|version|pragma).*\n {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -070084 yylval->str = xtalloc_strdup (yyextra, yytext);
Kenneth Graunke3b73ea32010-06-16 12:21:17 -070085 return OTHER;
86}
87
Kenneth Graunke77260fc2010-06-17 14:36:34 -070088{HASH}ifdef/.*\n {
89 yyextra->space_tokens = 0;
90 return HASH_IFDEF;
91}
92
93{HASH}ifndef/.*\n {
94 yyextra->space_tokens = 0;
95 return HASH_IFNDEF;
96}
97
Carl Wortha771a402010-06-01 11:20:18 -070098{HASH}if/.*\n {
99 yyextra->lexing_if = 1;
100 yyextra->space_tokens = 0;
101 return HASH_IF;
102}
103
104{HASH}elif/.*\n {
105 yyextra->lexing_if = 1;
106 yyextra->space_tokens = 0;
107 return HASH_ELIF;
108}
109
110{HASH}else/.*\n {
111 yyextra->space_tokens = 0;
112 return HASH_ELSE;
113}
114
115{HASH}endif/.*\n {
116 yyextra->space_tokens = 0;
117 return HASH_ENDIF;
118}
119
120 /* When skipping (due to an #if 0 or similar) consume anything
121 * up to a newline. We do this less priroty than any
122 * #if-related directive (#if, #elif, #else, #endif), but with
123 * more priority than any other directive or token to avoid
124 * any side-effects from skipped content.
125 *
126 * We use the lexing_if flag to avoid skipping any part of an
127 * if conditional expression. */
128[^\n]+/\n {
129 if (yyextra->lexing_if ||
130 yyextra->skip_stack == NULL ||
131 yyextra->skip_stack->type == SKIP_NO_SKIP)
132 {
133 REJECT;
134 }
135}
136
Carl Worth3ff81672010-05-25 13:09:03 -0700137{HASH}define{HSPACE}+/{IDENTIFIER}"(" {
Carl Worthf34a0002010-05-25 16:59:02 -0700138 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700139 return HASH_DEFINE_FUNC;
Carl Worthb20d33c2010-05-20 22:27:07 -0700140}
141
Carl Worth3ff81672010-05-25 13:09:03 -0700142{HASH}define {
Carl Worthf34a0002010-05-25 16:59:02 -0700143 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700144 return HASH_DEFINE_OBJ;
Carl Worthb20d33c2010-05-20 22:27:07 -0700145}
146
Carl Worth3ff81672010-05-25 13:09:03 -0700147{HASH}undef {
Carl Worthf34a0002010-05-25 16:59:02 -0700148 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700149 return HASH_UNDEF;
Carl Worth03f6d5d2010-05-24 11:29:02 -0700150}
151
Carl Worth3ff81672010-05-25 13:09:03 -0700152{HASH} {
Carl Worthf34a0002010-05-25 16:59:02 -0700153 yyextra->space_tokens = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700154 return HASH;
Carl Worth81f01432010-05-14 17:08:45 -0700155}
156
Carl Worth8fed1cd2010-05-26 09:32:12 -0700157{DECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700158 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700159 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700160}
161
162{OCTAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700163 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700164 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700165}
166
167{HEXADECIMAL_INTEGER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700168 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth050e3de2010-05-27 14:36:29 -0700169 return INTEGER_STRING;
Carl Worth8fed1cd2010-05-26 09:32:12 -0700170}
171
Carl Worthf34a0002010-05-25 16:59:02 -0700172"<<" {
173 return LEFT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700174}
175
Carl Worthf34a0002010-05-25 16:59:02 -0700176">>" {
177 return RIGHT_SHIFT;
Carl Worthb1854fd2010-05-25 16:28:26 -0700178}
179
Carl Worthf34a0002010-05-25 16:59:02 -0700180"<=" {
181 return LESS_OR_EQUAL;
182}
183
184">=" {
185 return GREATER_OR_EQUAL;
186}
187
188"==" {
189 return EQUAL;
190}
191
192"!=" {
193 return NOT_EQUAL;
194}
195
196"&&" {
197 return AND;
198}
199
200"||" {
201 return OR;
202}
203
204"##" {
205 return PASTE;
206}
207
Carl Worth8fed1cd2010-05-26 09:32:12 -0700208"defined" {
209 return DEFINED;
210}
211
Carl Worth16c1e982010-05-26 09:35:34 -0700212{IDENTIFIER} {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700213 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth16c1e982010-05-26 09:35:34 -0700214 return IDENTIFIER;
215}
216
Carl Worthf34a0002010-05-25 16:59:02 -0700217{PUNCTUATION} {
218 return yytext[0];
Carl Worthb1854fd2010-05-25 16:28:26 -0700219}
220
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700221{OTHER}+ {
Kenneth Graunkee0e429f2010-06-16 16:26:28 -0700222 yylval->str = xtalloc_strdup (yyextra, yytext);
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700223 return OTHER;
Carl Worth3ff81672010-05-25 13:09:03 -0700224}
225
Carl Worth9fb8b7a2010-05-25 15:04:32 -0700226{HSPACE}+ {
Carl Worthf34a0002010-05-25 16:59:02 -0700227 if (yyextra->space_tokens) {
Carl Worthf34a0002010-05-25 16:59:02 -0700228 return SPACE;
229 }
Carl Worth0a93cbb2010-05-13 10:29:07 -0700230}
Carl Worthfcbbb462010-05-13 09:36:23 -0700231
Carl Worth3ff81672010-05-25 13:09:03 -0700232\n {
Carl Wortha771a402010-06-01 11:20:18 -0700233 yyextra->lexing_if = 0;
Kenneth Graunkedb938102010-06-16 17:41:12 -0700234 yylineno++;
235 yycolumn = 0;
Carl Worth3ff81672010-05-25 13:09:03 -0700236 return NEWLINE;
Carl Worth33cc4002010-05-12 12:17:10 -0700237}
Carl Worth3a37b872010-05-10 11:44:09 -0700238
Kenneth Graunkef82d6732010-06-16 12:53:19 -0700239 /* Handle missing newline at EOF. */
240<INITIAL><<EOF>> {
241 BEGIN DONE; /* Don't keep matching this rule forever. */
242 yyextra->lexing_if = 0;
243 return NEWLINE;
244}
245
Carl Worth3a37b872010-05-10 11:44:09 -0700246%%
Kenneth Graunke1b1f43e2010-06-16 12:01:17 -0700247
248void
249glcpp_lex_set_source_string(glcpp_parser_t *parser, const char *shader)
250{
251 yy_scan_string(shader, parser->scanner);
252}