blob: 5c3187d96768a723738d0196818aa06524445c04 [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
Roger Meier86fded22015-05-15 12:01:38 +020046
47#define YY_NO_UNISTD_H 1
Ben Craige9576752013-10-11 08:19:16 -050048#endif
Roger Meier3b771a12010-11-17 22:11:26 +000049
Jens Geyer8cd3efe2013-09-16 22:17:52 +020050#include <cassert>
David Reiss82e6fc02009-03-26 23:32:36 +000051#include <string>
David Reissf1454162008-06-30 20:45:47 +000052#include <errno.h>
Roger Meier9212e792012-06-12 21:01:06 +000053#include <stdlib.h>
David Reissf1454162008-06-30 20:45:47 +000054
Ben Craige9576752013-10-11 08:19:16 -050055#ifdef _MSC_VER
56#include "windows/config.h"
Roger Meier57e6de42014-07-16 10:19:59 +020057#endif
Mark Slee31985722006-05-24 21:45:31 +000058#include "main.h"
David Reisscbd4bac2007-08-14 17:12:33 +000059#include "globals.h"
Mark Slee31985722006-05-24 21:45:31 +000060#include "parse/t_program.h"
61
Mark Sleef5377b32006-10-10 01:42:59 +000062/**
63 * Must be included AFTER parse/t_program.h, but I can't remember why anymore
64 * because I wrote this a while ago.
65 */
jfarrell4f54d132014-07-10 09:23:43 -040066#if defined(BISON_USE_PARSER_H_EXTENSION)
jfarrell92f24b22013-08-17 15:47:13 -040067#include "thrifty.h"
jfarrell4f54d132014-07-10 09:23:43 -040068#else
69#include "thrifty.hh"
70#endif
Mark Slee31985722006-05-24 21:45:31 +000071
Mark Sleef12865a2007-01-12 00:23:26 +000072void thrift_reserved_keyword(char* keyword) {
73 yyerror("Cannot use reserved language keyword: \"%s\"\n", keyword);
74 exit(1);
75}
76
David Reissf1454162008-06-30 20:45:47 +000077void integer_overflow(char* text) {
78 yyerror("This integer is too big: \"%s\"\n", text);
79 exit(1);
80}
81
Bryan Duxbury235f8b52011-08-19 18:27:47 +000082void unexpected_token(char* text) {
83 yyerror("Unexpected token in input: \"%s\"\n", text);
84 exit(1);
85}
86
Mark Slee31985722006-05-24 21:45:31 +000087%}
88
Mark Sleef5377b32006-10-10 01:42:59 +000089/**
90 * Provides the yylineno global, useful for debugging output
91 */
Mark Slee27ed6ec2007-08-16 01:26:31 +000092%option lex-compat
Mark Slee31985722006-05-24 21:45:31 +000093
Mark Slee27ed6ec2007-08-16 01:26:31 +000094/**
David Reiss4563acd2010-08-31 16:51:29 +000095 * Our inputs are all single files, so no need for yywrap
96 */
97%option noyywrap
98
99/**
Christian Lavoie77215d82010-11-07 19:42:48 +0000100 * We don't use it, and it fires up warnings at -Wall
101 */
102%option nounput
103
104/**
Mark Sleef5377b32006-10-10 01:42:59 +0000105 * Helper definitions, comments, constants, and whatnot
106 */
107
Mark Sleebd588222007-11-21 08:43:35 +0000108intconstant ([+-]?[0-9]+)
Jens Geyer5ec21212015-04-26 15:24:59 +0200109hexconstant ([+-]?"0x"[0-9A-Fa-f]+)
Mark Sleebd588222007-11-21 08:43:35 +0000110dubconstant ([+-]?[0-9]*(\.[0-9]+)?([eE][+-]?[0-9]+)?)
Carl Yeksigiande074082013-06-04 04:28:31 -0400111identifier ([a-zA-Z_](\.[a-zA-Z_0-9]|[a-zA-Z_0-9])*)
Mark Sleebd588222007-11-21 08:43:35 +0000112whitespace ([ \t\r\n]*)
113sillycomm ("/*""*"*"*/")
Jens Geyer775671a2016-03-06 19:02:42 +0100114multicm_begin ("/*")
115doctext_begin ("/**")
Mark Sleebd588222007-11-21 08:43:35 +0000116comment ("//"[^\n]*)
117unixcomment ("#"[^\n]*)
118symbol ([:;\,\{\}\(\)\=<>\[\]])
David Reiss82e6fc02009-03-26 23:32:36 +0000119literal_begin (['\"])
Mark Slee31985722006-05-24 21:45:31 +0000120
121%%
122
Mark Sleebd588222007-11-21 08:43:35 +0000123{whitespace} { /* do nothing */ }
124{sillycomm} { /* do nothing */ }
Jens Geyer775671a2016-03-06 19:02:42 +0100125
126{doctext_begin} {
127 std::string parsed("/**");
128 int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen
129 while(state < 2)
130 {
131 int ch = yyinput();
132 parsed.push_back(ch);
133 switch (ch) {
134 case EOF:
135 yyerror("Unexpected end of file in doc-comment at %d\n", yylineno);
136 exit(1);
137 case '*':
138 state = 1;
139 break;
140 case '/':
141 state = (state == 1) ? 2 : 0;
142 break;
143 default:
144 state = 0;
145 break;
146 }
147 }
148 pdebug("doctext = \"%s\"\n",parsed.c_str());
149
150 /* This does not show up in the parse tree. */
151 /* Rather, the parser will grab it out of the global. */
152 if (g_parse_mode == PROGRAM) {
153 clear_doctext();
154 g_doctext = strdup(parsed.c_str() + 3);
155 assert(strlen(g_doctext) >= 2);
156 g_doctext[strlen(g_doctext) - 2] = ' ';
157 g_doctext[strlen(g_doctext) - 1] = '\0';
158 g_doctext = clean_up_doctext(g_doctext);
159 g_doctext_lineno = yylineno;
160 if( (g_program_doctext_candidate == NULL) && (g_program_doctext_status == INVALID)){
161 g_program_doctext_candidate = strdup(g_doctext);
162 g_program_doctext_lineno = g_doctext_lineno;
163 g_program_doctext_status = STILL_CANDIDATE;
164 pdebug("%s","program doctext set to STILL_CANDIDATE");
165 }
166 }
167}
168
169{multicm_begin} { /* parsed, but thrown away */
170 std::string parsed("/*");
171 int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen
172 while(state < 2)
173 {
174 int ch = yyinput();
175 parsed.push_back(ch);
176 switch (ch) {
177 case EOF:
178 yyerror("Unexpected end of file in multiline comment at %d\n", yylineno);
179 exit(1);
180 case '*':
181 state = 1;
182 break;
183 case '/':
184 state = (state == 1) ? 2 : 0;
185 break;
186 default:
187 state = 0;
188 break;
189 }
190 }
191 pdebug("multi_comm = \"%s\"\n",parsed.c_str());
192}
193
Mark Sleebd588222007-11-21 08:43:35 +0000194{comment} { /* do nothing */ }
195{unixcomment} { /* do nothing */ }
Mark Slee31985722006-05-24 21:45:31 +0000196
Mark Sleebd588222007-11-21 08:43:35 +0000197{symbol} { return yytext[0]; }
Roger Meier0c3c8952011-08-22 21:38:16 +0000198"*" { return yytext[0]; }
Mark Slee9cb7c612006-09-01 22:17:45 +0000199
Bryan Duxbury6c928f32011-10-13 21:32:52 +0000200"false" { yylval.iconst=0; return tok_int_constant; }
201"true" { yylval.iconst=1; return tok_int_constant; }
202
Mark Sleebd588222007-11-21 08:43:35 +0000203"namespace" { return tok_namespace; }
Jens Geyer73880372015-11-14 15:21:57 +0100204"cpp_namespace" { error_unsupported_namespace_decl("cpp"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000205"cpp_include" { return tok_cpp_include; }
206"cpp_type" { return tok_cpp_type; }
Jens Geyer73880372015-11-14 15:21:57 +0100207"java_package" { error_unsupported_namespace_decl("java_package", "java"); /* do nothing */ }
208"cocoa_prefix" { error_unsupported_namespace_decl("cocoa_prefix", "cocoa"); /* do nothing */ }
209"csharp_namespace" { error_unsupported_namespace_decl("csharp"); /* do nothing */ }
210"delphi_namespace" { error_unsupported_namespace_decl("delphi"); /* do nothing */ }
211"php_namespace" { error_unsupported_namespace_decl("php"); /* do nothing */ }
212"py_module" { error_unsupported_namespace_decl("py_module", "py"); /* do nothing */ }
213"perl_package" { error_unsupported_namespace_decl("perl_package", "perl"); /* do nothing */ }
214"ruby_namespace" { error_unsupported_namespace_decl("ruby"); /* do nothing */ }
215"smalltalk_category" { error_unsupported_namespace_decl("smalltalk_category", "smalltalk.category"); /* do nothing */ }
216"smalltalk_prefix" { error_unsupported_namespace_decl("smalltalk_category", "smalltalk.category"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000217"xsd_all" { return tok_xsd_all; }
218"xsd_optional" { return tok_xsd_optional; }
219"xsd_nillable" { return tok_xsd_nillable; }
Jens Geyer73880372015-11-14 15:21:57 +0100220"xsd_namespace" { error_unsupported_namespace_decl("xsd"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000221"xsd_attrs" { return tok_xsd_attrs; }
222"include" { return tok_include; }
223"void" { return tok_void; }
224"bool" { return tok_bool; }
Jens Geyer40c28d32015-10-20 23:13:02 +0200225"byte" {
226 emit_byte_type_warning();
227 return tok_i8;
228}
229"i8" { return tok_i8; }
Mark Sleebd588222007-11-21 08:43:35 +0000230"i16" { return tok_i16; }
231"i32" { return tok_i32; }
232"i64" { return tok_i64; }
233"double" { return tok_double; }
234"string" { return tok_string; }
235"binary" { return tok_binary; }
Jens Geyer0ca234f2013-06-04 22:01:47 +0200236"slist" {
237 pwarning(0, "\"slist\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
238 return tok_slist;
239}
Carl Yeksigianc3178522013-06-07 12:31:13 -0400240"senum" {
241 pwarning(0, "\"senum\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
242 return tok_senum;
243}
Mark Sleebd588222007-11-21 08:43:35 +0000244"map" { return tok_map; }
245"list" { return tok_list; }
246"set" { return tok_set; }
David Reisscecbed82009-03-24 20:02:22 +0000247"oneway" { return tok_oneway; }
Mark Sleebd588222007-11-21 08:43:35 +0000248"typedef" { return tok_typedef; }
249"struct" { return tok_struct; }
Bryan Duxburyab3666e2009-09-01 23:03:47 +0000250"union" { return tok_union; }
Mark Sleebd588222007-11-21 08:43:35 +0000251"exception" { return tok_xception; }
252"extends" { return tok_extends; }
253"throws" { return tok_throws; }
254"service" { return tok_service; }
255"enum" { return tok_enum; }
256"const" { return tok_const; }
257"required" { return tok_required; }
258"optional" { return tok_optional; }
David Reisscecbed82009-03-24 20:02:22 +0000259"async" {
260 pwarning(0, "\"async\" is deprecated. It is called \"oneway\" now.\n");
261 return tok_oneway;
262}
Jens Geyer885c6792014-05-02 21:31:55 +0200263"&" { return tok_reference; }
Mark Sleef0712dc2006-10-25 19:03:57 +0000264
Mark Slee52f643d2006-08-09 00:03:43 +0000265
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000266"BEGIN" { thrift_reserved_keyword(yytext); }
267"END" { thrift_reserved_keyword(yytext); }
268"__CLASS__" { thrift_reserved_keyword(yytext); }
269"__DIR__" { thrift_reserved_keyword(yytext); }
270"__FILE__" { thrift_reserved_keyword(yytext); }
271"__FUNCTION__" { thrift_reserved_keyword(yytext); }
272"__LINE__" { thrift_reserved_keyword(yytext); }
273"__METHOD__" { thrift_reserved_keyword(yytext); }
274"__NAMESPACE__" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000275"abstract" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000276"alias" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000277"and" { thrift_reserved_keyword(yytext); }
Mark Sleec27fc312007-12-21 23:52:19 +0000278"args" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000279"as" { thrift_reserved_keyword(yytext); }
280"assert" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000281"begin" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000282"break" { thrift_reserved_keyword(yytext); }
283"case" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000284"catch" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000285"class" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000286"clone" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000287"continue" { thrift_reserved_keyword(yytext); }
288"declare" { thrift_reserved_keyword(yytext); }
289"def" { thrift_reserved_keyword(yytext); }
290"default" { thrift_reserved_keyword(yytext); }
291"del" { thrift_reserved_keyword(yytext); }
292"delete" { thrift_reserved_keyword(yytext); }
293"do" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000294"dynamic" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000295"elif" { thrift_reserved_keyword(yytext); }
296"else" { thrift_reserved_keyword(yytext); }
297"elseif" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000298"elsif" { thrift_reserved_keyword(yytext); }
299"end" { thrift_reserved_keyword(yytext); }
300"enddeclare" { thrift_reserved_keyword(yytext); }
301"endfor" { thrift_reserved_keyword(yytext); }
302"endforeach" { thrift_reserved_keyword(yytext); }
303"endif" { thrift_reserved_keyword(yytext); }
304"endswitch" { thrift_reserved_keyword(yytext); }
305"endwhile" { thrift_reserved_keyword(yytext); }
306"ensure" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000307"except" { thrift_reserved_keyword(yytext); }
308"exec" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000309"finally" { thrift_reserved_keyword(yytext); }
310"float" { thrift_reserved_keyword(yytext); }
311"for" { thrift_reserved_keyword(yytext); }
312"foreach" { thrift_reserved_keyword(yytext); }
jfarrella1ae93f2015-09-24 22:57:33 -0400313"from" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000314"function" { thrift_reserved_keyword(yytext); }
315"global" { thrift_reserved_keyword(yytext); }
316"goto" { thrift_reserved_keyword(yytext); }
317"if" { thrift_reserved_keyword(yytext); }
318"implements" { thrift_reserved_keyword(yytext); }
319"import" { thrift_reserved_keyword(yytext); }
320"in" { thrift_reserved_keyword(yytext); }
321"inline" { thrift_reserved_keyword(yytext); }
322"instanceof" { thrift_reserved_keyword(yytext); }
323"interface" { thrift_reserved_keyword(yytext); }
324"is" { thrift_reserved_keyword(yytext); }
325"lambda" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000326"module" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000327"native" { thrift_reserved_keyword(yytext); }
328"new" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000329"next" { thrift_reserved_keyword(yytext); }
330"nil" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000331"not" { thrift_reserved_keyword(yytext); }
332"or" { thrift_reserved_keyword(yytext); }
Jens Geyere33d1652015-07-24 02:14:43 +0200333"package" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000334"pass" { thrift_reserved_keyword(yytext); }
335"public" { thrift_reserved_keyword(yytext); }
336"print" { thrift_reserved_keyword(yytext); }
337"private" { thrift_reserved_keyword(yytext); }
338"protected" { thrift_reserved_keyword(yytext); }
339"raise" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000340"redo" { thrift_reserved_keyword(yytext); }
341"rescue" { thrift_reserved_keyword(yytext); }
342"retry" { thrift_reserved_keyword(yytext); }
Mark Sleef5a0b3d2009-08-13 19:21:40 +0000343"register" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000344"return" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000345"self" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000346"sizeof" { thrift_reserved_keyword(yytext); }
347"static" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000348"super" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000349"switch" { thrift_reserved_keyword(yytext); }
350"synchronized" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000351"then" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000352"this" { thrift_reserved_keyword(yytext); }
353"throw" { thrift_reserved_keyword(yytext); }
354"transient" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000355"try" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000356"undef" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000357"unless" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000358"unsigned" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000359"until" { thrift_reserved_keyword(yytext); }
360"use" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000361"var" { thrift_reserved_keyword(yytext); }
362"virtual" { thrift_reserved_keyword(yytext); }
363"volatile" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000364"when" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000365"while" { thrift_reserved_keyword(yytext); }
366"with" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000367"xor" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000368"yield" { thrift_reserved_keyword(yytext); }
Mark Sleef12865a2007-01-12 00:23:26 +0000369
Mark Slee4f8da1d2006-10-12 02:47:27 +0000370{intconstant} {
David Reissf1454162008-06-30 20:45:47 +0000371 errno = 0;
372 yylval.iconst = strtoll(yytext, NULL, 10);
373 if (errno == ERANGE) {
374 integer_overflow(yytext);
375 }
Mark Slee4f8da1d2006-10-12 02:47:27 +0000376 return tok_int_constant;
377}
Mark Sleef5377b32006-10-10 01:42:59 +0000378
Mark Slee600cdb32006-11-29 22:06:42 +0000379{hexconstant} {
David Reissf1454162008-06-30 20:45:47 +0000380 errno = 0;
Jens Geyer5ec21212015-04-26 15:24:59 +0200381 char sign = yytext[0];
382 int shift = sign == '0' ? 2 : 3;
383 yylval.iconst = strtoll(yytext+shift, NULL, 16);
384 if (sign == '-') {
385 yylval.iconst = -yylval.iconst;
386 }
David Reissf1454162008-06-30 20:45:47 +0000387 if (errno == ERANGE) {
388 integer_overflow(yytext);
389 }
Mark Slee600cdb32006-11-29 22:06:42 +0000390 return tok_int_constant;
391}
392
Mark Slee4f8da1d2006-10-12 02:47:27 +0000393{identifier} {
394 yylval.id = strdup(yytext);
395 return tok_identifier;
396}
397
Jens Geyer5eed3a12015-12-08 01:32:12 +0100398{dubconstant} {
399 /* Deliberately placed after identifier, since "e10" is NOT a double literal (THRIFT-3477) */
400 yylval.dconst = atof(yytext);
401 return tok_dub_constant;
402}
403
David Reiss82e6fc02009-03-26 23:32:36 +0000404{literal_begin} {
405 char mark = yytext[0];
406 std::string result;
407 for(;;)
408 {
409 int ch = yyinput();
410 switch (ch) {
411 case EOF:
412 yyerror("End of file while read string at %d\n", yylineno);
413 exit(1);
414 case '\n':
415 yyerror("End of line while read string at %d\n", yylineno - 1);
416 exit(1);
417 case '\\':
418 ch = yyinput();
419 switch (ch) {
420 case 'r':
421 result.push_back('\r');
422 continue;
423 case 'n':
424 result.push_back('\n');
425 continue;
426 case 't':
427 result.push_back('\t');
428 continue;
429 case '"':
430 result.push_back('"');
431 continue;
432 case '\'':
433 result.push_back('\'');
434 continue;
435 case '\\':
436 result.push_back('\\');
437 continue;
438 default:
439 yyerror("Bad escape character\n");
440 return -1;
441 }
442 break;
443 default:
444 if (ch == mark) {
445 yylval.id = strdup(result.c_str());
446 return tok_literal;
447 } else {
448 result.push_back(ch);
449 }
450 }
451 }
Mark Slee30152872006-11-28 01:24:07 +0000452}
453
Mark Slee31985722006-05-24 21:45:31 +0000454
Bryan Duxbury235f8b52011-08-19 18:27:47 +0000455. {
456 unexpected_token(yytext);
457}
458
Mark Slee31985722006-05-24 21:45:31 +0000459%%
David Reiss4a054342009-03-26 23:32:27 +0000460
461/* vim: filetype=lex
462*/