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
12 ******************************************************************************/
15 #include "../common/memory.h"
17 // =================================
19 // =================================
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
)
28 Symbol::Symbol(const string
& p_id
)
29 : id(p_id
), is_terminal(false), is_recursive(false), can_be_empty(false),
34 const string
& Symbol::get_id_dot()
38 for(size_t pos
=s
.find('\\', 0); pos
<s
.size();
39 pos
=s
.find('\\', pos
)) {
40 s
.replace(pos
, 1, "\\\\");
43 for(size_t pos
=s
.find('"', 0); pos
<s
.size();
44 pos
=s
.find('"', pos
)) {
45 s
.replace(pos
, 1, "\\\"");
50 if(can_be_empty
) id_dot
+="?";
51 if(is_recursive
) id_dot
+="*";
54 expstring_t tmp_s
=mprintf(" (%d)", dist
);
64 int Symbol::get_weight()
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
);
76 // =================================
78 // =================================
80 Symbols::Symbols(const Symbols
& p
)
83 for(size_t i
=0; i
<p
.ss
.size(); i
++)
92 void Symbols::add_s(Symbol
*p_s
)
95 FATAL_ERROR("NULL parameter: Symbols::add_s()");
99 void Symbols::replace_aliases(Grammar
*grammar
)
101 for(size_t i
=0; i
<ss
.size(); i
++)
102 ss
[i
]=grammar
->get_alias(ss
[i
]);
105 // =================================
107 // =================================
109 SymbolMap::SymbolMap(const SymbolMap
& p
)
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
);
118 SymbolMap::~SymbolMap()
123 void SymbolMap::add_s(Symbol
*p_s
)
126 FATAL_ERROR("NULL parameter: SymbolMap::add_s()");
127 ss
.add(p_s
->get_id(), p_s
);
130 void SymbolMap::destruct_ss()
132 for(size_t i
=0; i
<ss
.size(); i
++)
133 delete ss
.get_nth_elem(i
);
136 void SymbolMap::destruct_symbol(const string
& p_id
)
142 // =================================
144 // =================================
146 SymbolSet::SymbolSet(const SymbolSet
& p
)
148 FATAL_ERROR("SymbolSet::SymbolSet");
151 SymbolSet::~SymbolSet()
156 void SymbolSet::add_s(Symbol
*p_s
)
158 if(ss
.has_key(p_s
)) return;
162 void SymbolSet::add_ss(const SymbolSet
& p_ss
)
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);
171 void SymbolSet::remove_s(Symbol
*p_s
)
173 if(ss
.has_key(p_s
)) ss
.erase(p_s
);
176 void SymbolSet::remove_ss(const SymbolSet
& p_ss
)
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
);
185 void SymbolSet::remove_all()
This page took 0.034868 seconds and 5 git commands to generate.