Merge branch 'master' of https://github.com/alovassy/titan.core
[deliverable/titan.core.git] / langviz / Symbol.cc
CommitLineData
970ed795 1///////////////////////////////////////////////////////////////////////////////
3abe9331 2// Copyright (c) 2000-2015 Ericsson Telecom AB
970ed795
EL
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
16Symbol::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
23Symbol::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
29const 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
59int 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
75Symbols::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
82Symbols::~Symbols()
83{
84 ss.clear();
85}
86
87void 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
94void 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
104SymbolMap::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
113SymbolMap::~SymbolMap()
114{
115 ss.clear();
116}
117
118void 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
125void SymbolMap::destruct_ss()
126{
127 for(size_t i=0; i<ss.size(); i++)
128 delete ss.get_nth_elem(i);
129}
130
131void 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
141SymbolSet::SymbolSet(const SymbolSet& p)
142{
143 FATAL_ERROR("SymbolSet::SymbolSet");
144}
145
146SymbolSet::~SymbolSet()
147{
148 ss.clear();
149}
150
151void SymbolSet::add_s(Symbol *p_s)
152{
153 if(ss.has_key(p_s)) return;
154 ss.add(p_s, 0);
155}
156
157void 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
166void SymbolSet::remove_s(Symbol *p_s)
167{
168 if(ss.has_key(p_s)) ss.erase(p_s);
169}
170
171void 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
180void SymbolSet::remove_all()
181{
182 ss.clear();
183}
184
This page took 0.052191 seconds and 5 git commands to generate.