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
|
#include "Piraha.hpp"
using namespace piraha;
void Group::dump(std::ostream& o) {
dump(-1,o,0);
}
void Group::dump(int n,std::ostream& o,int indent) {
for(int i=0;i<indent;i++)
o << ' ';
if(n >= 0) {
o << "[" << n << "] ";
}
o << pattern << ": ";
if(children.size()==0) {
for(int i=start_;i<end_;i++)
o << input[i];
}
o << std::endl;
typedef vector<smart_ptr<Group> >::iterator group_iter;
int nn = 0;
for(group_iter gi = children.begin();
gi != children.end();
++gi) {
(*gi)->dump(nn++,o,indent+2);
}
}
void Group::dumpPerl(std::ostream& o) {
o << "$VAR = ";
dumpPerl(o,0);
o << ";" << std::endl;
}
void Group::dumpPerl(std::ostream &o,int indent) {
for(int i=0;i<indent;i++)
o << ' ';
o << "{" << std::endl;
indent += 2;
for(int i=0;i<indent;i++)
o << ' ';
o << "name=> \"" << getPatternName() << "\"," << std::endl;
if(children.size()==0) {
for(int i=0;i<indent;i++)
o << ' ';
o << "children=>[]," << std::endl;
for(int i=0;i<indent;i++)
o << ' ';
o << "text=>\"";
for(int i=start_;i<end_;i++)
insertc(o,input[i]);
o << "\"," << std::endl;
} else {
for(int i=0;i<indent;i++)
o << ' ';
o << "children=>[" << std::endl;
typedef vector<smart_ptr<Group> >::iterator group_iter;
for(group_iter gi = children.begin();
gi != children.end();
++gi) {
(*gi)->dumpPerl(o,indent+2);
for(int i=0;i<indent;i++)
o << ' ';
o << "," << std::endl;
}
for(int i=0;i<indent;i++)
o << ' ';
o << "]," << std::endl;
}
for(int i=0;i<indent;i++)
o << ' ';
o << "start=>" << start() << "," << std::endl;
for(int i=0;i<indent;i++)
o << ' ';
o << "end=>" << end() << "," << std::endl;
for(int i=0;i<indent;i++)
o << ' ';
o << "line=>" << line() << "," << std::endl;
indent -= 2;
for(int i=0;i<indent;i++)
o << ' ';
o << "}" << std::endl;
}
std::string Group::substring() {
std::string sub;
for(int i=start_;i<end_;i++) {
sub += input[i];
}
return sub;
}
std::string Group::getPatternName() {
return pattern;
}
int Group::line() {
int line = 1;
for(int i=0;i<start_;i++) {
if(input[i] == '\n')
line++;
}
return line;
}
|