Commit | Line | Data |
---|---|---|
d44e3c4f | 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 | ******************************************************************************/ | |
970ed795 EL |
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 |