#ifndef _DERIVREADER_H_ #define _DERIVREADER_H_ #include #include #include #include #include "grammar.h" namespace delphin { struct Node { std::string surface; std::string carg; std::string caseclass; std::vector tags; std::vector probs; std::vector supertags; std::vector superprobs; int start; int end; int startchar; int endchar; std::vector tok_ids; Node():start(-1), end(-1), startchar(-1), endchar(-1){}; Node(std::string s):surface(s), start(-1), end(-1), startchar(-1), endchar(-1){}; }; template class DerivReader { Grammar _g; Data &_d; boost::regex rootnode; boost::regex endnode; boost::regex startnode; boost::regex intnode; boost::regex leafnode; boost::regex tokenre; // called on internal node when the node values are read // arguments are node details, node ancestors, edge number, score, start, end void (*_start_int_node_funct)(Grammar &, std::string, std::vector &, int, double, int, int, Data &); // called on internal node once all subtrees are parsed // arguments are direct child(ren) nodes and ancestor nodes void (*_end_int_node_funct)(Grammar &, std::vector &, std::vector &, Data &); // called when a leaf node is parsed // arguments are node details, node ancestors void (*_leaf_funct)(Grammar &, Node, std::vector &, Data &); // recursive functions for reading the tree std::string readNode(std::string const &, std::vector &); std::string readTokenFS(std::string &, std::map &); void readFS(std::string &tok, std::string featstr, std::map &tokfeatures, std::map &reentrancies); std::string readFeat(std::string &tok); std::pair readVal(std::string &tok); std::string parseSymbol(std::string &tok); std::string parseString(std::string &tok); void removeWhitespace(std::string &rest); public: // constructer requires function pointers DerivReader(Grammar const &g, Data &d, void (*start_int_node)(Grammar &, std::string, std::vector &, int, double, int, int, Data &)=NULL, void (*end_int_node)(Grammar &, std::vector &, std::vector &, Data &)=NULL, void (*leaf)(Grammar &, Node, std::vector &, Data &)=NULL); ~DerivReader(); void readDeriv(std::string); }; } //namespace #endif