/* Copyright (C) 1995 Bjoern Beutel. */ /* Description. =============================================================*/ /* This module defines the structure of compiled Malaga files. */ /* Constants. ===============================================================*/ enum {MALAGA_LEN = 6}; /* Length of magic code at beginning of Malaga file. */ /* Values for FILE_TYPE. */ enum {SYMBOL_FILE, RULE_FILE, LEXICON_FILE, PRELEX_FILE}; /* Versions of compiled Malaga file types. */ enum {SYMBOL_CODE_VERSION = 8}; enum {RULE_CODE_VERSION = 47}; enum {LEXICON_CODE_VERSION = 14}; enum {PRELEX_CODE_VERSION = 1}; /* Versions of Malaga file types that are still understood. */ enum {MIN_SYMBOL_CODE_VERSION = 8}; enum {MIN_RULE_CODE_VERSION = 47}; enum {MIN_LEXICON_CODE_VERSION = 14}; enum {MIN_PRELEX_CODE_VERSION = 1}; /* Types. ===================================================================*/ typedef struct /* The common header of every Malaga file. */ { char_t malaga[ MALAGA_LEN ]; /* "MALAGA" to recognise Malaga files. */ u_byte_t split_hangul_syllables; /* Boolean field. */ byte_t file_type; /* SYMBOL_FILE, RULE_FILE or LEXICON_FILE. */ int_t code_version; /* Only load code of the current version. */ int_t sym_stamp; /* Stamp for ".sym" file. */ int_t esym_stamp; /* Stamp for ".esym" file or 0. */ } common_header_t; /*---------------------------------------------------------------------------*/ typedef struct /* The format of a Malaga rule file. */ { common_header_t common_header; int_t initial_rule_set; /* Index of the initial rule set in RULE_SETS. */ int_t initial_feat; /* Index of the initial feature structure in VALUES. */ int_t robust_rule; /* Rule number of robust_rule. */ int_t pruning_rule; /* Rule number of pruning_rule. */ int_t allo_rule; /* Rule number of allo_rule. */ int_t input_filter; /* Rule number of input_filter. */ int_t output_filter; /* Rule number of output_filter. */ int_t rule_count; /* Number of rules in this file. */ int_t rule_sets_size; /* Size of rule set table. */ int_t instr_count; /* Number of instructions in this file. */ int_t values_size; /* Size of Malaga value table. */ int_t src_line_count; /* Number of correspondences * between source lines and rule code. */ int_t var_count; /* Number of variable names. */ int_t var_scope_count; /* Number of variable scopes. */ int_t constant_count; /* Number of named constants. */ int_t strings_size; /* Size of string table. */ /* The following blocks have dynamic size: */ /* rule_t rules[ rule_count ]; */ /* int_t rule_sets[ rule_sets_size ]; */ /* instr_t instrs[ instr_count ]; */ /* cell_t values[ values_size ]; */ /* src_line_t src_lines[ src_line_count ]; */ /* var_t vars[ var_count ]; */ /* var_scope_t var_scopes[ var_scope_count ]; */ /* constant_t constants[ constant_count ]; */ /* char_t strings[ strings_size ]; */ } rule_header_t; /*---------------------------------------------------------------------------*/ typedef struct /* An entry in the symbol table. */ { int_t name; /* STRINGS index to symbol name. */ int_t atoms; /* VALUES index to list of the atomic symbols * of a multi-symbol (or -1). */ } symbol_entry_t; typedef struct /* The format of a Malaga symbol file. */ { common_header_t common_header; int_t symbol_count; /* Number of symbols in this file. */ int_t values_size; /* Size of Malaga value table (for multi-symbols). */ int_t strings_size; /* Size of string table (for symbol names). */ /* The following blocks have dynamic size: * symbol_entry_t symbols[ symbol_count ]; * cell_t values[ values_size ]; * char_t strings[ strings_size ]; */ } symbol_header_t; /*---------------------------------------------------------------------------*/ typedef struct /* An entry in the prelex file. */ { int_t surface; /* STRINGS index to surface. */ int_t feat; /* VALUES index to feature structure. */ } prelex_entry_t; typedef struct /* The format of a Malaga prelex file. */ { common_header_t common_header; int_t entry_count; /* Number of entries in this file. */ int_t values_size; /* Size of value table. */ int_t strings_size; /* Size of string table. */ /* The following blocks have dynamic size: * prelex_entry_t entries[ entry_count ]; * cell_t values[ values_size ]; * char_t strings[ strings_size ]; */ } prelex_header_t; /*---------------------------------------------------------------------------*/ typedef struct /* The format of a Malaga lexicon file. */ { common_header_t common_header; int_t trie_size; /* Size of trie table. */ int_t trie_root; /* Index of root node in TRIE. */ int_t feat_lists_size; /* Size of feature structure lists table. */ int_t values_size; /* Size of value table. */ /* The following blocks have dynamic size: * int_t trie[ trie_size ]; * int_t feat_lists[ feat_lists_size ]; * cell_t values[ values_size ]; */ } lexicon_header_t; /* Functions. ===============================================================*/ extern void set_sym_stamp( void ); /* Create a stamp for the ".sym" file */ extern void set_esym_stamp( void ); /* Create a stamp for the ".esym" file */ extern void check_header( common_header_t *header, string_t file_name, int_t file_type, int_t min_code_version, int_t max_code_version ); /* Check if HEADER is of FILE_TYPE and * between MIN_CODE_VERSION and MAX_CODE_VERSION. * FILE_NAME is needed for error messages. */ extern void set_header( common_header_t *header, int_t file_type, int_t code_version ); /* Set header to be of FILE_TYPE and CODE_VERSION. */ /* End of file. =============================================================*/