1f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// compile.h 2f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 3f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Licensed under the Apache License, Version 2.0 (the "License"); 4f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// you may not use this file except in compliance with the License. 5f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// You may obtain a copy of the License at 6f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 7f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// http://www.apache.org/licenses/LICENSE-2.0 8f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 9f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Unless required by applicable law or agreed to in writing, software 10f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// distributed under the License is distributed on an "AS IS" BASIS, 11f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// See the License for the specific language governing permissions and 13f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// limitations under the License. 14f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 15f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Copyright 2005-2010 Google, Inc. 16f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Author: riley@google.com (Michael Riley) 17f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// 18f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// \file 19f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Class to to compile a binary Fst from textual input. 20f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 21f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#ifndef FST_SCRIPT_COMPILE_IMPL_H_ 22f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#define FST_SCRIPT_COMPILE_IMPL_H_ 23f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 243da1eb108d36da35333b2d655202791af854996bPrzemyslaw Szczepaniak#include <tr1/unordered_map> 25f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_map; 26f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::tr1::unordered_multimap; 27f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <sstream> 28f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <string> 29f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <vector> 30f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonusing std::vector; 31f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 32f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <iostream> 33f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fstream> 34dfd8b8327b93660601d016cdc6f29f433b45a8d8Alexander Gutkin#include <sstream> 35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/fst.h> 36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/util.h> 37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/vector-fst.h> 38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonDECLARE_string(fst_field_separator); 40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst { 42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Compile a binary Fst from textual input, helper class for fstcompile.cc 44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WARNING: Stand-alone use of this class not recommended, most code should 45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// read/write using the binary format which is much more efficient. 46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> class FstCompiler { 47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public: 48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef A Arc; 49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::StateId StateId; 50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Label Label; 51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typedef typename A::Weight Weight; 52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // WARNING: use of 'allow_negative_labels = true' not recommended; may 54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // cause conflicts 55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FstCompiler(istream &istrm, const string &source, 56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *isyms, const SymbolTable *osyms, 57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *ssyms, bool accep, bool ikeep, 58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool okeep, bool nkeep, bool allow_negative_labels = false) 59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson : nline_(0), source_(source), 60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson isyms_(isyms), osyms_(osyms), ssyms_(ssyms), 61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson nstates_(0), keep_state_numbering_(nkeep), 62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson allow_negative_labels_(allow_negative_labels) { 63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson char line[kLineLen]; 64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson while (istrm.getline(line, kLineLen)) { 65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson ++nline_; 66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson vector<char *> col; 67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string separator = FLAGS_fst_field_separator + "\n"; 68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson SplitToVector(line, separator.c_str(), &col, true); 69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (col.size() == 0 || col[0][0] == '\0') // empty line 70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson continue; 71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (col.size() > 5 || 72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (col.size() > 4 && accep) || 73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson (col.size() == 3 && !accep)) { 74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FSTERROR() << "FstCompiler: Bad number of columns, source = " 75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << source_ 76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << ", line = " << nline_; 77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetProperties(kError, kError); 78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return; 79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId s = StrToStateId(col[0]); 81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson while (s >= fst_.NumStates()) 82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.AddState(); 83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (nline_ == 1) 84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetStart(s); 85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Arc arc; 87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId d = s; 88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson switch (col.size()) { 89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case 1: 90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetFinal(s, Weight::One()); 91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson break; 92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case 2: 93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetFinal(s, StrToWeight(col[1], true)); 94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson break; 95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case 3: 96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.nextstate = d = StrToStateId(col[1]); 97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.ilabel = StrToILabel(col[2]); 98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.olabel = arc.ilabel; 99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.weight = Weight::One(); 100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.AddArc(s, arc); 101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson break; 102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case 4: 103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.nextstate = d = StrToStateId(col[1]); 104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.ilabel = StrToILabel(col[2]); 105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (accep) { 106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.olabel = arc.ilabel; 107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.weight = StrToWeight(col[3], false); 108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.olabel = StrToOLabel(col[3]); 110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.weight = Weight::One(); 111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.AddArc(s, arc); 113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson break; 114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson case 5: 115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.nextstate = d = StrToStateId(col[1]); 116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.ilabel = StrToILabel(col[2]); 117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.olabel = StrToOLabel(col[3]); 118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson arc.weight = StrToWeight(col[4], false); 119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.AddArc(s, arc); 120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson while (d >= fst_.NumStates()) 122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.AddState(); 123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (ikeep) 125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetInputSymbols(isyms); 126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (okeep) 127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetOutputSymbols(osyms); 128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const VectorFst<A> &Fst() const { 131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return fst_; 132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private: 135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // Maximum line length in text file. 136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson static const int kLineLen = 8096; 137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int64 StrToId(const char *s, const SymbolTable *syms, 139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const char *name, bool allow_negative = false) const { 140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson int64 n = 0; 141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (syms) { 143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson n = syms->Find(s); 144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (n == -1 || (!allow_negative && n < 0)) { 145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FSTERROR() << "FstCompiler: Symbol \"" << s 146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "\" is not mapped to any integer " << name 147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << ", symbol table = " << syms->Name() 148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << ", source = " << source_ << ", line = " << nline_; 149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetProperties(kError, kError); 150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson char *p; 153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson n = strtoll(s, &p, 10); 154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (p < s + strlen(s) || (!allow_negative && n < 0)) { 155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FSTERROR() << "FstCompiler: Bad " << name << " integer = \"" << s 156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "\", source = " << source_ << ", line = " << nline_; 157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetProperties(kError, kError); 158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return n; 161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId StrToStateId(const char *s) { 164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId n = StrToId(s, ssyms_, "state ID"); 165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (keep_state_numbering_) 167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return n; 168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson // remap state IDs to make dense set 170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson typename unordered_map<StateId, StateId>::const_iterator it = states_.find(n); 171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (it == states_.end()) { 172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson states_[n] = nstates_; 173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return nstates_++; 174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } else { 175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return it->second; 176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId StrToILabel(const char *s) const { 180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return StrToId(s, isyms_, "arc ilabel", allow_negative_labels_); 181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId StrToOLabel(const char *s) const { 184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return StrToId(s, osyms_, "arc olabel", allow_negative_labels_); 185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight StrToWeight(const char *s, bool allow_zero) const { 188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson Weight w; 189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson istringstream strm(s); 190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson strm >> w; 191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson if (!strm || (!allow_zero && w == Weight::Zero())) { 192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson FSTERROR() << "FstCompiler: Bad weight = \"" << s 193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson << "\", source = " << source_ << ", line = " << nline_; 194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson fst_.SetProperties(kError, kError); 195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson w = Weight::NoWeight(); 196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson return w; 198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson } 199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson mutable VectorFst<A> fst_; 201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson size_t nline_; 202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson string source_; // text FST source name 203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *isyms_; // ilabel symbol table 204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *osyms_; // olabel symbol table 205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson const SymbolTable *ssyms_; // slabel symbol table 206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson unordered_map<StateId, StateId> states_; // state ID map 207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson StateId nstates_; // number of seen states 208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool keep_state_numbering_; 209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson bool allow_negative_labels_; // not recommended; may cause conflicts 210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson DISALLOW_COPY_AND_ASSIGN(FstCompiler); 212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}; 213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson} // namespace fst 215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson 216f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif // FST_SCRIPT_COMPILE_IMPL_H_ 217