1*cda5da8dSAndroid Build Coastguard Worker # C++ skeleton for Bison 2*cda5da8dSAndroid Build Coastguard Worker 3*cda5da8dSAndroid Build Coastguard Worker # Copyright (C) 2002-2015, 2018-2021 Free Software Foundation, Inc. 4*cda5da8dSAndroid Build Coastguard Worker 5*cda5da8dSAndroid Build Coastguard Worker # This program is free software: you can redistribute it and/or modify 6*cda5da8dSAndroid Build Coastguard Worker # it under the terms of the GNU General Public License as published by 7*cda5da8dSAndroid Build Coastguard Worker # the Free Software Foundation, either version 3 of the License, or 8*cda5da8dSAndroid Build Coastguard Worker # (at your option) any later version. 9*cda5da8dSAndroid Build Coastguard Worker # 10*cda5da8dSAndroid Build Coastguard Worker # This program is distributed in the hope that it will be useful, 11*cda5da8dSAndroid Build Coastguard Worker # but WITHOUT ANY WARRANTY; without even the implied warranty of 12*cda5da8dSAndroid Build Coastguard Worker # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13*cda5da8dSAndroid Build Coastguard Worker # GNU General Public License for more details. 14*cda5da8dSAndroid Build Coastguard Worker # 15*cda5da8dSAndroid Build Coastguard Worker # You should have received a copy of the GNU General Public License 16*cda5da8dSAndroid Build Coastguard Worker # along with this program. If not, see <https://www.gnu.org/licenses/>. 17*cda5da8dSAndroid Build Coastguard Worker 18*cda5da8dSAndroid Build Coastguard Worker m4_pushdef([b4_copyright_years], 19*cda5da8dSAndroid Build Coastguard Worker [2002-2015, 2018-2021]) 20*cda5da8dSAndroid Build Coastguard Worker 21*cda5da8dSAndroid Build Coastguard Worker 22*cda5da8dSAndroid Build Coastguard Worker # b4_location_file 23*cda5da8dSAndroid Build Coastguard Worker # ---------------- 24*cda5da8dSAndroid Build Coastguard Worker # Name of the file containing the position/location class, 25*cda5da8dSAndroid Build Coastguard Worker # if we want this file. 26*cda5da8dSAndroid Build Coastguard Worker b4_percent_define_check_file([b4_location_file], 27*cda5da8dSAndroid Build Coastguard Worker [[api.location.file]], 28*cda5da8dSAndroid Build Coastguard Worker b4_header_if([[location.hh]])) 29*cda5da8dSAndroid Build Coastguard Worker 30*cda5da8dSAndroid Build Coastguard Worker # b4_location_include 31*cda5da8dSAndroid Build Coastguard Worker # ------------------- 32*cda5da8dSAndroid Build Coastguard Worker # If location.hh is to be generated, the name under which should it be 33*cda5da8dSAndroid Build Coastguard Worker # included. 34*cda5da8dSAndroid Build Coastguard Worker # 35*cda5da8dSAndroid Build Coastguard Worker # b4_location_path 36*cda5da8dSAndroid Build Coastguard Worker # ---------------- 37*cda5da8dSAndroid Build Coastguard Worker # The path to use for the CPP guard. 38*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_location_file], 39*cda5da8dSAndroid Build Coastguard Worker [m4_define([b4_location_include], 40*cda5da8dSAndroid Build Coastguard Worker [b4_percent_define_get([[api.location.include]], 41*cda5da8dSAndroid Build Coastguard Worker ["b4_location_file"])]) 42*cda5da8dSAndroid Build Coastguard Worker m4_define([b4_location_path], 43*cda5da8dSAndroid Build Coastguard Worker b4_percent_define_get([[api.location.include]], 44*cda5da8dSAndroid Build Coastguard Worker ["b4_mapped_dir_prefix[]b4_location_file"])) 45*cda5da8dSAndroid Build Coastguard Worker m4_define([b4_location_path], 46*cda5da8dSAndroid Build Coastguard Worker m4_substr(m4_defn([b4_location_path]), 1, m4_eval(m4_len(m4_defn([b4_location_path])) - 2))) 47*cda5da8dSAndroid Build Coastguard Worker ]) 48*cda5da8dSAndroid Build Coastguard Worker 49*cda5da8dSAndroid Build Coastguard Worker 50*cda5da8dSAndroid Build Coastguard Worker # b4_position_file 51*cda5da8dSAndroid Build Coastguard Worker # ---------------- 52*cda5da8dSAndroid Build Coastguard Worker # Name of the file containing the position class, if we want this file. 53*cda5da8dSAndroid Build Coastguard Worker b4_header_if( 54*cda5da8dSAndroid Build Coastguard Worker [b4_required_version_if( 55*cda5da8dSAndroid Build Coastguard Worker [30200], [], 56*cda5da8dSAndroid Build Coastguard Worker [m4_ifdef([b4_location_file], 57*cda5da8dSAndroid Build Coastguard Worker [m4_define([b4_position_file], [position.hh])])])]) 58*cda5da8dSAndroid Build Coastguard Worker 59*cda5da8dSAndroid Build Coastguard Worker 60*cda5da8dSAndroid Build Coastguard Worker 61*cda5da8dSAndroid Build Coastguard Worker # b4_location_define 62*cda5da8dSAndroid Build Coastguard Worker # ------------------ 63*cda5da8dSAndroid Build Coastguard Worker # Define the position and location classes. 64*cda5da8dSAndroid Build Coastguard Worker m4_define([b4_location_define], 65*cda5da8dSAndroid Build Coastguard Worker [[ /// A point in a source file. 66*cda5da8dSAndroid Build Coastguard Worker class position 67*cda5da8dSAndroid Build Coastguard Worker { 68*cda5da8dSAndroid Build Coastguard Worker public: 69*cda5da8dSAndroid Build Coastguard Worker /// Type for file name. 70*cda5da8dSAndroid Build Coastguard Worker typedef ]b4_percent_define_get([[api.filename.type]])[ filename_type; 71*cda5da8dSAndroid Build Coastguard Worker /// Type for line and column numbers. 72*cda5da8dSAndroid Build Coastguard Worker typedef int counter_type; 73*cda5da8dSAndroid Build Coastguard Worker ]m4_ifdef([b4_location_constructors], [[ 74*cda5da8dSAndroid Build Coastguard Worker /// Construct a position. 75*cda5da8dSAndroid Build Coastguard Worker explicit position (filename_type* f = YY_NULLPTR, 76*cda5da8dSAndroid Build Coastguard Worker counter_type l = ]b4_location_initial_line[, 77*cda5da8dSAndroid Build Coastguard Worker counter_type c = ]b4_location_initial_column[) 78*cda5da8dSAndroid Build Coastguard Worker : filename (f) 79*cda5da8dSAndroid Build Coastguard Worker , line (l) 80*cda5da8dSAndroid Build Coastguard Worker , column (c) 81*cda5da8dSAndroid Build Coastguard Worker {} 82*cda5da8dSAndroid Build Coastguard Worker 83*cda5da8dSAndroid Build Coastguard Worker ]])[ 84*cda5da8dSAndroid Build Coastguard Worker /// Initialization. 85*cda5da8dSAndroid Build Coastguard Worker void initialize (filename_type* fn = YY_NULLPTR, 86*cda5da8dSAndroid Build Coastguard Worker counter_type l = ]b4_location_initial_line[, 87*cda5da8dSAndroid Build Coastguard Worker counter_type c = ]b4_location_initial_column[) 88*cda5da8dSAndroid Build Coastguard Worker { 89*cda5da8dSAndroid Build Coastguard Worker filename = fn; 90*cda5da8dSAndroid Build Coastguard Worker line = l; 91*cda5da8dSAndroid Build Coastguard Worker column = c; 92*cda5da8dSAndroid Build Coastguard Worker } 93*cda5da8dSAndroid Build Coastguard Worker 94*cda5da8dSAndroid Build Coastguard Worker /** \name Line and Column related manipulators 95*cda5da8dSAndroid Build Coastguard Worker ** \{ */ 96*cda5da8dSAndroid Build Coastguard Worker /// (line related) Advance to the COUNT next lines. 97*cda5da8dSAndroid Build Coastguard Worker void lines (counter_type count = 1) 98*cda5da8dSAndroid Build Coastguard Worker { 99*cda5da8dSAndroid Build Coastguard Worker if (count) 100*cda5da8dSAndroid Build Coastguard Worker { 101*cda5da8dSAndroid Build Coastguard Worker column = ]b4_location_initial_column[; 102*cda5da8dSAndroid Build Coastguard Worker line = add_ (line, count, ]b4_location_initial_line[); 103*cda5da8dSAndroid Build Coastguard Worker } 104*cda5da8dSAndroid Build Coastguard Worker } 105*cda5da8dSAndroid Build Coastguard Worker 106*cda5da8dSAndroid Build Coastguard Worker /// (column related) Advance to the COUNT next columns. 107*cda5da8dSAndroid Build Coastguard Worker void columns (counter_type count = 1) 108*cda5da8dSAndroid Build Coastguard Worker { 109*cda5da8dSAndroid Build Coastguard Worker column = add_ (column, count, ]b4_location_initial_column[); 110*cda5da8dSAndroid Build Coastguard Worker } 111*cda5da8dSAndroid Build Coastguard Worker /** \} */ 112*cda5da8dSAndroid Build Coastguard Worker 113*cda5da8dSAndroid Build Coastguard Worker /// File name to which this position refers. 114*cda5da8dSAndroid Build Coastguard Worker filename_type* filename; 115*cda5da8dSAndroid Build Coastguard Worker /// Current line number. 116*cda5da8dSAndroid Build Coastguard Worker counter_type line; 117*cda5da8dSAndroid Build Coastguard Worker /// Current column number. 118*cda5da8dSAndroid Build Coastguard Worker counter_type column; 119*cda5da8dSAndroid Build Coastguard Worker 120*cda5da8dSAndroid Build Coastguard Worker private: 121*cda5da8dSAndroid Build Coastguard Worker /// Compute max (min, lhs+rhs). 122*cda5da8dSAndroid Build Coastguard Worker static counter_type add_ (counter_type lhs, counter_type rhs, counter_type min) 123*cda5da8dSAndroid Build Coastguard Worker { 124*cda5da8dSAndroid Build Coastguard Worker return lhs + rhs < min ? min : lhs + rhs; 125*cda5da8dSAndroid Build Coastguard Worker } 126*cda5da8dSAndroid Build Coastguard Worker }; 127*cda5da8dSAndroid Build Coastguard Worker 128*cda5da8dSAndroid Build Coastguard Worker /// Add \a width columns, in place. 129*cda5da8dSAndroid Build Coastguard Worker inline position& 130*cda5da8dSAndroid Build Coastguard Worker operator+= (position& res, position::counter_type width) 131*cda5da8dSAndroid Build Coastguard Worker { 132*cda5da8dSAndroid Build Coastguard Worker res.columns (width); 133*cda5da8dSAndroid Build Coastguard Worker return res; 134*cda5da8dSAndroid Build Coastguard Worker } 135*cda5da8dSAndroid Build Coastguard Worker 136*cda5da8dSAndroid Build Coastguard Worker /// Add \a width columns. 137*cda5da8dSAndroid Build Coastguard Worker inline position 138*cda5da8dSAndroid Build Coastguard Worker operator+ (position res, position::counter_type width) 139*cda5da8dSAndroid Build Coastguard Worker { 140*cda5da8dSAndroid Build Coastguard Worker return res += width; 141*cda5da8dSAndroid Build Coastguard Worker } 142*cda5da8dSAndroid Build Coastguard Worker 143*cda5da8dSAndroid Build Coastguard Worker /// Subtract \a width columns, in place. 144*cda5da8dSAndroid Build Coastguard Worker inline position& 145*cda5da8dSAndroid Build Coastguard Worker operator-= (position& res, position::counter_type width) 146*cda5da8dSAndroid Build Coastguard Worker { 147*cda5da8dSAndroid Build Coastguard Worker return res += -width; 148*cda5da8dSAndroid Build Coastguard Worker } 149*cda5da8dSAndroid Build Coastguard Worker 150*cda5da8dSAndroid Build Coastguard Worker /// Subtract \a width columns. 151*cda5da8dSAndroid Build Coastguard Worker inline position 152*cda5da8dSAndroid Build Coastguard Worker operator- (position res, position::counter_type width) 153*cda5da8dSAndroid Build Coastguard Worker { 154*cda5da8dSAndroid Build Coastguard Worker return res -= width; 155*cda5da8dSAndroid Build Coastguard Worker } 156*cda5da8dSAndroid Build Coastguard Worker ]b4_percent_define_flag_if([[define_location_comparison]], [[ 157*cda5da8dSAndroid Build Coastguard Worker /// Compare two position objects. 158*cda5da8dSAndroid Build Coastguard Worker inline bool 159*cda5da8dSAndroid Build Coastguard Worker operator== (const position& pos1, const position& pos2) 160*cda5da8dSAndroid Build Coastguard Worker { 161*cda5da8dSAndroid Build Coastguard Worker return (pos1.line == pos2.line 162*cda5da8dSAndroid Build Coastguard Worker && pos1.column == pos2.column 163*cda5da8dSAndroid Build Coastguard Worker && (pos1.filename == pos2.filename 164*cda5da8dSAndroid Build Coastguard Worker || (pos1.filename && pos2.filename 165*cda5da8dSAndroid Build Coastguard Worker && *pos1.filename == *pos2.filename))); 166*cda5da8dSAndroid Build Coastguard Worker } 167*cda5da8dSAndroid Build Coastguard Worker 168*cda5da8dSAndroid Build Coastguard Worker /// Compare two position objects. 169*cda5da8dSAndroid Build Coastguard Worker inline bool 170*cda5da8dSAndroid Build Coastguard Worker operator!= (const position& pos1, const position& pos2) 171*cda5da8dSAndroid Build Coastguard Worker { 172*cda5da8dSAndroid Build Coastguard Worker return !(pos1 == pos2); 173*cda5da8dSAndroid Build Coastguard Worker } 174*cda5da8dSAndroid Build Coastguard Worker ]])[ 175*cda5da8dSAndroid Build Coastguard Worker /** \brief Intercept output stream redirection. 176*cda5da8dSAndroid Build Coastguard Worker ** \param ostr the destination output stream 177*cda5da8dSAndroid Build Coastguard Worker ** \param pos a reference to the position to redirect 178*cda5da8dSAndroid Build Coastguard Worker */ 179*cda5da8dSAndroid Build Coastguard Worker template <typename YYChar> 180*cda5da8dSAndroid Build Coastguard Worker std::basic_ostream<YYChar>& 181*cda5da8dSAndroid Build Coastguard Worker operator<< (std::basic_ostream<YYChar>& ostr, const position& pos) 182*cda5da8dSAndroid Build Coastguard Worker { 183*cda5da8dSAndroid Build Coastguard Worker if (pos.filename) 184*cda5da8dSAndroid Build Coastguard Worker ostr << *pos.filename << ':'; 185*cda5da8dSAndroid Build Coastguard Worker return ostr << pos.line << '.' << pos.column; 186*cda5da8dSAndroid Build Coastguard Worker } 187*cda5da8dSAndroid Build Coastguard Worker 188*cda5da8dSAndroid Build Coastguard Worker /// Two points in a source file. 189*cda5da8dSAndroid Build Coastguard Worker class location 190*cda5da8dSAndroid Build Coastguard Worker { 191*cda5da8dSAndroid Build Coastguard Worker public: 192*cda5da8dSAndroid Build Coastguard Worker /// Type for file name. 193*cda5da8dSAndroid Build Coastguard Worker typedef position::filename_type filename_type; 194*cda5da8dSAndroid Build Coastguard Worker /// Type for line and column numbers. 195*cda5da8dSAndroid Build Coastguard Worker typedef position::counter_type counter_type; 196*cda5da8dSAndroid Build Coastguard Worker ]m4_ifdef([b4_location_constructors], [ 197*cda5da8dSAndroid Build Coastguard Worker /// Construct a location from \a b to \a e. 198*cda5da8dSAndroid Build Coastguard Worker location (const position& b, const position& e) 199*cda5da8dSAndroid Build Coastguard Worker : begin (b) 200*cda5da8dSAndroid Build Coastguard Worker , end (e) 201*cda5da8dSAndroid Build Coastguard Worker {} 202*cda5da8dSAndroid Build Coastguard Worker 203*cda5da8dSAndroid Build Coastguard Worker /// Construct a 0-width location in \a p. 204*cda5da8dSAndroid Build Coastguard Worker explicit location (const position& p = position ()) 205*cda5da8dSAndroid Build Coastguard Worker : begin (p) 206*cda5da8dSAndroid Build Coastguard Worker , end (p) 207*cda5da8dSAndroid Build Coastguard Worker {} 208*cda5da8dSAndroid Build Coastguard Worker 209*cda5da8dSAndroid Build Coastguard Worker /// Construct a 0-width location in \a f, \a l, \a c. 210*cda5da8dSAndroid Build Coastguard Worker explicit location (filename_type* f, 211*cda5da8dSAndroid Build Coastguard Worker counter_type l = ]b4_location_initial_line[, 212*cda5da8dSAndroid Build Coastguard Worker counter_type c = ]b4_location_initial_column[) 213*cda5da8dSAndroid Build Coastguard Worker : begin (f, l, c) 214*cda5da8dSAndroid Build Coastguard Worker , end (f, l, c) 215*cda5da8dSAndroid Build Coastguard Worker {} 216*cda5da8dSAndroid Build Coastguard Worker 217*cda5da8dSAndroid Build Coastguard Worker ])[ 218*cda5da8dSAndroid Build Coastguard Worker /// Initialization. 219*cda5da8dSAndroid Build Coastguard Worker void initialize (filename_type* f = YY_NULLPTR, 220*cda5da8dSAndroid Build Coastguard Worker counter_type l = ]b4_location_initial_line[, 221*cda5da8dSAndroid Build Coastguard Worker counter_type c = ]b4_location_initial_column[) 222*cda5da8dSAndroid Build Coastguard Worker { 223*cda5da8dSAndroid Build Coastguard Worker begin.initialize (f, l, c); 224*cda5da8dSAndroid Build Coastguard Worker end = begin; 225*cda5da8dSAndroid Build Coastguard Worker } 226*cda5da8dSAndroid Build Coastguard Worker 227*cda5da8dSAndroid Build Coastguard Worker /** \name Line and Column related manipulators 228*cda5da8dSAndroid Build Coastguard Worker ** \{ */ 229*cda5da8dSAndroid Build Coastguard Worker public: 230*cda5da8dSAndroid Build Coastguard Worker /// Reset initial location to final location. 231*cda5da8dSAndroid Build Coastguard Worker void step () 232*cda5da8dSAndroid Build Coastguard Worker { 233*cda5da8dSAndroid Build Coastguard Worker begin = end; 234*cda5da8dSAndroid Build Coastguard Worker } 235*cda5da8dSAndroid Build Coastguard Worker 236*cda5da8dSAndroid Build Coastguard Worker /// Extend the current location to the COUNT next columns. 237*cda5da8dSAndroid Build Coastguard Worker void columns (counter_type count = 1) 238*cda5da8dSAndroid Build Coastguard Worker { 239*cda5da8dSAndroid Build Coastguard Worker end += count; 240*cda5da8dSAndroid Build Coastguard Worker } 241*cda5da8dSAndroid Build Coastguard Worker 242*cda5da8dSAndroid Build Coastguard Worker /// Extend the current location to the COUNT next lines. 243*cda5da8dSAndroid Build Coastguard Worker void lines (counter_type count = 1) 244*cda5da8dSAndroid Build Coastguard Worker { 245*cda5da8dSAndroid Build Coastguard Worker end.lines (count); 246*cda5da8dSAndroid Build Coastguard Worker } 247*cda5da8dSAndroid Build Coastguard Worker /** \} */ 248*cda5da8dSAndroid Build Coastguard Worker 249*cda5da8dSAndroid Build Coastguard Worker 250*cda5da8dSAndroid Build Coastguard Worker public: 251*cda5da8dSAndroid Build Coastguard Worker /// Beginning of the located region. 252*cda5da8dSAndroid Build Coastguard Worker position begin; 253*cda5da8dSAndroid Build Coastguard Worker /// End of the located region. 254*cda5da8dSAndroid Build Coastguard Worker position end; 255*cda5da8dSAndroid Build Coastguard Worker }; 256*cda5da8dSAndroid Build Coastguard Worker 257*cda5da8dSAndroid Build Coastguard Worker /// Join two locations, in place. 258*cda5da8dSAndroid Build Coastguard Worker inline location& 259*cda5da8dSAndroid Build Coastguard Worker operator+= (location& res, const location& end) 260*cda5da8dSAndroid Build Coastguard Worker { 261*cda5da8dSAndroid Build Coastguard Worker res.end = end.end; 262*cda5da8dSAndroid Build Coastguard Worker return res; 263*cda5da8dSAndroid Build Coastguard Worker } 264*cda5da8dSAndroid Build Coastguard Worker 265*cda5da8dSAndroid Build Coastguard Worker /// Join two locations. 266*cda5da8dSAndroid Build Coastguard Worker inline location 267*cda5da8dSAndroid Build Coastguard Worker operator+ (location res, const location& end) 268*cda5da8dSAndroid Build Coastguard Worker { 269*cda5da8dSAndroid Build Coastguard Worker return res += end; 270*cda5da8dSAndroid Build Coastguard Worker } 271*cda5da8dSAndroid Build Coastguard Worker 272*cda5da8dSAndroid Build Coastguard Worker /// Add \a width columns to the end position, in place. 273*cda5da8dSAndroid Build Coastguard Worker inline location& 274*cda5da8dSAndroid Build Coastguard Worker operator+= (location& res, location::counter_type width) 275*cda5da8dSAndroid Build Coastguard Worker { 276*cda5da8dSAndroid Build Coastguard Worker res.columns (width); 277*cda5da8dSAndroid Build Coastguard Worker return res; 278*cda5da8dSAndroid Build Coastguard Worker } 279*cda5da8dSAndroid Build Coastguard Worker 280*cda5da8dSAndroid Build Coastguard Worker /// Add \a width columns to the end position. 281*cda5da8dSAndroid Build Coastguard Worker inline location 282*cda5da8dSAndroid Build Coastguard Worker operator+ (location res, location::counter_type width) 283*cda5da8dSAndroid Build Coastguard Worker { 284*cda5da8dSAndroid Build Coastguard Worker return res += width; 285*cda5da8dSAndroid Build Coastguard Worker } 286*cda5da8dSAndroid Build Coastguard Worker 287*cda5da8dSAndroid Build Coastguard Worker /// Subtract \a width columns to the end position, in place. 288*cda5da8dSAndroid Build Coastguard Worker inline location& 289*cda5da8dSAndroid Build Coastguard Worker operator-= (location& res, location::counter_type width) 290*cda5da8dSAndroid Build Coastguard Worker { 291*cda5da8dSAndroid Build Coastguard Worker return res += -width; 292*cda5da8dSAndroid Build Coastguard Worker } 293*cda5da8dSAndroid Build Coastguard Worker 294*cda5da8dSAndroid Build Coastguard Worker /// Subtract \a width columns to the end position. 295*cda5da8dSAndroid Build Coastguard Worker inline location 296*cda5da8dSAndroid Build Coastguard Worker operator- (location res, location::counter_type width) 297*cda5da8dSAndroid Build Coastguard Worker { 298*cda5da8dSAndroid Build Coastguard Worker return res -= width; 299*cda5da8dSAndroid Build Coastguard Worker } 300*cda5da8dSAndroid Build Coastguard Worker ]b4_percent_define_flag_if([[define_location_comparison]], [[ 301*cda5da8dSAndroid Build Coastguard Worker /// Compare two location objects. 302*cda5da8dSAndroid Build Coastguard Worker inline bool 303*cda5da8dSAndroid Build Coastguard Worker operator== (const location& loc1, const location& loc2) 304*cda5da8dSAndroid Build Coastguard Worker { 305*cda5da8dSAndroid Build Coastguard Worker return loc1.begin == loc2.begin && loc1.end == loc2.end; 306*cda5da8dSAndroid Build Coastguard Worker } 307*cda5da8dSAndroid Build Coastguard Worker 308*cda5da8dSAndroid Build Coastguard Worker /// Compare two location objects. 309*cda5da8dSAndroid Build Coastguard Worker inline bool 310*cda5da8dSAndroid Build Coastguard Worker operator!= (const location& loc1, const location& loc2) 311*cda5da8dSAndroid Build Coastguard Worker { 312*cda5da8dSAndroid Build Coastguard Worker return !(loc1 == loc2); 313*cda5da8dSAndroid Build Coastguard Worker } 314*cda5da8dSAndroid Build Coastguard Worker ]])[ 315*cda5da8dSAndroid Build Coastguard Worker /** \brief Intercept output stream redirection. 316*cda5da8dSAndroid Build Coastguard Worker ** \param ostr the destination output stream 317*cda5da8dSAndroid Build Coastguard Worker ** \param loc a reference to the location to redirect 318*cda5da8dSAndroid Build Coastguard Worker ** 319*cda5da8dSAndroid Build Coastguard Worker ** Avoid duplicate information. 320*cda5da8dSAndroid Build Coastguard Worker */ 321*cda5da8dSAndroid Build Coastguard Worker template <typename YYChar> 322*cda5da8dSAndroid Build Coastguard Worker std::basic_ostream<YYChar>& 323*cda5da8dSAndroid Build Coastguard Worker operator<< (std::basic_ostream<YYChar>& ostr, const location& loc) 324*cda5da8dSAndroid Build Coastguard Worker { 325*cda5da8dSAndroid Build Coastguard Worker location::counter_type end_col 326*cda5da8dSAndroid Build Coastguard Worker = 0 < loc.end.column ? loc.end.column - 1 : 0; 327*cda5da8dSAndroid Build Coastguard Worker ostr << loc.begin; 328*cda5da8dSAndroid Build Coastguard Worker if (loc.end.filename 329*cda5da8dSAndroid Build Coastguard Worker && (!loc.begin.filename 330*cda5da8dSAndroid Build Coastguard Worker || *loc.begin.filename != *loc.end.filename)) 331*cda5da8dSAndroid Build Coastguard Worker ostr << '-' << loc.end.filename << ':' << loc.end.line << '.' << end_col; 332*cda5da8dSAndroid Build Coastguard Worker else if (loc.begin.line < loc.end.line) 333*cda5da8dSAndroid Build Coastguard Worker ostr << '-' << loc.end.line << '.' << end_col; 334*cda5da8dSAndroid Build Coastguard Worker else if (loc.begin.column < end_col) 335*cda5da8dSAndroid Build Coastguard Worker ostr << '-' << end_col; 336*cda5da8dSAndroid Build Coastguard Worker return ostr; 337*cda5da8dSAndroid Build Coastguard Worker } 338*cda5da8dSAndroid Build Coastguard Worker ]]) 339*cda5da8dSAndroid Build Coastguard Worker 340*cda5da8dSAndroid Build Coastguard Worker 341*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_position_file], [[ 342*cda5da8dSAndroid Build Coastguard Worker ]b4_output_begin([b4_dir_prefix], [b4_position_file])[ 343*cda5da8dSAndroid Build Coastguard Worker ]b4_generated_by[ 344*cda5da8dSAndroid Build Coastguard Worker // Starting with Bison 3.2, this file is useless: the structure it 345*cda5da8dSAndroid Build Coastguard Worker // used to define is now defined in "]b4_location_file[". 346*cda5da8dSAndroid Build Coastguard Worker // 347*cda5da8dSAndroid Build Coastguard Worker // To get rid of this file: 348*cda5da8dSAndroid Build Coastguard Worker // 1. add '%require "3.2"' (or newer) to your grammar file 349*cda5da8dSAndroid Build Coastguard Worker // 2. remove references to this file from your build system 350*cda5da8dSAndroid Build Coastguard Worker // 3. if you used to include it, include "]b4_location_file[" instead. 351*cda5da8dSAndroid Build Coastguard Worker 352*cda5da8dSAndroid Build Coastguard Worker #include ]b4_location_include[ 353*cda5da8dSAndroid Build Coastguard Worker ]b4_output_end[ 354*cda5da8dSAndroid Build Coastguard Worker ]]) 355*cda5da8dSAndroid Build Coastguard Worker 356*cda5da8dSAndroid Build Coastguard Worker 357*cda5da8dSAndroid Build Coastguard Worker m4_ifdef([b4_location_file], [[ 358*cda5da8dSAndroid Build Coastguard Worker ]b4_output_begin([b4_dir_prefix], [b4_location_file])[ 359*cda5da8dSAndroid Build Coastguard Worker ]b4_copyright([Locations for Bison parsers in C++])[ 360*cda5da8dSAndroid Build Coastguard Worker /** 361*cda5da8dSAndroid Build Coastguard Worker ** \file ]b4_location_path[ 362*cda5da8dSAndroid Build Coastguard Worker ** Define the ]b4_namespace_ref[::location class. 363*cda5da8dSAndroid Build Coastguard Worker */ 364*cda5da8dSAndroid Build Coastguard Worker 365*cda5da8dSAndroid Build Coastguard Worker ]b4_cpp_guard_open([b4_location_path])[ 366*cda5da8dSAndroid Build Coastguard Worker 367*cda5da8dSAndroid Build Coastguard Worker # include <iostream> 368*cda5da8dSAndroid Build Coastguard Worker # include <string> 369*cda5da8dSAndroid Build Coastguard Worker 370*cda5da8dSAndroid Build Coastguard Worker ]b4_null_define[ 371*cda5da8dSAndroid Build Coastguard Worker 372*cda5da8dSAndroid Build Coastguard Worker ]b4_namespace_open[ 373*cda5da8dSAndroid Build Coastguard Worker ]b4_location_define[ 374*cda5da8dSAndroid Build Coastguard Worker ]b4_namespace_close[ 375*cda5da8dSAndroid Build Coastguard Worker ]b4_cpp_guard_close([b4_location_path])[ 376*cda5da8dSAndroid Build Coastguard Worker ]b4_output_end[ 377*cda5da8dSAndroid Build Coastguard Worker ]]) 378*cda5da8dSAndroid Build Coastguard Worker 379*cda5da8dSAndroid Build Coastguard Worker 380*cda5da8dSAndroid Build Coastguard Worker m4_popdef([b4_copyright_years]) 381