1 /* 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 9 * 10 * 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. 18 */ 19 20 #ifndef T_GLOBALS_H 21 #define T_GLOBALS_H 22 23 #include <set> 24 #include <queue> 25 #include <stack> 26 #include <vector> 27 #include <string> 28 29 /** 30 * This module contains all the global variables (slap on the wrist) that are 31 * shared throughout the program. The reason for this is to facilitate simple 32 * interaction between the parser and the rest of the program. Before calling 33 * yyparse(), the main.cc program will make necessary adjustments to these 34 * global variables such that the parser does the right thing and puts entries 35 * into the right containers, etc. 36 * 37 */ 38 39 /** 40 * Hooray for forward declaration of types! 41 */ 42 43 class t_program; 44 class t_scope; 45 class t_type; 46 47 /** 48 * Parsing mode, two passes up in this gin rummy! 49 */ 50 51 enum PARSE_MODE { INCLUDES = 1, PROGRAM = 2 }; 52 53 /** 54 * Strictness level 55 */ 56 extern int g_strict; 57 58 /** 59 * The master program parse tree. This is accessed from within the parser code 60 * to build up the program elements. 61 */ 62 extern t_program* g_program; 63 64 /** 65 * The scope that we are currently parsing into 66 */ 67 extern t_scope* g_scope; 68 69 /** 70 * The parent scope to also load symbols into 71 */ 72 extern t_scope* g_parent_scope; 73 74 /** 75 * The prefix for the parent scope entries 76 */ 77 extern std::string g_parent_prefix; 78 79 /** 80 * The parsing pass that we are on. We do different things on each pass. 81 */ 82 extern PARSE_MODE g_parse_mode; 83 84 /** 85 * Global time string, used in formatting error messages etc. 86 */ 87 extern char* g_time_str; 88 89 /** 90 * The last parsed doctext comment. 91 */ 92 extern char* g_doctext; 93 94 /** 95 * The location of the last parsed doctext comment. 96 */ 97 extern int g_doctext_lineno; 98 99 /** 100 * Status of program level doctext candidate 101 */ 102 enum PROGDOCTEXT_STATUS { 103 INVALID = 0, 104 STILL_CANDIDATE = 1, // the text may or may not be the program doctext 105 ALREADY_PROCESSED = 2, // doctext has been used and is no longer available 106 ABSOLUTELY_SURE = 3, // this is the program doctext 107 NO_PROGRAM_DOCTEXT = 4 // there is no program doctext 108 }; 109 110 /** 111 * The program level doctext. Stored separately to make parsing easier. 112 */ 113 extern char* g_program_doctext_candidate; 114 extern int g_program_doctext_lineno; 115 extern PROGDOCTEXT_STATUS g_program_doctext_status; 116 117 /** 118 * Whether or not negative field keys are accepted. 119 * 120 * When a field does not have a user-specified key, thrift automatically 121 * assigns a negative value. However, this is fragile since changes to the 122 * file may unintentionally change the key numbering, resulting in a new 123 * protocol that is not backwards compatible. 124 * 125 * When g_allow_neg_field_keys is enabled, users can explicitly specify 126 * negative keys. This way they can write a .thrift file with explicitly 127 * specified keys that is still backwards compatible with older .thrift files 128 * that did not specify key values. 129 */ 130 extern int g_allow_neg_field_keys; 131 132 /** 133 * Whether or not 64-bit constants will generate a warning. 134 * 135 * Some languages don't support 64-bit constants, but many do, so we can 136 * suppress this warning for projects that don't use any non-64-bit-safe 137 * languages. 138 */ 139 extern int g_allow_64bit_consts; 140 141 #endif 142