#ifndef PGF_DATA_H_ #define PGF_DATA_H_ #include #include #include #include #include "pgf.h" #ifdef _WIN32 #include #endif #ifdef __APPLE__ #include #endif class PGF_INTERNAL_DECL pgf_error : public std::runtime_error { public: pgf_error(const char *msg) : std::runtime_error(msg) { this->msg = msg; } virtual const char *what() const throw () { return msg; } private: const char *msg; }; class PGF_INTERNAL_DECL pgf_systemerror : public std::runtime_error { public: pgf_systemerror(int code) : std::runtime_error("pgf_systemerror") { this->m_code = code; this->m_filepath = NULL; } pgf_systemerror(int code, const char *filepath) : std::runtime_error("pgf_systemerror") { this->m_code = code; this->m_filepath = filepath; } virtual int code() const { return m_code; } const char *filepath() const { return m_filepath; } private: int m_code; const char *m_filepath; }; class PgfPGF; class PgfConcr; #include "db.h" #include "text.h" #include "vector.h" #include "namespace.h" #include "phrasetable.h" #include "expr.h" struct PGF_INTERNAL_DECL PgfFlag { size_t ref_count; PgfLiteral value; PgfText name; static void release(ref pgf); }; struct PGF_INTERNAL_DECL PgfAbsFun { size_t ref_count; ref type; int arity; ref bytecode; prob_t prob; PgfText name; static void release(ref cat); }; struct PGF_INTERNAL_DECL PgfAbsCat { size_t ref_count; ref> context; prob_t prob; PgfText name; static void release(ref cat); }; typedef struct { ref name; Namespace aflags; Namespace funs; Namespace cats; } PgfAbstr; struct PGF_INTERNAL_DECL PgfLParam { size_t i0; size_t n_terms; struct { size_t factor; size_t var; } terms[]; }; struct PGF_INTERNAL_DECL PgfVariableRange { size_t var; size_t range; }; struct PGF_INTERNAL_DECL PgfPArg { ref param; }; struct PGF_INTERNAL_DECL PgfPResult { ref> vars; PgfLParam param; }; typedef object PgfSymbol; struct PGF_INTERNAL_DECL PgfSequence { size_t ref_count; Vector syms; static void release(ref lincat); }; struct PGF_INTERNAL_DECL PgfSymbolCat { static const uint8_t tag = 0; size_t d; PgfLParam r; }; struct PGF_INTERNAL_DECL PgfSymbolLit { static const uint8_t tag = 1; size_t d; PgfLParam r; }; struct PGF_INTERNAL_DECL PgfSymbolVar { static const uint8_t tag = 2; size_t d, r; }; struct PGF_INTERNAL_DECL PgfSymbolKS { static const uint8_t tag = 3; PgfText token; }; struct PGF_INTERNAL_DECL PgfAlternative { ref form; /**< The form of this variant as a list of tokens. */ ref>> prefixes; /**< The prefixes of the following symbol that trigger this * form. */ }; struct PGF_INTERNAL_DECL PgfSymbolKP { static const uint8_t tag = 4; ref default_form; Vector alts; }; struct PGF_INTERNAL_DECL PgfSymbolBIND { static const uint8_t tag = 5; }; struct PGF_INTERNAL_DECL PgfSymbolSOFTBIND { static const uint8_t tag = 6; }; struct PGF_INTERNAL_DECL PgfSymbolNE { static const uint8_t tag = 7; }; struct PGF_INTERNAL_DECL PgfSymbolSOFTSPACE { static const uint8_t tag = 8; }; struct PGF_INTERNAL_DECL PgfSymbolCAPIT { static const uint8_t tag = 9; }; struct PGF_INTERNAL_DECL PgfSymbolALLCAPIT { static const uint8_t tag = 10; }; PGF_INTERNAL_DECL void pgf_symbol_free(PgfSymbol sym); struct PGF_INTERNAL_DECL PgfConcrLincat { size_t ref_count; ref abscat; ref>> fields; size_t n_lindefs; ref> args; ref>> res; ref>> seqs; PgfText name; static void release(ref lincat); }; struct PGF_INTERNAL_DECL PgfConcrLin { size_t ref_count; ref absfun; ref> args; ref>> res; ref>> seqs; PgfText name; static void release(ref lin); }; struct PGF_INTERNAL_DECL PgfConcrPrintname { size_t ref_count; ref printname; PgfText name; static void release(ref printname); }; struct PGF_INTERNAL_DECL PgfConcr { size_t ref_count; size_t ref_count_ex; Namespace cflags; Namespace lins; Namespace lincats; PgfPhrasetable phrasetable; Namespace printnames; // If there are references from the host language to this concrete, // then it is included in a double-linked list. If a process // dies without releasing the reference, it will be released by // the first process who have an exclusive access to the database. ref prev, next; PgfText name; static void release(ref pgf); }; struct PGF_INTERNAL_DECL PgfPGF { size_t ref_count; uint16_t major_version; uint16_t minor_version; Namespace gflags; PgfAbstr abstract; Namespace concretes; // If the revision is transient, then it is in a double-linked list // with all other transient revisions. ref prev, next; // The name lets the user to find a particular revision in // the database. PgfText name; static void release(ref pgf); }; extern PGF_INTERNAL_DECL size_t master_size; extern PGF_INTERNAL_DECL char master_text[]; #endif