Sync with 5.4.0
[deliverable/titan.core.git] / langviz / Symbol.cc
1 ///////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2000-2015 Ericsson Telecom AB
3 // All rights reserved. This program and the accompanying materials
4 // are made available under the terms of the Eclipse Public License v1.0
5 // which accompanies this distribution, and is available at
6 // http://www.eclipse.org/legal/epl-v10.html
7 ///////////////////////////////////////////////////////////////////////////////
8 #include "Symbol.hh"
9 #include "Grammar.hh"
10 #include "../common/memory.h"
11
12 // =================================
13 // ===== Symbol
14 // =================================
15
16 Symbol::Symbol(const Symbol& p)
17 : Node(p), id(p.id), id_dot(p.id),
18 is_terminal(p.is_terminal), is_recursive(p.is_recursive),
19 can_be_empty(p.can_be_empty), dist(p.dist), weight(p.weight)
20 {
21 }
22
23 Symbol::Symbol(const string& p_id)
24 : id(p_id), is_terminal(false), is_recursive(false), can_be_empty(false),
25 dist(-1), weight(-1)
26 {
27 }
28
29 const string& Symbol::get_id_dot()
30 {
31 if(id_dot.empty()) {
32 string s=id;
33 for(size_t pos=s.find('\\', 0); pos<s.size();
34 pos=s.find('\\', pos)) {
35 s.replace(pos, 1, "\\\\");
36 pos+=2;
37 }
38 for(size_t pos=s.find('"', 0); pos<s.size();
39 pos=s.find('"', pos)) {
40 s.replace(pos, 1, "\\\"");
41 pos+=2;
42 }
43 id_dot="\"";
44 id_dot+=s;
45 if(can_be_empty) id_dot+="?";
46 if(is_recursive) id_dot+="*";
47
48 {
49 expstring_t tmp_s=mprintf(" (%d)", dist);
50 id_dot+=tmp_s;
51 Free(tmp_s);
52 }
53
54 id_dot+="\"";
55 }
56 return id_dot;
57 }
58
59 int Symbol::get_weight()
60 {
61 if(weight>=0) return weight;
62 if(is_terminal) return weight=0;
63 size_t n=refs.get_nof_ss();
64 for(size_t i=0; i<n; i++) {
65 Symbol *s=refs.get_s_byIndex(i);
66 if(s->dist>dist) refs_weight.add_s(s);
67
68 }
69 }
70
71 // =================================
72 // ===== Symbols
73 // =================================
74
75 Symbols::Symbols(const Symbols& p)
76 : Node(p)
77 {
78 for(size_t i=0; i<p.ss.size(); i++)
79 add_s(p.ss[i]);
80 }
81
82 Symbols::~Symbols()
83 {
84 ss.clear();
85 }
86
87 void Symbols::add_s(Symbol *p_s)
88 {
89 if(!p_s)
90 FATAL_ERROR("NULL parameter: Symbols::add_s()");
91 ss.add(p_s);
92 }
93
94 void Symbols::replace_aliases(Grammar *grammar)
95 {
96 for(size_t i=0; i<ss.size(); i++)
97 ss[i]=grammar->get_alias(ss[i]);
98 }
99
100 // =================================
101 // ===== SymbolMap
102 // =================================
103
104 SymbolMap::SymbolMap(const SymbolMap& p)
105 : Node(p)
106 {
107 for(size_t i=0; i<p.ss.size(); i++) {
108 Symbol *p_s=p.ss.get_nth_elem(i);
109 ss.add(p_s->get_id(), p_s);
110 }
111 }
112
113 SymbolMap::~SymbolMap()
114 {
115 ss.clear();
116 }
117
118 void SymbolMap::add_s(Symbol *p_s)
119 {
120 if(!p_s)
121 FATAL_ERROR("NULL parameter: SymbolMap::add_s()");
122 ss.add(p_s->get_id(), p_s);
123 }
124
125 void SymbolMap::destruct_ss()
126 {
127 for(size_t i=0; i<ss.size(); i++)
128 delete ss.get_nth_elem(i);
129 }
130
131 void SymbolMap::destruct_symbol(const string& p_id)
132 {
133 delete ss[p_id];
134 ss.erase(p_id);
135 }
136
137 // =================================
138 // ===== SymbolSet
139 // =================================
140
141 SymbolSet::SymbolSet(const SymbolSet& p)
142 {
143 FATAL_ERROR("SymbolSet::SymbolSet");
144 }
145
146 SymbolSet::~SymbolSet()
147 {
148 ss.clear();
149 }
150
151 void SymbolSet::add_s(Symbol *p_s)
152 {
153 if(ss.has_key(p_s)) return;
154 ss.add(p_s, 0);
155 }
156
157 void SymbolSet::add_ss(const SymbolSet& p_ss)
158 {
159 size_t n=p_ss.ss.size();
160 for(size_t i=0; i<n; i++) {
161 Symbol *s=p_ss.ss.get_nth_key(i);
162 if(!ss.has_key(s)) ss.add(s, 0);
163 }
164 }
165
166 void SymbolSet::remove_s(Symbol *p_s)
167 {
168 if(ss.has_key(p_s)) ss.erase(p_s);
169 }
170
171 void SymbolSet::remove_ss(const SymbolSet& p_ss)
172 {
173 size_t n=p_ss.ss.size();
174 for(size_t i=0; i<n; i++) {
175 Symbol *s=p_ss.ss.get_nth_key(i);
176 if(ss.has_key(s)) ss.erase(s);
177 }
178 }
179
180 void SymbolSet::remove_all()
181 {
182 ss.clear();
183 }
184
This page took 0.036267 seconds and 6 git commands to generate.