blob: bf7e8a56ca7cecdeeffb884dd5b00be687a87f37 [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
dtmuller052abc32016-07-26 11:58:28 +020056#include "thrift/windows/config.h"
Roger Meier57e6de42014-07-16 10:19:59 +020057#endif
dtmuller052abc32016-07-26 11:58:28 +020058#include "thrift/main.h"
59#include "thrift/common.h"
60#include "thrift/globals.h"
61#include "thrift/parse/t_program.h"
Mark Slee31985722006-05-24 21:45:31 +000062
Mark Sleef5377b32006-10-10 01:42:59 +000063/**
64 * Must be included AFTER parse/t_program.h, but I can't remember why anymore
65 * because I wrote this a while ago.
66 */
jfarrell4f54d132014-07-10 09:23:43 -040067#if defined(BISON_USE_PARSER_H_EXTENSION)
dtmuller052abc32016-07-26 11:58:28 +020068#include "thrift/thrifty.h"
jfarrell4f54d132014-07-10 09:23:43 -040069#else
dtmuller052abc32016-07-26 11:58:28 +020070#include "thrift/thrifty.hh"
jfarrell4f54d132014-07-10 09:23:43 -040071#endif
Mark Slee31985722006-05-24 21:45:31 +000072
Mark Sleef12865a2007-01-12 00:23:26 +000073void thrift_reserved_keyword(char* keyword) {
74 yyerror("Cannot use reserved language keyword: \"%s\"\n", keyword);
75 exit(1);
76}
77
David Reissf1454162008-06-30 20:45:47 +000078void integer_overflow(char* text) {
79 yyerror("This integer is too big: \"%s\"\n", text);
80 exit(1);
81}
82
Bryan Duxbury235f8b52011-08-19 18:27:47 +000083void unexpected_token(char* text) {
84 yyerror("Unexpected token in input: \"%s\"\n", text);
85 exit(1);
86}
87
Mark Slee31985722006-05-24 21:45:31 +000088%}
89
Mark Sleef5377b32006-10-10 01:42:59 +000090/**
91 * Provides the yylineno global, useful for debugging output
92 */
Mark Slee27ed6ec2007-08-16 01:26:31 +000093%option lex-compat
Mark Slee31985722006-05-24 21:45:31 +000094
Mark Slee27ed6ec2007-08-16 01:26:31 +000095/**
David Reiss4563acd2010-08-31 16:51:29 +000096 * Our inputs are all single files, so no need for yywrap
97 */
98%option noyywrap
99
100/**
Christian Lavoie77215d82010-11-07 19:42:48 +0000101 * We don't use it, and it fires up warnings at -Wall
102 */
103%option nounput
104
105/**
Mark Sleef5377b32006-10-10 01:42:59 +0000106 * Helper definitions, comments, constants, and whatnot
107 */
108
Mark Sleebd588222007-11-21 08:43:35 +0000109intconstant ([+-]?[0-9]+)
Jens Geyer5ec21212015-04-26 15:24:59 +0200110hexconstant ([+-]?"0x"[0-9A-Fa-f]+)
Mark Sleebd588222007-11-21 08:43:35 +0000111dubconstant ([+-]?[0-9]*(\.[0-9]+)?([eE][+-]?[0-9]+)?)
Carl Yeksigiande074082013-06-04 04:28:31 -0400112identifier ([a-zA-Z_](\.[a-zA-Z_0-9]|[a-zA-Z_0-9])*)
Mark Sleebd588222007-11-21 08:43:35 +0000113whitespace ([ \t\r\n]*)
114sillycomm ("/*""*"*"*/")
Jens Geyer775671a2016-03-06 19:02:42 +0100115multicm_begin ("/*")
116doctext_begin ("/**")
Mark Sleebd588222007-11-21 08:43:35 +0000117comment ("//"[^\n]*)
118unixcomment ("#"[^\n]*)
119symbol ([:;\,\{\}\(\)\=<>\[\]])
David Reiss82e6fc02009-03-26 23:32:36 +0000120literal_begin (['\"])
Mark Slee31985722006-05-24 21:45:31 +0000121
122%%
123
Mark Sleebd588222007-11-21 08:43:35 +0000124{whitespace} { /* do nothing */ }
125{sillycomm} { /* do nothing */ }
Jens Geyer775671a2016-03-06 19:02:42 +0100126
127{doctext_begin} {
128 std::string parsed("/**");
129 int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen
130 while(state < 2)
131 {
132 int ch = yyinput();
133 parsed.push_back(ch);
134 switch (ch) {
135 case EOF:
136 yyerror("Unexpected end of file in doc-comment at %d\n", yylineno);
137 exit(1);
138 case '*':
139 state = 1;
140 break;
141 case '/':
142 state = (state == 1) ? 2 : 0;
143 break;
144 default:
145 state = 0;
146 break;
147 }
148 }
149 pdebug("doctext = \"%s\"\n",parsed.c_str());
150
151 /* This does not show up in the parse tree. */
152 /* Rather, the parser will grab it out of the global. */
153 if (g_parse_mode == PROGRAM) {
154 clear_doctext();
155 g_doctext = strdup(parsed.c_str() + 3);
156 assert(strlen(g_doctext) >= 2);
157 g_doctext[strlen(g_doctext) - 2] = ' ';
158 g_doctext[strlen(g_doctext) - 1] = '\0';
159 g_doctext = clean_up_doctext(g_doctext);
160 g_doctext_lineno = yylineno;
161 if( (g_program_doctext_candidate == NULL) && (g_program_doctext_status == INVALID)){
162 g_program_doctext_candidate = strdup(g_doctext);
163 g_program_doctext_lineno = g_doctext_lineno;
164 g_program_doctext_status = STILL_CANDIDATE;
165 pdebug("%s","program doctext set to STILL_CANDIDATE");
166 }
167 }
168}
169
170{multicm_begin} { /* parsed, but thrown away */
171 std::string parsed("/*");
172 int state = 0; // 0 = normal, 1 = "*" seen, "*/" seen
173 while(state < 2)
174 {
175 int ch = yyinput();
176 parsed.push_back(ch);
177 switch (ch) {
178 case EOF:
179 yyerror("Unexpected end of file in multiline comment at %d\n", yylineno);
180 exit(1);
181 case '*':
182 state = 1;
183 break;
184 case '/':
185 state = (state == 1) ? 2 : 0;
186 break;
187 default:
188 state = 0;
189 break;
190 }
191 }
192 pdebug("multi_comm = \"%s\"\n",parsed.c_str());
193}
194
Mark Sleebd588222007-11-21 08:43:35 +0000195{comment} { /* do nothing */ }
196{unixcomment} { /* do nothing */ }
Mark Slee31985722006-05-24 21:45:31 +0000197
Mark Sleebd588222007-11-21 08:43:35 +0000198{symbol} { return yytext[0]; }
Roger Meier0c3c8952011-08-22 21:38:16 +0000199"*" { return yytext[0]; }
Mark Slee9cb7c612006-09-01 22:17:45 +0000200
Bryan Duxbury6c928f32011-10-13 21:32:52 +0000201"false" { yylval.iconst=0; return tok_int_constant; }
202"true" { yylval.iconst=1; return tok_int_constant; }
203
Mark Sleebd588222007-11-21 08:43:35 +0000204"namespace" { return tok_namespace; }
Jens Geyer73880372015-11-14 15:21:57 +0100205"cpp_namespace" { error_unsupported_namespace_decl("cpp"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000206"cpp_include" { return tok_cpp_include; }
207"cpp_type" { return tok_cpp_type; }
Jens Geyer73880372015-11-14 15:21:57 +0100208"java_package" { error_unsupported_namespace_decl("java_package", "java"); /* do nothing */ }
209"cocoa_prefix" { error_unsupported_namespace_decl("cocoa_prefix", "cocoa"); /* do nothing */ }
210"csharp_namespace" { error_unsupported_namespace_decl("csharp"); /* do nothing */ }
211"delphi_namespace" { error_unsupported_namespace_decl("delphi"); /* do nothing */ }
212"php_namespace" { error_unsupported_namespace_decl("php"); /* do nothing */ }
213"py_module" { error_unsupported_namespace_decl("py_module", "py"); /* do nothing */ }
214"perl_package" { error_unsupported_namespace_decl("perl_package", "perl"); /* do nothing */ }
215"ruby_namespace" { error_unsupported_namespace_decl("ruby"); /* do nothing */ }
216"smalltalk_category" { error_unsupported_namespace_decl("smalltalk_category", "smalltalk.category"); /* do nothing */ }
217"smalltalk_prefix" { error_unsupported_namespace_decl("smalltalk_category", "smalltalk.category"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000218"xsd_all" { return tok_xsd_all; }
219"xsd_optional" { return tok_xsd_optional; }
220"xsd_nillable" { return tok_xsd_nillable; }
Jens Geyer73880372015-11-14 15:21:57 +0100221"xsd_namespace" { error_unsupported_namespace_decl("xsd"); /* do nothing */ }
Mark Sleebd588222007-11-21 08:43:35 +0000222"xsd_attrs" { return tok_xsd_attrs; }
223"include" { return tok_include; }
224"void" { return tok_void; }
225"bool" { return tok_bool; }
dtmuller052abc32016-07-26 11:58:28 +0200226"byte" {
Jens Geyer40c28d32015-10-20 23:13:02 +0200227 emit_byte_type_warning();
228 return tok_i8;
229}
230"i8" { return tok_i8; }
Mark Sleebd588222007-11-21 08:43:35 +0000231"i16" { return tok_i16; }
232"i32" { return tok_i32; }
233"i64" { return tok_i64; }
234"double" { return tok_double; }
235"string" { return tok_string; }
236"binary" { return tok_binary; }
Jens Geyer0ca234f2013-06-04 22:01:47 +0200237"slist" {
238 pwarning(0, "\"slist\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
239 return tok_slist;
240}
Carl Yeksigianc3178522013-06-07 12:31:13 -0400241"senum" {
242 pwarning(0, "\"senum\" is deprecated and will be removed in a future compiler version. This type should be replaced with \"string\".\n");
243 return tok_senum;
244}
Mark Sleebd588222007-11-21 08:43:35 +0000245"map" { return tok_map; }
246"list" { return tok_list; }
247"set" { return tok_set; }
David Reisscecbed82009-03-24 20:02:22 +0000248"oneway" { return tok_oneway; }
Mark Sleebd588222007-11-21 08:43:35 +0000249"typedef" { return tok_typedef; }
250"struct" { return tok_struct; }
Bryan Duxburyab3666e2009-09-01 23:03:47 +0000251"union" { return tok_union; }
Mark Sleebd588222007-11-21 08:43:35 +0000252"exception" { return tok_xception; }
253"extends" { return tok_extends; }
254"throws" { return tok_throws; }
255"service" { return tok_service; }
256"enum" { return tok_enum; }
257"const" { return tok_const; }
258"required" { return tok_required; }
259"optional" { return tok_optional; }
David Reisscecbed82009-03-24 20:02:22 +0000260"async" {
261 pwarning(0, "\"async\" is deprecated. It is called \"oneway\" now.\n");
262 return tok_oneway;
263}
Jens Geyer885c6792014-05-02 21:31:55 +0200264"&" { return tok_reference; }
Mark Sleef0712dc2006-10-25 19:03:57 +0000265
Mark Slee52f643d2006-08-09 00:03:43 +0000266
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000267"BEGIN" { thrift_reserved_keyword(yytext); }
268"END" { thrift_reserved_keyword(yytext); }
269"__CLASS__" { thrift_reserved_keyword(yytext); }
270"__DIR__" { thrift_reserved_keyword(yytext); }
271"__FILE__" { thrift_reserved_keyword(yytext); }
272"__FUNCTION__" { thrift_reserved_keyword(yytext); }
273"__LINE__" { thrift_reserved_keyword(yytext); }
274"__METHOD__" { thrift_reserved_keyword(yytext); }
275"__NAMESPACE__" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000276"abstract" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000277"alias" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000278"and" { thrift_reserved_keyword(yytext); }
Mark Sleec27fc312007-12-21 23:52:19 +0000279"args" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000280"as" { thrift_reserved_keyword(yytext); }
281"assert" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000282"begin" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000283"break" { thrift_reserved_keyword(yytext); }
284"case" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000285"catch" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000286"class" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000287"clone" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000288"continue" { thrift_reserved_keyword(yytext); }
289"declare" { thrift_reserved_keyword(yytext); }
290"def" { thrift_reserved_keyword(yytext); }
291"default" { thrift_reserved_keyword(yytext); }
292"del" { thrift_reserved_keyword(yytext); }
293"delete" { thrift_reserved_keyword(yytext); }
294"do" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000295"dynamic" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000296"elif" { thrift_reserved_keyword(yytext); }
297"else" { thrift_reserved_keyword(yytext); }
298"elseif" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000299"elsif" { thrift_reserved_keyword(yytext); }
300"end" { thrift_reserved_keyword(yytext); }
301"enddeclare" { thrift_reserved_keyword(yytext); }
302"endfor" { thrift_reserved_keyword(yytext); }
303"endforeach" { thrift_reserved_keyword(yytext); }
304"endif" { thrift_reserved_keyword(yytext); }
305"endswitch" { thrift_reserved_keyword(yytext); }
306"endwhile" { thrift_reserved_keyword(yytext); }
307"ensure" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000308"except" { thrift_reserved_keyword(yytext); }
309"exec" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000310"finally" { thrift_reserved_keyword(yytext); }
311"float" { thrift_reserved_keyword(yytext); }
312"for" { thrift_reserved_keyword(yytext); }
313"foreach" { thrift_reserved_keyword(yytext); }
jfarrella1ae93f2015-09-24 22:57:33 -0400314"from" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000315"function" { thrift_reserved_keyword(yytext); }
316"global" { thrift_reserved_keyword(yytext); }
317"goto" { thrift_reserved_keyword(yytext); }
318"if" { thrift_reserved_keyword(yytext); }
319"implements" { thrift_reserved_keyword(yytext); }
320"import" { thrift_reserved_keyword(yytext); }
321"in" { thrift_reserved_keyword(yytext); }
322"inline" { thrift_reserved_keyword(yytext); }
323"instanceof" { thrift_reserved_keyword(yytext); }
324"interface" { thrift_reserved_keyword(yytext); }
325"is" { thrift_reserved_keyword(yytext); }
326"lambda" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000327"module" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000328"native" { thrift_reserved_keyword(yytext); }
329"new" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000330"next" { thrift_reserved_keyword(yytext); }
331"nil" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000332"not" { thrift_reserved_keyword(yytext); }
333"or" { thrift_reserved_keyword(yytext); }
Jens Geyere33d1652015-07-24 02:14:43 +0200334"package" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000335"pass" { thrift_reserved_keyword(yytext); }
336"public" { thrift_reserved_keyword(yytext); }
337"print" { thrift_reserved_keyword(yytext); }
338"private" { thrift_reserved_keyword(yytext); }
339"protected" { thrift_reserved_keyword(yytext); }
340"raise" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000341"redo" { thrift_reserved_keyword(yytext); }
342"rescue" { thrift_reserved_keyword(yytext); }
343"retry" { thrift_reserved_keyword(yytext); }
Mark Sleef5a0b3d2009-08-13 19:21:40 +0000344"register" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000345"return" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000346"self" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000347"sizeof" { thrift_reserved_keyword(yytext); }
348"static" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000349"super" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000350"switch" { thrift_reserved_keyword(yytext); }
351"synchronized" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000352"then" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000353"this" { thrift_reserved_keyword(yytext); }
354"throw" { thrift_reserved_keyword(yytext); }
355"transient" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000356"try" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000357"undef" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000358"unless" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000359"unsigned" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000360"until" { thrift_reserved_keyword(yytext); }
361"use" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000362"var" { thrift_reserved_keyword(yytext); }
363"virtual" { thrift_reserved_keyword(yytext); }
364"volatile" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000365"when" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000366"while" { thrift_reserved_keyword(yytext); }
367"with" { thrift_reserved_keyword(yytext); }
Bryan Duxbury7f3285e2010-08-05 23:28:14 +0000368"xor" { thrift_reserved_keyword(yytext); }
Mark Sleebd588222007-11-21 08:43:35 +0000369"yield" { thrift_reserved_keyword(yytext); }
Mark Sleef12865a2007-01-12 00:23:26 +0000370
Mark Slee4f8da1d2006-10-12 02:47:27 +0000371{intconstant} {
David Reissf1454162008-06-30 20:45:47 +0000372 errno = 0;
373 yylval.iconst = strtoll(yytext, NULL, 10);
374 if (errno == ERANGE) {
375 integer_overflow(yytext);
376 }
Mark Slee4f8da1d2006-10-12 02:47:27 +0000377 return tok_int_constant;
378}
Mark Sleef5377b32006-10-10 01:42:59 +0000379
Mark Slee600cdb32006-11-29 22:06:42 +0000380{hexconstant} {
David Reissf1454162008-06-30 20:45:47 +0000381 errno = 0;
Jens Geyer5ec21212015-04-26 15:24:59 +0200382 char sign = yytext[0];
383 int shift = sign == '0' ? 2 : 3;
384 yylval.iconst = strtoll(yytext+shift, NULL, 16);
385 if (sign == '-') {
386 yylval.iconst = -yylval.iconst;
387 }
David Reissf1454162008-06-30 20:45:47 +0000388 if (errno == ERANGE) {
389 integer_overflow(yytext);
390 }
Mark Slee600cdb32006-11-29 22:06:42 +0000391 return tok_int_constant;
392}
393
Mark Slee4f8da1d2006-10-12 02:47:27 +0000394{identifier} {
395 yylval.id = strdup(yytext);
396 return tok_identifier;
397}
398
Jens Geyer5eed3a12015-12-08 01:32:12 +0100399{dubconstant} {
400 /* Deliberately placed after identifier, since "e10" is NOT a double literal (THRIFT-3477) */
401 yylval.dconst = atof(yytext);
402 return tok_dub_constant;
403}
404
David Reiss82e6fc02009-03-26 23:32:36 +0000405{literal_begin} {
406 char mark = yytext[0];
407 std::string result;
408 for(;;)
409 {
410 int ch = yyinput();
411 switch (ch) {
412 case EOF:
413 yyerror("End of file while read string at %d\n", yylineno);
414 exit(1);
415 case '\n':
416 yyerror("End of line while read string at %d\n", yylineno - 1);
417 exit(1);
418 case '\\':
419 ch = yyinput();
420 switch (ch) {
421 case 'r':
422 result.push_back('\r');
423 continue;
424 case 'n':
425 result.push_back('\n');
426 continue;
427 case 't':
428 result.push_back('\t');
429 continue;
430 case '"':
431 result.push_back('"');
432 continue;
433 case '\'':
434 result.push_back('\'');
435 continue;
436 case '\\':
437 result.push_back('\\');
438 continue;
439 default:
440 yyerror("Bad escape character\n");
441 return -1;
442 }
443 break;
444 default:
445 if (ch == mark) {
446 yylval.id = strdup(result.c_str());
447 return tok_literal;
448 } else {
449 result.push_back(ch);
450 }
451 }
452 }
Mark Slee30152872006-11-28 01:24:07 +0000453}
454
Mark Slee31985722006-05-24 21:45:31 +0000455
Bryan Duxbury235f8b52011-08-19 18:27:47 +0000456. {
457 unexpected_token(yytext);
458}
459
Mark Slee31985722006-05-24 21:45:31 +0000460%%
David Reiss4a054342009-03-26 23:32:27 +0000461
462/* vim: filetype=lex
463*/