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 ///////////////////////////////////////////////////////////////////////////////
10 #include "../common/memory.h"
12 // =================================
14 // =================================
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
)
23 Symbol::Symbol(const string
& p_id
)
24 : id(p_id
), is_terminal(false), is_recursive(false), can_be_empty(false),
29 const string
& Symbol::get_id_dot()
33 for(size_t pos
=s
.find('\\', 0); pos
<s
.size();
34 pos
=s
.find('\\', pos
)) {
35 s
.replace(pos
, 1, "\\\\");
38 for(size_t pos
=s
.find('"', 0); pos
<s
.size();
39 pos
=s
.find('"', pos
)) {
40 s
.replace(pos
, 1, "\\\"");
45 if(can_be_empty
) id_dot
+="?";
46 if(is_recursive
) id_dot
+="*";
49 expstring_t tmp_s
=mprintf(" (%d)", dist
);
59 int Symbol::get_weight()
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
);
71 // =================================
73 // =================================
75 Symbols::Symbols(const Symbols
& p
)
78 for(size_t i
=0; i
<p
.ss
.size(); i
++)
87 void Symbols::add_s(Symbol
*p_s
)
90 FATAL_ERROR("NULL parameter: Symbols::add_s()");
94 void Symbols::replace_aliases(Grammar
*grammar
)
96 for(size_t i
=0; i
<ss
.size(); i
++)
97 ss
[i
]=grammar
->get_alias(ss
[i
]);
100 // =================================
102 // =================================
104 SymbolMap::SymbolMap(const SymbolMap
& p
)
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
);
113 SymbolMap::~SymbolMap()
118 void SymbolMap::add_s(Symbol
*p_s
)
121 FATAL_ERROR("NULL parameter: SymbolMap::add_s()");
122 ss
.add(p_s
->get_id(), p_s
);
125 void SymbolMap::destruct_ss()
127 for(size_t i
=0; i
<ss
.size(); i
++)
128 delete ss
.get_nth_elem(i
);
131 void SymbolMap::destruct_symbol(const string
& p_id
)
137 // =================================
139 // =================================
141 SymbolSet::SymbolSet(const SymbolSet
& p
)
143 FATAL_ERROR("SymbolSet::SymbolSet");
146 SymbolSet::~SymbolSet()
151 void SymbolSet::add_s(Symbol
*p_s
)
153 if(ss
.has_key(p_s
)) return;
157 void SymbolSet::add_ss(const SymbolSet
& p_ss
)
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);
166 void SymbolSet::remove_s(Symbol
*p_s
)
168 if(ss
.has_key(p_s
)) ss
.erase(p_s
);
171 void SymbolSet::remove_ss(const SymbolSet
& p_ss
)
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
);
180 void SymbolSet::remove_all()
This page took 0.036267 seconds and 6 git commands to generate.