blob: aee440607aa93d642ad041db81770dde524f66f3 [file] [log] [blame]
David Reissea2cba82009-03-30 21:35:00 +00001/*
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
Mark Sleee9ce01c2007-05-16 02:29:53 +00009 *
David Reissea2cba82009-03-30 21:35:00 +000010 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing,
13 * software distributed under the License is distributed on an
14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15 * KIND, either express or implied. See the License for the
16 * specific language governing permissions and limitations
17 * under the License.
Mark Sleee9ce01c2007-05-16 02:29:53 +000018 */
19
20/**
Mark Slee31985722006-05-24 21:45:31 +000021 * Thrift scanner.
Mark Slee27ed6ec2007-08-16 01:26:31 +000022 *
Mark Slee31985722006-05-24 21:45:31 +000023 * Tokenizes a thrift definition file.
Mark Slee31985722006-05-24 21:45:31 +000024 */
Mark Sleef5377b32006-10-10 01:42:59 +000025
Mark Slee31985722006-05-24 21:45:31 +000026%{
27
Christian Lavoieaf65f1b2010-11-24 21:58:05 +000028/* This is redundant with some of the flags in Makefile.am, but it works
29 * when people override CXXFLAGS without being careful. The pragmas are
30 * the 'right' way to do it, but don't work on old-enough GCC (in particular
31 * the GCC that ship on Mac OS X 10.6.5, *counter* to what the GNU docs say)
32 *
33 * We should revert the Makefile.am changes once Apple ships a reasonable
34 * GCC.
35 */
Ben Craige9576752013-10-11 08:19:16 -050036#ifdef __GNUC__
Roger Meier3b771a12010-11-17 22:11:26 +000037#pragma GCC diagnostic ignored "-Wunused-function"
38#pragma GCC diagnostic ignored "-Wunused-label"
Ben Craige9576752013-10-11 08:19:16 -050039#endif
40
41#ifdef _MSC_VER
42//warning C4102: 'find_rule' : unreferenced label
43#pragma warning(disable:4102)
44//avoid isatty redefinition
45#define YY_NEVER_INTERACTIVE 1
46#endif
Roger Meier3b771a12010-11-17 22:11:26 +000047
Jens Geyer8cd3efe2013-09-16 22:17:52 +020048#include <cassert>
David Reiss82e6fc02009-03-26 23:32:36 +000049#include <string>
David Reissf1454162008-06-30 20:45:47 +000050#include <errno.h>
Roger Meier9212e792012-06-12 21:01:06 +000051#include <stdlib.h>
David Reissf1454162008-06-30 20:45:47 +000052
Ben Craige9576752013-10-11 08:19:16 -050053#ifdef _MSC_VER
54#include "windows/config.h"
55#endif
Mark Slee31985722006-05-24 21:45:31 +000056#include "main.h"
David Reisscbd4bac2007-08-14 17:12:33 +000057#include "globals.h"
Mark Slee31985722006-05-24 21:45:31 +000058#include "parse/t_program.h"
59
Mark Sleef5377b32006-10-10 01:42:59 +000060/**
61 * Must be included AFTER parse/t_program.h, but I can't remember why anymore
62 * because I wrote this a while ago.
63 */
jfarrell92f24b22013-08-17 15:47:13 -040064#include "thrifty.h"
Mark Slee31985722006-05-24 21:45:31 +000065
Mark Sleef12865a2007-01-12 00:23:26 +000066void thrift_reserved_keyword(char* keyword) {
67 yyerror("Cannot use reserved language keyword: \"%s\"\n", keyword);
68 exit(1);
69}
70
David Reissf1454162008-06-30 20:45:47 +000071void integer_overflow(char* text) {
72 yyerror("This integer is too big: \"%s\"\n", text);
73 exit(1);
74}
75
Bryan Duxbury235f8b52011-08-19 18:27:47 +000076void unexpected_token(char* text) {
77 yyerror("Unexpected token in input: \"%s\"\n", text);
78 exit(1);
79}
80
Mark Slee31985722006-05-24 21:45:31 +000081%}
82
Mark Sleef5377b32006-10-10 01:42:59 +000083/**
84 * Provides the yylineno global, useful for debugging output
85 */
Mark Slee27ed6ec2007-08-16 01:26:31 +000086%option lex-compat
Mark Slee31985722006-05-24 21:45:31 +000087
Mark Slee27ed6ec2007-08-16 01:26:31 +000088/**
David Reiss4563acd2010-08-31 16:51:29 +000089 * Our inputs are all single files, so no need for yywrap
90 */
91%option noyywrap
92
93/**
Christian Lavoie77215d82010-11-07 19:42:48 +000094 * We don't use it, and it fires up warnings at -Wall
95 */
96%option nounput
97
98/**
Mark Sleef5377b32006-10-10 01:42:59 +000099 * Helper definitions, comments, constants, and whatnot
100 */
101
Mark Sleebd588222007-11-21 08:43:35 +0000102intconstant ([+-]?[0-9]+)
103hexconstant ("0x"[0-9A-Fa-f]+)
104dubconstant ([+-]?[0-9]*(\.[0-9]+)?([eE][+-]?[0-9]+)?)
Carl Yeksigiande074082013-06-04 04:28:31 -0400105identifier ([a-zA-Z_](\.[a-zA-Z_0-9]|[a-zA-Z_0-9])*)
Mark Sleebd588222007-11-21 08:43:35 +0000106whitespace ([ \t\r\n]*)
107sillycomm ("/*""*"*"*/")
108multicomm ("/*"[^*]"/"*([^*/]|[^*]"/"|"*"[^/])*"*"*"*/")
109doctext ("/**"([^*/]|[^*]"/"|"*"[^/])*"*"*"*/")
110comment ("//"[^\n]*)
111unixcomment ("#"[^\n]*)
112symbol ([:;\,\{\}\(\)\=<>\[\]])
Carl Yeksigiande074082013-06-04 04:28:31 -0400113st_identifier ([a-zA-Z-](\.[a-zA-Z_0-9-]|[a-zA-Z_0-9-])*)
David Reiss82e6fc02009-03-26 23:32:36 +0000114literal_begin (['\"])
Mark Slee31985722006-05-24 21:45:31 +0000115
116%%
117
Mark Sleebd588222007-11-21 08:43:35 +0000118{whitespace} { /* do nothing */ }
119{sillycomm} { /* do nothing */ }
120{multicomm} { /* do nothing */ }
121{comment} { /* do nothing */ }
122{unixcomment} { /* do nothing */ }
Mark Slee31985722006-05-24 21:45:31 +0000123
Mark Sleebd588222007-11-21 08:43:35 +0000124{symbol} { return yytext[0]; }
Roger Meier0c3c8952011-08-22 21:38:16 +0000125"*" { return yytext[0]; }
Mark Slee9cb7c612006-09-01 22:17:45 +0000126
Bryan Duxbury6c928f32011-10-13 21:32:52 +0000127"false" { yylval.iconst=0; return tok_int_constant; }
128"true" { yylval.iconst=1; return tok_int_constant; }
129
Mark Sleebd588222007-11-21 08:43:35 +0000130"namespace" { return tok_namespace; }
131"cpp_namespace" { return tok_cpp_namespace; }
132"cpp_include" { return tok_cpp_include; }
133"cpp_type" { return tok_cpp_type; }
134"java_package" { return tok_java_package; }
135"cocoa_prefix" { return tok_cocoa_prefix; }
David Reiss7f42bcf2008-01-11 20:59:12 +0000136"csharp_namespace" { return tok_csharp_namespace; }
Jake Farrell7ae13e12011-10-18 14:35:26 +0000137"delphi_namespace" { return tok_delphi_namespace; }
Mark Sleebd588222007-11-21 08:43:35 +0000138"php_namespace" { return tok_php_namespace; }
139"py_module" { return tok_py_module; }
140"perl_package" { return tok_perl_package; }
141"ruby_namespace" { return tok_ruby_namespace; }
142"smalltalk_category" { return tok_smalltalk_category; }
David Reiss15457c92007-12-14 07:03:03 +0000143"smalltalk_prefix" { return tok_smalltalk_prefix; }
Mark Sleebd588222007-11-21 08:43:35 +0000144"xsd_all" { return tok_xsd_all; }
145"xsd_optional" { return tok_xsd_optional; }
146"xsd_nillable" { return tok_xsd_nillable; }
147"xsd_namespace" { return tok_xsd_namespace; }
148"xsd_attrs" { return tok_xsd_attrs; }
149"include" { return tok_include; }
150"void" { return tok_void; }
151"bool" { return tok_bool; }
152"byte" { return tok_byte; }
153"i16" { return tok_i16; }
154"i32" { return tok_i32; }
155"i64" { return tok_i64; }
156"double" { return tok_double; }
157"string" { return tok_string; }
158"binary" { return tok_binary; }
Jens Geyer0ca234f2013-06-04 22:01:47 +0200159"slist" {
160 pwarning(0, "\"slist\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
161 return tok_slist;
162}
Carl Yeksigianc3178522013-06-07 12:31:13 -0400163"senum" {
164 pwarning(0, "\"senum\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
165 return tok_senum;
166}
Mark Sleebd588222007-11-21 08:43:35 +0000167"map" { return tok_map; }
168"list" { return tok_list; }
169"set" { return tok_set; }
David Reisscecbed82009-03-24 20:02:22 +0000170"oneway" { return tok_oneway; }
Mark Sleebd588222007-11-21 08:43:35 +0000171"typedef" { return tok_typedef; }
172"struct" { return tok_struct; }
Bryan Duxburyab3666e2009-09-01 23:03:47 +0000173"union" { return tok_union; }
Mark Sleebd588222007-11-21 08:43:35 +0000174"exception" { return tok_xception; }
175"extends" { return tok_extends; }
176"throws" { return tok_throws; }
177"service" { return tok_service; }
178"enum" { return tok_enum; }
179"const" { return tok_const; }
180"required" { return tok_required; }
181"optional" { return tok_optional; }
David Reisscecbed82009-03-24 20:02:22 +0000182"async" {
183 pwarning(0, "\"async\" is deprecated. It is called \"oneway\" now.\n");
184 return tok_oneway;
185}
Jens Geyer885c6792014-05-02 21:31:55 +0200186"&" { return tok_reference; }
Mark Sleef0712dc2006-10-25 19:03:57 +0000187
Mark Slee52f643d2006-08-09 00:03:43 +0000188
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000189"BEGIN" { thrift_reserved_keyword(yytext); }
190"END" { thrift_reserved_keyword(yytext); }
191"__CLASS__" { thrift_reserved_keyword(yytext); }
192"__DIR__" { thrift_reserved_keyword(yytext); }
193"__FILE__" { thrift_reserved_keyword(yytext); }
194"__FUNCTION__" { thrift_reserved_keyword(yytext); }
195"__LINE__" { thrift_reserved_keyword(yytext); }
196"__METHOD__" { thrift_reserved_keyword(yytext); }
197"__NAMESPACE__" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000198"abstract" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000199"alias" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000200"and" { thrift_reserved_keyword(yytext); }
Mark Sleec27fc312007-12-21 23:52:19 +0000201"args" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000202"as" { thrift_reserved_keyword(yytext); }
203"assert" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000204"begin" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000205"break" { thrift_reserved_keyword(yytext); }
206"case" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000207"catch" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000208"class" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000209"clone" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000210"continue" { thrift_reserved_keyword(yytext); }
211"declare" { thrift_reserved_keyword(yytext); }
212"def" { thrift_reserved_keyword(yytext); }
213"default" { thrift_reserved_keyword(yytext); }
214"del" { thrift_reserved_keyword(yytext); }
215"delete" { thrift_reserved_keyword(yytext); }
216"do" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000217"dynamic" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000218"elif" { thrift_reserved_keyword(yytext); }
219"else" { thrift_reserved_keyword(yytext); }
220"elseif" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000221"elsif" { thrift_reserved_keyword(yytext); }
222"end" { thrift_reserved_keyword(yytext); }
223"enddeclare" { thrift_reserved_keyword(yytext); }
224"endfor" { thrift_reserved_keyword(yytext); }
225"endforeach" { thrift_reserved_keyword(yytext); }
226"endif" { thrift_reserved_keyword(yytext); }
227"endswitch" { thrift_reserved_keyword(yytext); }
228"endwhile" { thrift_reserved_keyword(yytext); }
229"ensure" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000230"except" { thrift_reserved_keyword(yytext); }
231"exec" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000232"finally" { thrift_reserved_keyword(yytext); }
233"float" { thrift_reserved_keyword(yytext); }
234"for" { thrift_reserved_keyword(yytext); }
235"foreach" { thrift_reserved_keyword(yytext); }
236"function" { thrift_reserved_keyword(yytext); }
237"global" { thrift_reserved_keyword(yytext); }
238"goto" { thrift_reserved_keyword(yytext); }
239"if" { thrift_reserved_keyword(yytext); }
240"implements" { thrift_reserved_keyword(yytext); }
241"import" { thrift_reserved_keyword(yytext); }
242"in" { thrift_reserved_keyword(yytext); }
243"inline" { thrift_reserved_keyword(yytext); }
244"instanceof" { thrift_reserved_keyword(yytext); }
245"interface" { thrift_reserved_keyword(yytext); }
246"is" { thrift_reserved_keyword(yytext); }
247"lambda" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000248"module" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000249"native" { thrift_reserved_keyword(yytext); }
250"new" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000251"next" { thrift_reserved_keyword(yytext); }
252"nil" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000253"not" { thrift_reserved_keyword(yytext); }
254"or" { thrift_reserved_keyword(yytext); }
255"pass" { thrift_reserved_keyword(yytext); }
256"public" { thrift_reserved_keyword(yytext); }
257"print" { thrift_reserved_keyword(yytext); }
258"private" { thrift_reserved_keyword(yytext); }
259"protected" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000260"public" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000261"raise" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000262"redo" { thrift_reserved_keyword(yytext); }
263"rescue" { thrift_reserved_keyword(yytext); }
264"retry" { thrift_reserved_keyword(yytext); }
Mark Sleef5a0b3d2009-08-13 19:21:40 +0000265"register" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000266"return" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000267"self" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000268"sizeof" { thrift_reserved_keyword(yytext); }
269"static" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000270"super" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000271"switch" { thrift_reserved_keyword(yytext); }
272"synchronized" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000273"then" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000274"this" { thrift_reserved_keyword(yytext); }
275"throw" { thrift_reserved_keyword(yytext); }
276"transient" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000277"try" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000278"undef" { thrift_reserved_keyword(yytext); }
279"union" { thrift_reserved_keyword(yytext); }
280"unless" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000281"unsigned" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000282"until" { thrift_reserved_keyword(yytext); }
283"use" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000284"var" { thrift_reserved_keyword(yytext); }
285"virtual" { thrift_reserved_keyword(yytext); }
286"volatile" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000287"when" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000288"while" { thrift_reserved_keyword(yytext); }
289"with" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000290"xor" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000291"yield" { thrift_reserved_keyword(yytext); }
Mark Sleef12865a2007-01-12 00:23:26 +0000292
Mark Slee4f8da1d2006-10-12 02:47:27 +0000293{intconstant} {
David Reissf1454162008-06-30 20:45:47 +0000294 errno = 0;
295 yylval.iconst = strtoll(yytext, NULL, 10);
296 if (errno == ERANGE) {
297 integer_overflow(yytext);
298 }
Mark Slee4f8da1d2006-10-12 02:47:27 +0000299 return tok_int_constant;
300}
Mark Sleef5377b32006-10-10 01:42:59 +0000301
Mark Slee600cdb32006-11-29 22:06:42 +0000302{hexconstant} {
David Reissf1454162008-06-30 20:45:47 +0000303 errno = 0;
304 yylval.iconst = strtoll(yytext+2, NULL, 16);
305 if (errno == ERANGE) {
306 integer_overflow(yytext);
307 }
Mark Slee600cdb32006-11-29 22:06:42 +0000308 return tok_int_constant;
309}
310
Mark Slee30152872006-11-28 01:24:07 +0000311{dubconstant} {
312 yylval.dconst = atof(yytext);
313 return tok_dub_constant;
314}
315
Mark Slee4f8da1d2006-10-12 02:47:27 +0000316{identifier} {
317 yylval.id = strdup(yytext);
318 return tok_identifier;
319}
320
Mark Sleebd588222007-11-21 08:43:35 +0000321{st_identifier} {
322 yylval.id = strdup(yytext);
323 return tok_st_identifier;
324}
325
David Reiss82e6fc02009-03-26 23:32:36 +0000326{literal_begin} {
327 char mark = yytext[0];
328 std::string result;
329 for(;;)
330 {
331 int ch = yyinput();
332 switch (ch) {
333 case EOF:
334 yyerror("End of file while read string at %d\n", yylineno);
335 exit(1);
336 case '\n':
337 yyerror("End of line while read string at %d\n", yylineno - 1);
338 exit(1);
339 case '\\':
340 ch = yyinput();
341 switch (ch) {
342 case 'r':
343 result.push_back('\r');
344 continue;
345 case 'n':
346 result.push_back('\n');
347 continue;
348 case 't':
349 result.push_back('\t');
350 continue;
351 case '"':
352 result.push_back('"');
353 continue;
354 case '\'':
355 result.push_back('\'');
356 continue;
357 case '\\':
358 result.push_back('\\');
359 continue;
360 default:
361 yyerror("Bad escape character\n");
362 return -1;
363 }
364 break;
365 default:
366 if (ch == mark) {
367 yylval.id = strdup(result.c_str());
368 return tok_literal;
369 } else {
370 result.push_back(ch);
371 }
372 }
373 }
Mark Slee30152872006-11-28 01:24:07 +0000374}
375
Mark Slee31985722006-05-24 21:45:31 +0000376
ccheeverf53b5cf2007-02-05 20:33:11 +0000377{doctext} {
David Reisscbd4bac2007-08-14 17:12:33 +0000378 /* This does not show up in the parse tree. */
379 /* Rather, the parser will grab it out of the global. */
380 if (g_parse_mode == PROGRAM) {
381 clear_doctext();
382 g_doctext = strdup(yytext + 3);
Jens Geyer8cd3efe2013-09-16 22:17:52 +0200383 assert(strlen(g_doctext) >= 2);
384 g_doctext[strlen(g_doctext) - 2] = ' ';
385 g_doctext[strlen(g_doctext) - 1] = '\0';
David Reisscbd4bac2007-08-14 17:12:33 +0000386 g_doctext = clean_up_doctext(g_doctext);
387 g_doctext_lineno = yylineno;
Jens Geyer813749d2014-01-31 23:42:57 +0100388 if( (g_program_doctext_candidate == NULL) && (g_program_doctext_status == INVALID)){
Jens Geyere8379b52014-01-25 00:59:45 +0100389 g_program_doctext_candidate = strdup(g_doctext);
390 g_program_doctext_lineno = g_doctext_lineno;
391 g_program_doctext_status = STILL_CANDIDATE;
Jens Geyer813749d2014-01-31 23:42:57 +0100392 pdebug("%s","program doctext set to STILL_CANDIDATE");
Jens Geyere8379b52014-01-25 00:59:45 +0100393 }
David Reisscbd4bac2007-08-14 17:12:33 +0000394 }
ccheeverf53b5cf2007-02-05 20:33:11 +0000395}
396
Bryan Duxbury235f8b52011-08-19 18:27:47 +0000397. {
398 unexpected_token(yytext);
399}
400
ccheeverf53b5cf2007-02-05 20:33:11 +0000401
David Reissfb790d72010-09-02 16:41:45 +0000402. {
403 /* Catch-all to let us catch "*" in the parser. */
404 return (int) yytext[0];
405}
406
Mark Slee31985722006-05-24 21:45:31 +0000407%%
David Reiss4a054342009-03-26 23:32:27 +0000408
409/* vim: filetype=lex
410*/