Changeset 3462


Ignore:
Timestamp:
Mar 1, 2008, 7:08:39 PM (13 years ago)
Author:
yura
Message:
  • All TValues are deleted. Not quotes for chars.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/opents/samples/trefal.hcc

    r3461 r3462  
    2727        void copyFrom (const Expr& e, size_t start, size_t length) {
    2828            Term* p = *this;
    29             const Term* q = e;
    30             q += start;
    31             for (unsigned i = 0; i < length; i++)
    32                 new (p++) Term(*q++);
     29            const Term* q = ((const Term*) e) + start;
     30            if (terms)
     31                for (unsigned i = 0; i < length; i++)
     32                    *(p++) = *(q++);
     33            else
     34                for (unsigned i = 0; i < length; i++)
     35                    new (p++) Term(*q++);
     36
    3337        }
    3438
     
    3943            } else {
    4044                Term* p = *this;
    41                 for (unsigned i = 0; i < getLength(); i++)
     45                size_t length = getLength();
     46                for (unsigned i = 0; i < length; i++)
    4247                    p++->~Term();
    4348            }
     
    9095};
    9196
     97// e and t are intentionally not const!
     98
    9299std::ostream& operator<< (std::ostream& os, Expr& e);
    93100
    94101std::ostream& operator<< (std::ostream& os, Term& t) {
    95102    switch (t.type) {
    96         case Term::CHAR: os << "'" << t.c << "'"; break;
     103        case Term::CHAR: os << t.c; break;
    97104        case Term::INT:  os << t.i; break;
    98         case Term::EXPR: os << ((Expr &)(t.e)); break;
     105        case Term::EXPR: os << (Expr &)(t.e); break;
    99106    }
    100107    return os;
    101108}
    102109
    103 // e is intentionally not const!
    104110std::ostream& operator<< (std::ostream& os, Expr& e) {
    105111    os << "(";
     
    116122    char c;
    117123    is >> c;
    118     switch (c) {
    119         case '\'':
    120             t.type = Term::CHAR;
    121             is >> t.c;
    122             ((Expr &)(t.e)).init(0);
    123             is >> c;
    124             assert (c == '\'');
    125             break;
    126         case '(':
    127             is.putback(c);
    128             t.type = Term::EXPR;
    129             is >> (Expr &)(t.e);
    130             break;
    131         default:
    132             is.putback(c);
    133             t.type = Term::INT;
    134             is >> t.i;
    135             break;
     124    is.putback(c);
     125    if ('A' <= c && c <= 'Z') {
     126        t.type = Term::CHAR;
     127        is >> t.c;
     128        ((Expr &)(t.e)).init(0);
     129    } else if ('0' <= c && c <= '9') {
     130        t.type = Term::INT;
     131        is >> t.i;
     132        ((Expr &)(t.e)).init(0);
     133    } else if (c == '(') {
     134        t.type = Term::EXPR;
     135        is >> (Expr &)(t.e);
     136    } else {
     137        throw 0; //FIXME
    136138    }
    137139    return is;
     
    141143    int buffer_size = 10;
    142144    Term* buffer = new Term[buffer_size];
    143 
    144145    char c;
    145146    is >> c;
     
    157158    for (int i = 0; i < len; i++)
    158159        p[i] = buffer[i];
     160    delete[] buffer;
    159161    return is;
    160162}
Note: See TracChangeset for help on using the changeset viewer.