blob: c2e4c2b25f85aa5dd9471be3653a8db1de0514ca [file] [log] [blame]
/*
Copyright 2002-2003 John Plevyak, All Rights Reserved
*/
#ifndef _dparse_tables_H_
#define _dparse_tables_H_
#define SCANNER_BLOCKS_POW2 2
#define SCANNER_BLOCKS (1 << SCANNER_BLOCKS_POW2)
#define SCANNER_BLOCK_SHIFT (8 - SCANNER_BLOCKS_POW2)
#define SCANNER_BLOCK_MASK ((1 << SCANNER_BLOCK_SHIFT) - 1)
#define SCANNER_BLOCK_SIZE (256 / SCANNER_BLOCKS)
struct D_Parser;
struct D_ShiftTable;
#define D_PN(_x, _o) ((D_ParseNode*)((char*)(_x) + _o))
typedef struct d_loc_t {
char *s, *pathname;
int previous_col, col, line;
} d_loc_t;
typedef void (*D_WhiteSpaceFn)(struct D_Parser *p,
d_loc_t *loc, void **p_globals);
typedef int (*D_ScanCode)(
char **s, int *col, int *line, unsigned short *symbol,
int *term_priority, unsigned char *op_assoc, int *op_priority);
typedef int (*D_ReductionCode)(
void *new_ps, void **children, int n_children, int pn_offset,
struct D_Parser *parser);
typedef struct D_Reduction {
unsigned short nelements;
unsigned short symbol;
D_ReductionCode speculative_code;
D_ReductionCode final_code;
unsigned short op_assoc;
unsigned short rule_assoc;
int op_priority;
int rule_priority;
int action_index;
int npass_code;
D_ReductionCode *pass_code;
} D_Reduction;
typedef struct D_RightEpsilonHint {
unsigned short depth;
unsigned short preceeding_state;
D_Reduction *reduction;
} D_RightEpsilonHint;
typedef struct D_ErrorRecoveryHint {
unsigned short depth;
unsigned short symbol;
char *string;
} D_ErrorRecoveryHint;
typedef struct D_Shift {
unsigned short symbol;
unsigned char shift_kind;
unsigned char op_assoc;
int op_priority;
int term_priority;
D_ReductionCode speculative_code;
} D_Shift;
typedef struct SB_uint8 {
D_Shift **shift;
unsigned char *scanner_block[SCANNER_BLOCKS];
} SB_uint8;
typedef struct SB_uint16 {
D_Shift **shift;
unsigned short *scanner_block[SCANNER_BLOCKS];
} SB_uint16;
typedef struct SB_uint32 {
D_Shift **shift;
unsigned int *scanner_block[SCANNER_BLOCKS];
} SB_uint32;
typedef struct SB_trans_uint8 {
unsigned char *scanner_block[SCANNER_BLOCKS];
} SB_trans_uint8;
typedef struct SB_trans_uint16 {
unsigned short *scanner_block[SCANNER_BLOCKS];
} SB_trans_uint16;
typedef struct SB_trans_uint32 {
unsigned int *scanner_block[SCANNER_BLOCKS];
} SB_trans_uint32;
#define D_SCAN_ALL 0
#define D_SCAN_LONGEST 1
#define D_SCAN_MIXED 2
#define D_SCAN_RESERVED 3
#define D_SCAN_DEFAULT D_SCAN_ALL
typedef struct D_State {
unsigned char *goto_valid;
int goto_table_offset;
struct {
unsigned int n;
D_Reduction **v;
} reductions;
struct {
unsigned int n;
D_RightEpsilonHint *v;
} right_epsilon_hints;
struct {
unsigned int n;
D_ErrorRecoveryHint *v;
} error_recovery_hints;
D_Shift **shifts;
D_ScanCode scanner_code;
void* scanner_table;
unsigned char scanner_size;
unsigned char accept;
unsigned char scan_kind;
void* transition_table;
D_Shift ***accepts_diff;
int reduces_to;
} D_State;
#define D_SHIFTS_CODE ((D_Shift**)-1)
#define D_SYMBOL_NTERM 1
#define D_SYMBOL_INTERNAL 2
#define D_SYMBOL_STRING 3
#define D_SYMBOL_REGEX 4
#define D_SYMBOL_CODE 5
#define D_SYMBOL_TOKEN 6
typedef struct D_Symbol {
unsigned int kind;
char *name;
int name_len;
} D_Symbol;
#define D_PASS_PRE_ORDER 0x0001
#define D_PASS_POST_ORDER 0x0002
#define D_PASS_MANUAL 0x0004
#define D_PASS_FOR_ALL 0x0008
#define D_PASS_FOR_UNDEFINED 0x0010
typedef struct D_Pass {
char *name;
unsigned int name_len;
unsigned int kind;
unsigned int index;
} D_Pass;
typedef struct D_ParserTables {
unsigned int nstates;
D_State *state;
unsigned short *goto_table;
unsigned int whitespace_state;
unsigned int nsymbols;
D_Symbol *symbols;
D_WhiteSpaceFn default_white_space;
unsigned int npasses;
D_Pass *passes;
unsigned int save_parse_tree;
} D_ParserTables;
#endif