summaryrefslogtreecommitdiffhomepage
path: root/Parser/Term.cpp
blob: 5c5f9d4a04f0fac6fb4e4a28b79e3156fb7a755a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
/*  Project STARS
    John DiCamillo Software Consulting
    Copyright © 1997-2000. All Rights Reserved.

    SUBSYSTEM:    Stars
    FILE:         Term.cpp
    AUTHOR:       John DiCamillo


    OVERVIEW
    ========
    Implementation of the Term class
*/


#include "MemDebug.h"
#include "Term.h"

void Print(const char* fmt, ...);

// +-------------------------------------------------------------------+

Term*
error(char* s1, char* s2)
{
   Print("ERROR: ");
   if (s1) Print(s1);
   if (s2) Print(s2);
   Print("\n\n");
   return 0;
}

// +-------------------------------------------------------------------+

void TermBool::print(int level)  { if (level > 0) Print(val? "true" : "false"); else Print("..."); }
void TermNumber::print(int level){ if (level > 0) Print("%g", val);     else Print("..."); }
void TermText::print(int level)  { if (level > 0) Print("\"%s\"", val); else Print("..."); }

// +-------------------------------------------------------------------+

TermArray::TermArray(TermList* elist)
{
   elems = elist;
}

TermArray::~TermArray()
{
   if (elems) elems->destroy();
   delete elems;
}

void
TermArray::print(int level)
{
   if (level > 1) {
      Print("(");

      if (elems) {
         for (int i = 0; i < elems->size(); i++) {
            elems->at(i)->print(level-1);
            if (i < elems->size() -1)
               Print(", ");
         }
      }

      Print(") ");
   }
   else Print("(...) ");
}

// +-------------------------------------------------------------------+

TermStruct::TermStruct(TermList* elist)
{
   elems = elist;
}

TermStruct::~TermStruct()
{
   if (elems) elems->destroy();
   delete elems;
}

void
TermStruct::print(int level)
{
   if (level > 1) {
      Print("{");

      if (elems) {
         for (int i = 0; i < elems->size(); i++) {
            elems->at(i)->print(level-1);
            if (i < elems->size() -1)
               Print(", ");
         }
      }

      Print("} ");
   }
   else Print("{...} ");
}

// +-------------------------------------------------------------------+

TermDef::~TermDef()
{
   delete mname;
   delete mval;
}

void
TermDef::print(int level)
{
   if (level >= 0) {
      mname->print(level);
      Print(": ");
      mval->print(level-1);
   }
   else Print("...");
}

// +-------------------------------------------------------------------+