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