Difference between revisions of "Lttoolbox API examples"
Jump to navigation
Jump to search
m (oops) |
(that version only works for 'beer') |
||
Line 34: | Line 34: | ||
int main (int argc, char** argv) |
int main (int argc, char** argv) |
||
{ |
{ |
||
− | + | Alphabet alphabet; |
|
− | + | Transducer t; |
|
− | + | // Set locale |
|
− | + | LtLocale::tryToSetLocale(); |
|
− | + | // Include symbols into alphabet, keeping the values |
|
− | + | alphabet.includeSymbol(L"<n>"); |
|
− | + | alphabet.includeSymbol(L"<sg>"); |
|
− | + | alphabet.includeSymbol(L"<pl>"); |
|
− | + | int n_sym = alphabet(L"<n>"); |
|
− | + | int sg_sym = alphabet(L"<sg>"); |
|
− | + | int pl_sym = alphabet(L"<pl>"); |
|
− | + | // Initial state |
|
− | + | int initial = t.getInitial(); |
|
− | + | // build "beer" manually |
|
− | + | int beer = initial; |
|
− | + | // these are the transitions b:b e:e e:e r:r |
|
− | + | beer = t.insertSingleTransduction(alphabet(L'b',L'b'), beer); |
|
− | + | beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer); |
|
− | + | beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer); |
|
− | + | beer = t.insertSingleTransduction(alphabet(L'r',L'r'), beer); |
|
− | + | // these are 0:<n> 0:<sg> |
|
− | + | beer = t.insertSingleTransduction(alphabet(0, n_sym), beer); |
|
− | + | beer = t.insertSingleTransduction(alphabet(0, sg_sym), beer); |
|
− | + | t.setFinal(beer); |
|
+ | // build "beers" manually |
||
− | //#if 0 |
||
− | + | int beers = t.getInitial(); |
|
− | + | beers = t.insertSingleTransduction(alphabet(L'b',L'b'), beers); |
|
− | + | beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers); |
|
− | + | beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers); |
|
− | + | beers = t.insertSingleTransduction(alphabet(L'r',L'r'), beers); |
|
− | beer = t.insertSingleTransduction(alphabet(L'r',L'r'), beer); |
||
− | + | // this transition is s:0 |
|
− | + | beers = t.insertSingleTransduction(alphabet(L's', 0), beers); |
|
− | + | beers = t.insertSingleTransduction(alphabet(0, n_sym), beers); |
|
− | + | beers = t.insertSingleTransduction(alphabet(0, pl_sym), beers); |
|
− | + | t.setFinal(beers); |
|
− | //#endif |
||
− | + | t.minimize(); |
|
− | t.joinFinals(); |
||
− | + | //Rather than try to convert between Transducer and TransExe, we'll |
|
− | + | //just write and read. |
|
− | + | FILE* fst=fopen("beer.fst", "w"); |
|
− | + | t.write(fst); |
|
− | + | fclose(fst); |
|
− | + | fst=fopen("beer.fst", "r"); |
|
− | + | TransExe te; |
|
− | + | te.read(fst, alphabet); |
|
− | + | fclose(fst); |
|
− | + | Pool<vector<int> > *pool = new Pool<vector<int> >(1, vector<int>(50)); |
|
− | + | State *initial_state = new State(pool); |
|
− | + | initial_state->init(te.getInitial()); |
|
⚫ | |||
− | // Node root; |
||
− | // root.addTransition(0, 0, te.getInitial()); |
||
− | // initial_state->init(&root); |
||
⚫ | |||
− | + | wstring input, output=L""; |
|
− | + | set<Node *> anfinals; |
|
− | + | anfinals.insert(te.getFinals().begin(), te.getFinals().end()); |
|
⚫ | |||
− | cout << "Finals: " << te.getFinals().size() <<endl; |
||
+ | bool reading=true; |
||
⚫ | |||
⚫ | |||
− | |||
− | + | while (reading) |
|
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | { |
||
⚫ | |||
⚫ | |||
+ | reading=false; |
||
⚫ | |||
− | + | } |
|
− | + | else |
|
− | + | { |
|
⚫ | |||
⚫ | |||
− | { |
+ | { |
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
+ | break; |
||
⚫ | |||
⚫ | |||
⚫ | |||
− | + | else |
|
− | + | { |
|
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
} |
} |
||
} |
} |
||
+ | } |
||
− | if(!current_state.isFinal(anfinals)) wcout << L"saw: " << val << endl; |
||
− | } |
||
− | + | // Not used, just don't want it to be empty... |
|
⚫ | |||
⚫ | |||
+ | { |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
− | + | wcout << input << output << endl; |
|
+ | } |
||
⚫ | |||
⚫ | |||
− | wcout << L"Output: " << endl; |
||
+ | { |
||
− | wcout << output << endl; |
||
⚫ | |||
+ | } |
||
− | + | return 0; |
|
} |
} |
||
</pre> |
</pre> |
Revision as of 18:53, 23 February 2011
This is a simple C++/lttoolbox version of the 'beer' program in Morphological dictionaries
// g++ -I/usr/local/include/lttoolbox-3.2 -I/usr/local/lib -llttoolbox3 lt_beer.cc -o lt-beer #include <cwchar> #include <cstdio> #include <cerrno> #include <string> #include <iostream> #include <list> #include <set> #include <lttoolbox/ltstr.h> // LtLocale::tryToSetLocale() #include <lttoolbox/lt_locale.h> // Transducer class #include <lttoolbox/transducer.h> // Alphabet class #include <lttoolbox/alphabet.h> // Pool class #include <lttoolbox/pool.h> // State class #include <lttoolbox/state.h> // TransExe class #include <lttoolbox/trans_exe.h> int main (int argc, char** argv) { Alphabet alphabet; Transducer t; // Set locale LtLocale::tryToSetLocale(); // Include symbols into alphabet, keeping the values alphabet.includeSymbol(L"<n>"); alphabet.includeSymbol(L"<sg>"); alphabet.includeSymbol(L"<pl>"); int n_sym = alphabet(L"<n>"); int sg_sym = alphabet(L"<sg>"); int pl_sym = alphabet(L"<pl>"); // Initial state int initial = t.getInitial(); // build "beer" manually int beer = initial; // these are the transitions b:b e:e e:e r:r beer = t.insertSingleTransduction(alphabet(L'b',L'b'), beer); beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer); beer = t.insertSingleTransduction(alphabet(L'e',L'e'), beer); beer = t.insertSingleTransduction(alphabet(L'r',L'r'), beer); // these are 0:<n> 0:<sg> beer = t.insertSingleTransduction(alphabet(0, n_sym), beer); beer = t.insertSingleTransduction(alphabet(0, sg_sym), beer); t.setFinal(beer); // build "beers" manually int beers = t.getInitial(); beers = t.insertSingleTransduction(alphabet(L'b',L'b'), beers); beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers); beers = t.insertSingleTransduction(alphabet(L'e',L'e'), beers); beers = t.insertSingleTransduction(alphabet(L'r',L'r'), beers); // this transition is s:0 beers = t.insertSingleTransduction(alphabet(L's', 0), beers); beers = t.insertSingleTransduction(alphabet(0, n_sym), beers); beers = t.insertSingleTransduction(alphabet(0, pl_sym), beers); t.setFinal(beers); t.minimize(); //Rather than try to convert between Transducer and TransExe, we'll //just write and read. FILE* fst=fopen("beer.fst", "w"); t.write(fst); fclose(fst); fst=fopen("beer.fst", "r"); TransExe te; te.read(fst, alphabet); fclose(fst); Pool<vector<int> > *pool = new Pool<vector<int> >(1, vector<int>(50)); State *initial_state = new State(pool); initial_state->init(te.getInitial()); State current_state = *initial_state; wstring input, output=L""; set<Node *> anfinals; anfinals.insert(te.getFinals().begin(), te.getFinals().end()); FILE* in=stdin; bool reading=true; // This is our runtime: see if the input matches while (reading) { wchar_t val = (wchar_t)fgetwc(in); if(val==WEOF||iswspace(val)) { reading=false; } else { if (!reading) { // At the end. We don't need to do anything but // leave the loop in this simplistic example break; } else { current_state.step(val); alphabet.getSymbol(input, val); } } } // Not used, just don't want it to be empty... if (current_state.isFinal(anfinals)) { set<wchar_t> escaped; escaped.insert(L'$'); output = current_state.filterFinals(anfinals, alphabet, escaped); wcout << input << output << endl; } else { wcout << L"Unrecognised: " << input << endl; } return 0; }