/usr/include/lttoolbox-3.1/lttoolbox/transducer.h is in liblttoolbox3-3.1-0-dev 3.1.0-1.1.
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 249 250 251 252 253 254 255 256 257 258 259 | /*
* Copyright (C) 2005 Universitat d'Alacant / Universidad de Alicante
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef _TRANSDUCTOR_
#define _TRANSDUCTOR_
#include <cstdio>
#include <map>
#include <set>
#include <lttoolbox/alphabet.h>
using namespace std;
class MatchExe;
/**
* Class to represent a letter transducer during the dictionary compilation
*/
class Transducer
{
private:
friend class MatchExe;
/**
* Initial state
*/
int initial;
/**
* Final state set
*/
set<int> finals;
/**
* Transitions of the transducer
*/
map<int, multimap<int, int> > transitions;
/**
* New state creator
* @return the new state number
*/
int newState();
/**
* Test if the intersection of two sets is empty
* @param s1 first set
* @param s2 second set
* @return true if the intersection is empty
*/
static bool isEmptyIntersection(set<int> const &s1, set<int> const &s2);
/**
* Copy function
* @param t the transducer to be copied
*/
void copy(Transducer const &t);
/**
* Empty transducer
*/
void destroy();
public:
/**
* Constructor
*/
Transducer();
/**
* Destructor
*/
~Transducer();
/**
* Copy constructor
* @param t transducer to be copied
*/
Transducer(Transducer const &t);
/**
* Assignment operator
* @param t transducer to be assigned
* @return the object result of the assignment
*/
Transducer & operator =(Transducer const &t);
/**
* Insertion of a single transduction, creating a new target state
* if needed
* @param tag the tag of the transduction being inserted
* @param source the source state of the new transduction
* @return the target state
*/
int insertSingleTransduction(int const tag, int const source);
/**
* Insertion of a single transduction, forcing create a new target
* state
* @param tag the tag of the transduction being inserted
* @param source the source state of the new transduction
* @return the target state
*/
int insertNewSingleTransduction(int const tag, int const source);
/**
* Insertion of a transducer in a given source state, unifying their
* final states using a optionally given epsilon tag
* @param source the source state
* @param t the transducer being inserted
* @param epsilon_tag the epsilon tag
* @return the new target state
*/
int insertTransducer(int const source, Transducer &t,
int const epsilon_tag = 0);
/**
* Link two existing states by a transduction
* @param source the source state
* @param target the target state
* @param tag the tag of the transduction
*/
void linkStates(int const source, int const target, int const tag);
/**
* Test if the state is a final state
* @param state the state
* @return true if is a final state
*/
bool isFinal(int const state) const;
/**
* Set the state as a final or not, yes by default
* @param state the state
* @param value if true, the state is set as final state
*/
void setFinal(int const state, bool value = true);
/**
* Returns the initial state of a transducer
* @return the initial state identifier
*/
int getInitial() const;
/**
* Returns the epsilon closure of a given state
* @param state the state
* @param epsilon_tag the tag to take as epsilon
* @return the epsilon-connected states
*/
set<int> closure(int const state, int const epsilon_tag = 0);
/**
* Join all finals in one using epsilon transductions
* @param epsilon_tag the tag to take as epsilon
*/
void joinFinals(int const epsilon_tag = 0);
/**
* Reverse all the transductions of a transducer
* @param epsilon_tag the tag to take as epsilon
*/
void reverse(int const epsilon_tag = 0);
/**
* Determinize the transducer
* @param epsilon_tag the tag to take as epsilon
*/
void determinize(int const epsilon_tag = 0);
/**
* Minimize = reverse + determinize + reverse + determinize
* @param epsilon_tag the tag to take as epsilon
*/
void minimize(int const epsilon_tag = 0);
/**
* Make a transducer optional (link initial state with final states with
* empty transductions)
* @param epsilon_tag the tag to take as epsilon
*/
void optional(int const epsilon_tag = 0);
/**
* Make a transducer cyclic (link final states with initial state with
* empty transductions)
* @param epsilon_tag the tag to take as epsilon
*/
void oneOrMore(int const epsilon_tag = 0);
/**
* zeroOrMore = oneOrMore + optional
* @param epsilon_tag the tag to take as epsilon
*/
void zeroOrMore(int const epsilon_tag = 0);
/**
* Clear transducer
*/
void clear();
/**
* Check if the transducer is empty
* @return true if the transducer is empty
*/
bool isEmpty() const;
/**
* Returns the number of states of the transducer
* @return the number of states
*/
int size() const;
/**
* Returns the number of transitions of the transducer
* @return the number of transitions
*/
int numberOfTransitions() const;
/**
* Checks if a state is empty (not outgoing transductions)
* @param state the state to check
* @return true if the state is empty
*/
bool isEmpty(int const state) const;
/**
* Write method
* @param output the stream to write to
* @param decalage offset to sum to the tags
*/
void write(FILE *output, int const decalage = 0);
/**
* Read method
* @param input the stream to read from
* @param decalage offset to sum to the tags
*/
void read(FILE *input, int const decalage = 0);
};
#endif
|