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 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
|
//@beginlicenses@
//@license{chiba_tokyo}{}@
//@license{chiba_tsukuba}{}@
//@license{chiba_tokyo}{}@
//
// Permission to use, copy, distribute and modify this software and its
// documentation for any purpose is hereby granted without fee, provided that
// the above copyright notice appears in all copies and that both that copyright
// notice and this permission notice appear in supporting documentation.
//
// 1997-2001 Shigeru Chiba, Tokyo Institute of Technology. make(s) no representations about the suitability of this
// software for any purpose. It is provided "as is" without express or implied
// warranty.
//
// Copyright (C) 1997-2001 Shigeru Chiba, Tokyo Institute of Technology.
//
// -----------------------------------------------------------------
//
// Permission to use, copy, distribute and modify this software and its
// documentation for any purpose is hereby granted without fee, provided that
// the above copyright notice appears in all copies and that both that copyright
// notice and this permission notice appear in supporting documentation.
//
// 1997-2001 Shigeru Chiba, University of Tsukuba. make(s) no representations about the suitability of this
// software for any purpose. It is provided "as is" without express or implied
// warranty.
//
// Copyright (C) 1997-2001 Shigeru Chiba, University of Tsukuba.
//
// -----------------------------------------------------------------
//
// Permission to use, copy, distribute and modify this software and its
// documentation for any purpose is hereby granted without fee, provided that
// the above copyright notice appears in all copies and that both that copyright
// notice and this permission notice appear in supporting documentation.
//
// 1997-2001 Shigeru Chiba, Tokyo Institute of Technology. make(s) no representations about the suitability of this
// software for any purpose. It is provided "as is" without express or implied
// warranty.
//
// Copyright (C) 1997-2001 Shigeru Chiba, Tokyo Institute of Technology.
//
//@endlicenses@
#include <iostream>
#include <opencxx/parser/NonLeaf.h>
#include <opencxx/parser/ErrorLog.h>
#include <opencxx/parser/TheErrorLog.h>
#include <opencxx/parser/Encoding.h>
#include <opencxx/parser/MopMsg.h>
#include <opencxx/parser/token-names.h>
namespace Opencxx
{
// class NonLeaf
NonLeaf::NonLeaf(Ptree* p, Ptree* q)
{
data.nonleaf.child = p;
data.nonleaf.next = q;
}
bool NonLeaf::IsLeaf() const
{
return false;
}
void NonLeaf::Print(std::ostream& s, int indent, int depth)
{
if(TooDeep(s, depth))
return;
Ptree* rest = this;
s << '[';
while(rest != 0){
if(rest->IsLeaf()){
s << "@ ";
rest->Print(s, indent, depth + 1);
rest = 0;
}
else{
Ptree* head = rest->data.nonleaf.child;
if(head == 0)
s << "0";
else
head->Print(s, indent, depth + 1);
rest = rest->data.nonleaf.next;
if(rest != 0)
s << ' ';
}
}
s << ']';
}
bool NonLeaf::TooDeep(std::ostream& s, int depth)
{
if(depth >= 32){
s << " ** too many nestings ** ";
return true;
}
else
return false;
}
int NonLeaf::Write(std::ostream& out, int indent)
{
int n = 0;
Ptree* p = this;
for(;;){
Ptree* head = p->Car();
if(head != 0)
n += head->Write(out, indent);
p = p->Cdr();
if(p == 0)
break;
else if(p->IsLeaf()){
TheErrorLog().Report(
MopMsg(Msg::Warning, "NonLeaf::Write()", "not list"));
break;
}
else
out << ' ';
}
return n;
}
void NonLeaf::PrintWithEncodeds(std::ostream& s, int indent, int depth)
{
char* encode = GetEncodedType();
if(encode != 0){
s << '#';
Encoding::Print(s, encode);
}
encode = GetEncodedName();
if(encode != 0){
s << '@';
Encoding::Print(s, encode);
}
NonLeaf::Print(s, indent, depth);
}
void NonLeaf::PrintOn(std::ostream& out) const
{
const Ptree* p = this;
for(;;){
const Ptree* head = p->Car();
if(head != 0)
head->PrintOn(out);
p = p->Cdr();
if(p == 0)
break;
else if(p->IsLeaf()){
TheErrorLog().Report(
MopMsg(Msg::Fatal, "NonLeaf::PrintOn()", "not list"));
break;
}
else
out << ' ';
}
}
}
|