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
24f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <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>
34f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/fst.h>
35f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/util.h>
36f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#include <fst/vector-fst.h>
37f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
38f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian HodsonDECLARE_string(fst_field_separator);
39f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
40f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsonnamespace fst {
41f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
42f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// Compile a binary Fst from textual input, helper class for fstcompile.cc
43f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// WARNING: Stand-alone use of this class not recommended, most code should
44f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson// read/write using the binary format which is much more efficient.
45f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodsontemplate <class A> class FstCompiler {
46f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson public:
47f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef A Arc;
48f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef typename A::StateId StateId;
49f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef typename A::Label Label;
50f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  typedef typename A::Weight Weight;
51f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
52f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  // WARNING: use of 'allow_negative_labels = true' not recommended; may
53f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  // cause conflicts
54f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  FstCompiler(istream &istrm, const string &source,
55f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson            const SymbolTable *isyms, const SymbolTable *osyms,
56f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson            const SymbolTable *ssyms, bool accep, bool ikeep,
57f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson              bool okeep, bool nkeep, bool allow_negative_labels = false)
58f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      : nline_(0), source_(source),
59f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        isyms_(isyms), osyms_(osyms), ssyms_(ssyms),
60f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        nstates_(0), keep_state_numbering_(nkeep),
61f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        allow_negative_labels_(allow_negative_labels) {
62f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    char line[kLineLen];
63f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    while (istrm.getline(line, kLineLen)) {
64f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      ++nline_;
65f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      vector<char *> col;
66f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      string separator = FLAGS_fst_field_separator + "\n";
67f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      SplitToVector(line, separator.c_str(), &col, true);
68f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if (col.size() == 0 || col[0][0] == '\0')  // empty line
69f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        continue;
70f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if (col.size() > 5 ||
71f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          (col.size() > 4 && accep) ||
72f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          (col.size() == 3 && !accep)) {
73f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        FSTERROR() << "FstCompiler: Bad number of columns, source = "
74f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << source_
75f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << ", line = " << nline_;
76f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetProperties(kError, kError);
77f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        return;
78f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      }
79f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      StateId s = StrToStateId(col[0]);
80f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      while (s >= fst_.NumStates())
81f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.AddState();
82f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if (nline_ == 1)
83f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetStart(s);
84f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
85f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      Arc arc;
86f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      StateId d = s;
87f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      switch (col.size()) {
88f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case 1:
89f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetFinal(s, Weight::One());
90f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        break;
91f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case 2:
92f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetFinal(s, StrToWeight(col[1], true));
93f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        break;
94f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case 3:
95f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.nextstate = d = StrToStateId(col[1]);
96f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.ilabel = StrToILabel(col[2]);
97f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.olabel = arc.ilabel;
98f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.weight = Weight::One();
99f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.AddArc(s, arc);
100f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        break;
101f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case 4:
102f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.nextstate = d = StrToStateId(col[1]);
103f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.ilabel = StrToILabel(col[2]);
104f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        if (accep) {
105f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          arc.olabel = arc.ilabel;
106f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          arc.weight = StrToWeight(col[3], false);
107f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        } else {
108f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          arc.olabel = StrToOLabel(col[3]);
109f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson          arc.weight = Weight::One();
110f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        }
111f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.AddArc(s, arc);
112f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        break;
113f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      case 5:
114f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.nextstate = d = StrToStateId(col[1]);
115f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.ilabel = StrToILabel(col[2]);
116f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.olabel = StrToOLabel(col[3]);
117f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        arc.weight = StrToWeight(col[4], false);
118f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.AddArc(s, arc);
119f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      }
120f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      while (d >= fst_.NumStates())
121f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.AddState();
122f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    }
123f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (ikeep)
124f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fst_.SetInputSymbols(isyms);
125f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (okeep)
126f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fst_.SetOutputSymbols(osyms);
127f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
128f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
129f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const VectorFst<A> &Fst() const {
130f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return fst_;
131f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
132f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
133f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson private:
134f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  // Maximum line length in text file.
135f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  static const int kLineLen = 8096;
136f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
137f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  int64 StrToId(const char *s, const SymbolTable *syms,
138f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                const char *name, bool allow_negative = false) const {
139f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    int64 n = 0;
140f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
141f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (syms) {
142f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      n = syms->Find(s);
143f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if (n == -1 || (!allow_negative && n < 0)) {
144f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        FSTERROR() << "FstCompiler: Symbol \"" << s
145f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << "\" is not mapped to any integer " << name
146f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << ", symbol table = " << syms->Name()
147f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << ", source = " << source_ << ", line = " << nline_;
148f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetProperties(kError, kError);
149f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      }
150f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    } else {
151f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      char *p;
152f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      n = strtoll(s, &p, 10);
153f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      if (p < s + strlen(s) || (!allow_negative && n < 0)) {
154f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        FSTERROR() << "FstCompiler: Bad " << name << " integer = \"" << s
155f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                   << "\", source = " << source_ << ", line = " << nline_;
156f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson        fst_.SetProperties(kError, kError);
157f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      }
158f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    }
159f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return n;
160f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
161f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
162f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  StateId StrToStateId(const char *s) {
163f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    StateId n = StrToId(s, ssyms_, "state ID");
164f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
165f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (keep_state_numbering_)
166f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      return n;
167f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
168f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    // remap state IDs to make dense set
169f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    typename unordered_map<StateId, StateId>::const_iterator it = states_.find(n);
170f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (it == states_.end()) {
171f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      states_[n] = nstates_;
172f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      return nstates_++;
173f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    } else {
174f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      return it->second;
175f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    }
176f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
177f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
178f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  StateId StrToILabel(const char *s) const {
179f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return StrToId(s, isyms_, "arc ilabel", allow_negative_labels_);
180f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
181f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
182f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  StateId StrToOLabel(const char *s) const {
183f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return StrToId(s, osyms_, "arc olabel", allow_negative_labels_);
184f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
185f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
186f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  Weight StrToWeight(const char *s, bool allow_zero) const {
187f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    Weight w;
188f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    istringstream strm(s);
189f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    strm >> w;
190f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    if (!strm || (!allow_zero && w == Weight::Zero())) {
191f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      FSTERROR() << "FstCompiler: Bad weight = \"" << s
192f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson                 << "\", source = " << source_ << ", line = " << nline_;
193f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      fst_.SetProperties(kError, kError);
194f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson      w = Weight::NoWeight();
195f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    }
196f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson    return w;
197f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  }
198f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
199f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  mutable VectorFst<A> fst_;
200f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  size_t nline_;
201f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  string source_;                      // text FST source name
202f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const SymbolTable *isyms_;           // ilabel symbol table
203f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const SymbolTable *osyms_;           // olabel symbol table
204f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  const SymbolTable *ssyms_;           // slabel symbol table
205f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  unordered_map<StateId, StateId> states_;  // state ID map
206f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  StateId nstates_;                    // number of seen states
207f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  bool keep_state_numbering_;
208f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  bool allow_negative_labels_;         // not recommended; may cause conflicts
209f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
210f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson  DISALLOW_COPY_AND_ASSIGN(FstCompiler);
211f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson};
212f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
213f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson}  // namespace fst
214f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson
215f4c12fce1ee58e670f9c3fce46c40296ba9ee8a2Ian Hodson#endif  // FST_SCRIPT_COMPILE_IMPL_H_
216