/usr/include/scribus/desaxe/automata.h is in scribus-dev 1.4.6+dfsg-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 | /*
* automata.h
*
*
* Created by Andreas Vox on 02.06.06.
* Copyright 2006 under GPL2. All rights reserved.
*
*/
#ifndef AUTOMATA_H
#define AUTOMATA_H
#include <map>
#include <set>
#include <deque>
namespace automata {
template<class STATE, class INPUT, class OUTPUT>
class FA_base {
public:
FA_base(STATE s, OUTPUT d);
FA_base(const std::set<STATE>& states, const std::set<INPUT>& inputs, STATE start, STATE deflt);
virtual ~FA_base();
typedef std::map<INPUT, OUTPUT> Transitions;
const std::set<STATE>& states() const;
const std::set<INPUT>& inputs() const;
const Transitions& transitions(STATE s) const;
const STATE start() const;
const OUTPUT deflt() const;
const OUTPUT next(STATE from, INPUT input) const;
void addState(STATE newState);
void addInput(INPUT newInput);
void setTransition(STATE from, INPUT input, OUTPUT to);
protected:
std::set<STATE> states_;
std::set<INPUT> inputs_;
std::map<STATE, Transitions> transitions_;
const Transitions noTransitions;
STATE start_;
OUTPUT default_;
};
template<class STATE, class INPUT, class OUTPUT>
FA_base<STATE, INPUT, OUTPUT>::FA_base(STATE s, OUTPUT d) : states_(), inputs_(), transitions_(), noTransitions(), start_(s), default_(d)
{
states_.insert(s);
}
template<class STATE, class INPUT, class OUTPUT>
FA_base<STATE, INPUT, OUTPUT>::FA_base(const std::set<STATE>& states, const std::set<INPUT>& inputs, STATE start, STATE deflt) : states_(states), inputs_(inputs), transitions_(), noTransitions(), start_(start), default_(deflt)
{
if (states_.find(start) == states_.end())
states_.insert(start);
}
template<class STATE, class INPUT, class OUTPUT>
const std::set<STATE>& FA_base<STATE, INPUT, OUTPUT>::states() const
{
return states_;
}
template<class STATE, class INPUT, class OUTPUT>
const std::set<INPUT>& FA_base<STATE, INPUT, OUTPUT>::inputs() const
{
return inputs_;
}
template<class STATE, class INPUT, class OUTPUT>
const STATE FA_base<STATE, INPUT, OUTPUT>::start() const
{
return start_;
}
template<class STATE, class INPUT, class OUTPUT>
const OUTPUT FA_base<STATE, INPUT, OUTPUT>::deflt() const
{
return default_;
}
template<class STATE, class INPUT>
class DFA : public FA_base<STATE, INPUT, STATE> {
public:
DFA(STATE s, STATE deflt): FA_base<STATE, INPUT, STATE>(s, deflt) { }
DFA(const std::set<STATE>& states, const std::set<INPUT>& inputs, STATE start, STATE deflt)
: FA_base<STATE, INPUT, STATE>(states, inputs, start, deflt) { }
};
template<class STATE, class INPUT>
class NFA : public FA_base<STATE, INPUT, std::set<STATE> > {
public:
NFA(STATE s, std::set<STATE> d): FA_base<STATE, INPUT, std::set<STATE> >(s, d) { }
NFA(std::set<STATE>& states, std::set<INPUT>& inputs, STATE start, std::set<STATE> deflt)
: FA_base<STATE, INPUT, STATE>(states, inputs, start, deflt) { }
void addTransition(STATE from, INPUT input, STATE to);
/*
NFA: S x I -> P(S)
DFA': P(S) x I -> P(S)
DFA: N x I -> N
Algo:
todo = { NFA.start }
forall src in todo:
from = create(src)
ntrans: I -> P(S)
for all s in src
for all (i,t) in NFA.trans[s]:
ntrans[i] += t;
for all (i,nt) in ntrans:
n = create(nt);
if n is new:
DFA.addState(n);
todo += nt;
DFA.addTransition(from, i, n)
*/
template<class NSTATE, class XXX>
DFA<NSTATE,INPUT>* constructDFA( XXX createState )
// DFA<NSTATE,INPUT>* constructDFA(NSTATE (*createState)( std::set<STATE> )) // wont work
{
std::map<std::set<STATE>, NSTATE> newStates;
std::set<STATE> startSet;
startSet.insert(FA_base<STATE,INPUT,std::set<STATE> >::start_);
NSTATE nstart = createState(startSet);
newStates[startSet] = nstart;
NSTATE deflt = createState(FA_base<STATE,INPUT,std::set<STATE> >::default_);
newStates[FA_base<STATE,INPUT,std::set<STATE> >::default_] = deflt;
DFA<NSTATE,INPUT>* result = new DFA<NSTATE,INPUT>(nstart, deflt);
result->addState(deflt);
std::deque<std::set<STATE> > todo;
todo.push_back(startSet);
while (todo.size() > 0)
{
const std::set<STATE> from = todo.front();
todo.pop_front();
std::map<INPUT,std::set<STATE> > ntrans;
// for all states in from
typename std::set<STATE>::const_iterator s_it;
typename std::map<INPUT, std::set<STATE> >::iterator tr_it;
for (s_it=from.begin(); s_it != from.end(); ++s_it)
{
// for all transitions
typename FA_base<STATE,INPUT,std::set<STATE> >::Transitions&
trans(FA_base<STATE,INPUT,std::set<STATE> >::transitions_[*s_it]);
for (tr_it = trans.begin(); tr_it != trans.end(); ++tr_it)
{
ntrans[tr_it->first].insert(tr_it->second.begin(), tr_it->second.end());
}
}
// construct new transitions
const NSTATE nfrom = newStates[from];
for (tr_it = ntrans.begin(); tr_it != ntrans.end(); ++tr_it)
{
std::set<STATE> & state(tr_it->second);
// create follow state
NSTATE nstate;
if ( newStates.find(state) == newStates.end() ) {
nstate = createState(state);
result->addState(nstate);
newStates[state] = nstate;
// remember follow state in todo if new
todo.push_back(state);
}
else {
nstate = newStates[state];
}
result->setTransition(nfrom, tr_it->first, nstate);
}
}
const std::set<INPUT>& inp(FA_base<STATE, INPUT, std::set<STATE> >::inputs());
typename std::set<INPUT>::const_iterator i;
for (i=inp.begin(); i != inp.end(); ++i)
result->addInput(*i);
return result;
}
};
template<class STATE, class INPUT, class OUTPUT>
FA_base<STATE,INPUT,OUTPUT>::~FA_base()
{
// clean up
}
template<class STATE, class INPUT, class OUTPUT>
const typename FA_base<STATE,INPUT,OUTPUT>::Transitions& FA_base<STATE,INPUT,OUTPUT>::transitions(STATE s) const
{
typename std::map<STATE, Transitions>::const_iterator tr = transitions_.find(s);
if (tr != transitions_.end())
return tr->second;
else
return noTransitions;
}
template<class STATE, class INPUT, class OUTPUT>
const OUTPUT FA_base<STATE,INPUT,OUTPUT>::next(STATE from, INPUT input) const
{
const Transitions& tr(transitions(from));
typename Transitions::const_iterator it = tr.find(input);
return it==tr.end() ? default_ : it->second;
}
template<class STATE, class INPUT, class OUTPUT>
void FA_base<STATE,INPUT,OUTPUT>::addState(STATE newState)
{
if (states_.find(newState) == states_.end())
states_.insert(newState);
}
template<class STATE, class INPUT, class OUTPUT>
void FA_base<STATE,INPUT,OUTPUT>::addInput(INPUT newInput)
{
if (inputs_.find(newInput) == inputs_.end())
inputs_.insert(newInput);
}
template<class STATE, class INPUT, class OUTPUT>
void FA_base<STATE,INPUT,OUTPUT>::setTransition(STATE from, INPUT input, OUTPUT to)
{
Transitions& trans(transitions_[from]);
trans[input] = to;
}
template<class STATE, class INPUT>
void NFA<STATE, INPUT>::addTransition(STATE from, INPUT input, STATE to)
{
typename FA_base<STATE,INPUT,std::set<STATE> >::Transitions &
trans(FA_base<STATE,INPUT,std::set<STATE> >::transitions_[from]);
trans[input].insert(to);
}
} // namespace
#endif
|