#ifndef _CFG_WFST_COMPOSER_H_ #define _CFG_WFST_COMPOSER_H_ #include #include #include #include "trule.h" #include "wordid.h" class CFG_WFSTComposerImpl; class Hypergraph; struct WFSTNode { virtual ~WFSTNode(); // returns the next states reachable by consuming srcindex (which identifies a word) // paired with the output string generated by taking that transition. virtual std::vector > ExtendInput(unsigned srcindex) const = 0; }; struct WFST { virtual ~WFST(); virtual const WFSTNode* Final() const = 0; virtual const WFSTNode* Initial() const = 0; }; class CFG_WFSTComposer { public: ~CFG_WFSTComposer(); explicit CFG_WFSTComposer(const WFST& wfst); bool Compose(const Hypergraph& in_forest, Hypergraph* trg_forest); // reads the grammar from a file. There must be a single top-level // S -> X rule. Anything else is possible. Format is: // [S] ||| [SS,1] // [SS] ||| [NP,1] [VP,2] ||| Feature1=0.2 Feature2=-2.3 // [SS] ||| [VP,1] [NP,2] ||| Feature1=0.8 // [NP] ||| [DET,1] [N,2] ||| Feature3=2 // ... bool Compose(std::istream* grammar_file, Hypergraph* trg_forest); private: CFG_WFSTComposerImpl* pimpl_; }; #endif