//                              -*- 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<string> &ws_list, int kind ) : text(text), kind(kind) {
//    cerr << "Token3 : text \"" << text << "\"";
//    for ( list<string>::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<string>::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<string>::iterator end = -- ws_list.end();
	if ( (*end)[0] == '/' ) end ++;
	for ( list<string>::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: //
