Changeset 3461


Ignore:
Timestamp:
Mar 1, 2008, 6:30:29 PM (13 years ago)
Author:
yura
Message:
  • TRefal header
Location:
to-imperative/trunk/opents/samples
Files:
1 added
1 edited

Legend:

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

    r3443 r3461  
    22/* vim: set syntax=cpp shiftwidth=4 expandtab tabstop=4: */
    33
    4 #include <iostream>
    5 
    6 #define DBG fprintf(stderr,"%d: %d\n",ts::myRank,__LINE__)
    7 
    8 using namespace std;
    9 
    10 struct Expr;
    11 
    12 typedef ts::TVar<Expr> TExpr;
    13 
    14 struct Term {
    15     enum Type {
    16         CHAR, INT, EXPR
    17     } type;
    18     char c;
    19     int i;
    20     TExpr e;
    21 };
    22 
    23 struct Expr : private ts::TExtData
    24 {
    25     private:
    26 
    27         Term* terms;
    28 
    29         void copyFrom (const Expr& e, size_t start, size_t length) {
    30             Term* p = *this;
    31             const Term* q = e;
    32             q += start;
    33             for (unsigned i = 0; i < length; i++)
    34                 new (p++) Term(*q++);
    35         }
    36 
    37         void clear () {
    38             if (terms) {
    39                 delete[] terms;
    40                 terms = 0;
    41             } else {
    42                 Term* p = *this;
    43                 for (unsigned i = 0; i < getLength(); i++)
    44                     p++->~Term();
    45             }
    46         }
    47 
    48     public:
    49 
    50         Expr () : terms(0) {};
    51 
    52         void init (size_t s) {
    53             assert(!terms);
    54             terms = new Term[s];
    55             extDataSize() = s * sizeof(Term);
    56         };
    57 
    58         operator const Term* () const { return terms ? terms : (Term*)extData(); }
    59         operator       Term* ()       { return terms ? terms : (Term*)extData(); }
    60 
    61         Expr (const Expr& e) : terms(0) {
    62             copyFrom(e, 0, e.getLength());
    63         }
    64 
    65         Expr& operator= (const Expr& e) {
    66             if (this != &e) {
    67                 clear();
    68                 init(e.getLength());
    69                 copyFrom(e, 0, e.getLength());
    70             }
    71             return *this;
    72         }
    73 
    74         Expr subexpr (size_t start, size_t length) const {
    75             Expr e;
    76             e.init(length);
    77             e.copyFrom(*this, start, length);
    78             return e;
    79         }
    80 
    81         size_t getLength () const {
    82             return extDataSize() / sizeof(Term);
    83         }
    84 
    85         Term& operator[] (int i) {
    86             return ((Term *)*this)[i];
    87         }
    88 
    89         ~Expr () {
    90             clear();
    91         }
    92 };
    93 
    94 ostream& operator<< (ostream& os, Expr& e);
    95 
    96 ostream& operator<< (ostream& os, Term& t) {
    97     switch (t.type) {
    98         case Term::CHAR: os << "'" << t.c << "'"; break;
    99         case Term::INT:  os << t.i; break;
    100         case Term::EXPR: os << ((Expr &)(t.e)); break;
    101     }
    102     return os;
    103 }
    104 
    105 // e is intentionally not const!
    106 ostream& operator<< (ostream& os, Expr& e) {
    107     os << "(";
    108     Term* p = e;
    109     for (unsigned i = 0; i < e.getLength(); i++)
    110         os << (i > 0 ? " " : "") << p[i];
    111     os << ")";
    112     return os;
    113 }
    114 
    115 istream& operator>> (istream& is, Expr& e);
    116 
    117 istream& operator>> (istream& is, Term& t) {
    118     char c;
    119     is >> c;
    120     switch (c) {
    121         case '\'':
    122             t.type = Term::CHAR;
    123             is >> t.c;
    124             ((Expr &)(t.e)).init(0);
    125             is >> c;
    126             assert (c == '\'');
    127             break;
    128         case '(':
    129             is.putback(c);
    130             t.type = Term::EXPR;
    131             is >> (Expr &)(t.e);
    132             break;
    133         default:
    134             is.putback(c);
    135             t.type = Term::INT;
    136             is >> t.i;
    137             break;
    138     }
    139     return is;
    140 }
    141 
    142 istream& operator>> (istream& is, Expr& e) {
    143     int buffer_size = 10;
    144     Term* buffer = new Term[buffer_size];
    145 
    146     char c;
    147     is >> c;
    148     assert(c == '(');
    149     int len = 0;
    150     for (;len < buffer_size; len++) {
    151         is >> c;
    152         if (c == ')')
    153             break;
    154         is.putback(c);
    155         is >> buffer[len];
    156     }
    157     e.init(len);
    158     Term* p = e;
    159     for (int i = 0; i < len; i++)
    160         p[i] = buffer[i];
    161     return is;
    162 }
    163 
    164 Expr operator+ (const Expr& e1, const Expr& e2) {
    165     Expr e;
    166     e.init(e1.getLength() + e2.getLength());
    167     Term* p = e;
    168     const Term* q = e1;
    169     for (unsigned i = 0; i < e1.getLength(); i++)
    170         new (p++) Term(*q++);
    171     q = e2;
    172     for (unsigned i = 0; i < e2.getLength(); i++)
    173         new (p++) Term(*q++);
    174     return e;
    175 }
     4#include "trefal.hcc"
    1765
    1776tfun int insert (TExpr e, TExpr s, tout Expr out) {
     
    20029    TExpr e;
    20130    TExpr out;
    202     cin >> e;
    203     cout << e << endl;
    204     cin >> s;
    205     cout << s << endl;
    206     cerr << "expr: " << e << endl << "subst: " << s << endl;
     31    std::cin >> e;
     32    std::cout << e << std::endl;
     33    std::cin >> s;
     34    std::cout << s << std::endl;
     35    std::cerr << "expr: " << e << std::endl << "subst: " << s << std::endl;
    20736    insert(e, s, out);
    208     cerr << "after insert: " << out << endl;
     37    std::cerr << "after insert: " << out << std::endl;
    20938    return 0;
    21039}
Note: See TracChangeset for help on using the changeset viewer.