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