// -*- Mode: C++ -*- // // Pretty Printer, Copyright (C) Richard C. Bilson and Rodolfo G. Esteves 2001 // // parse.cc -- // // Author : Richard C. Bilson and Rodolfo G. Esteves // Created On : Sun Dec 16 15:06:31 2001 // Last Modified By : Peter A. Buhr // Last Modified On : Tue Apr 9 22:38:19 2002 // Update Count : 435 // #include "parse.h" #include "filter.h" #include "yacc.tab.h" Token::Token( const string &text, int kind ) : text(text), kind(kind) { left = down = NULL; } // Token::Token Token::Token( const string &text, list &ws_list, int kind ) : text(text), kind(kind) { // cerr << "Token3 : text \"" << text << "\""; // for ( list::iterator i = ws_list.begin(); i != ws_list.end(); i ++ ) { // cerr << " WSt: \"" << *i << "\""; // } // cerr << endl; left = down = NULL; // O(1) transfer of the current lex whitespace list to the token's // whitespace list, and clearing the lex whitespace list. Token::ws_list.splice( Token::ws_list.end(), ws_list ); } // Token::Token void Token::addLeftTail( Token *n ) { Token *p = this; while ( p->left != 0 ) { p = p->left; } // while p->left = n; } // Token::addLeftTail void Token::addDownLeftTail( Token *n ) { if ( down == 0 ) { down = n; } else { down->addLeftTail( n ); } // if } // Token::addDownLeftTail bool Token::isTerminal() { return kind < END_TERMINALS; } // Token::isTerminal int Token::getKind() const { return kind; } // Token::getKind() string Token::getText() const { return text; } // Token::getText() string Token::getWS() { string ret; // concatenate whitespace and comment text for ( list::iterator i = ws_list.begin(); i != ws_list.end(); i ++ ) { ret += *i; } // for return ret; } // Token::getWS bool Token::isComment() { return ws_list.size() > 1 || ( ws_list.size() == 1 && (*ws_list.begin())[0] == '/' ); } // Token::isComment string Token::getComment() { string ret; // concatenate whitespace and comment text up to the last comment if ( ws_list.size() > 1 ) { list::iterator end = -- ws_list.end(); if ( (*end)[0] == '/' ) end ++; for ( list::iterator i = ws_list.begin(); i != end; i ++ ) { ret += *i; } // for } else if ( ws_list.size() == 1 ) { if ( (*ws_list.begin())[0] == '/' ) ret = *ws_list.begin(); } // if return ret; } // Token::getComment // Local Variables: // // compile-command: "gmake" // // End: //