| home
| contents
| previous
| next page
| send comment
| send link
| add bookmark |
TPL_DATA.H
common declarations
/*-------------------------------------------------------------------*
Common Declarations
File: tpl_data.h
Module: common
by: Stephen R. Schmitt
*-------------------------------------------------------------------*/
/*
* define DEBUG for debugging
*/
//#define DEBUG
#ifdef DEBUG
#define D(x) x
#else
#define NDEBUG // assert() not compiled
#define D(x)
#endif
/*
* Defined constants
*/
#define EOF_CHAR 3
#define CR_CHAR 13
#define LF_CHAR 10
#define TAB_CHAR 9
#define FF_CHAR 12
#define BS_CHAR 8
#define TAB_SIZE 8
#define MIN_KEY_WORD_LENGTH 2
#define MAX_KEY_WORD_LENGTH 10
#define MAX_FILES 16
#define FILE_NAME_LENGTH 32
#define TOKEN_STRING_LENGTH 64
#define SIGNATURE 11111
#define NESTING_LEVELS 16
#define MAX_STRING_LENGTH 255
#define MAX_STACK_SIZE 512
#define MAX_CODE_SIZE 1024
#define MAX_CODE_SEGMENTS 1024
#define MAX_LABELS 1024
#ifdef DEBUG
#define MAX_ARRAY_SIZE 1024
#define MAX_DATA_SIZE 1024
#else
#define MAX_ARRAY_SIZE 4096
#define MAX_DATA_SIZE 8191
#endif
#define MAX_BREAKS 8
#define SCREEN_TOP 2
#define SCREEN_BOTTOM 25
typedef enum
{
false = 0, true = 1
}
bool;
struct line
{
struct line *prev;
struct line *next;
char *string;
};
/*--------------------------------------------------------------------*
Token structure
*--------------------------------------------------------------------*/
typedef enum
{
NO_TOKEN, ID_TOKEN, INT_TOKEN, REAL_TOKEN,
STR_TOKEN, CHAR_TOKEN, END_OF_FILE, ERR_TOKEN,
COMMA, PERIOD, ELLIPSES, COLON, AMPERSAND,
ASSIGN, PLUS, MINUS, STAR, SLASH, CARET,
EQ, NE, LT, LE, GT, GE,
L_PAREN, R_PAREN,
ABS, AND, ARCCOS, ARCSIN, ARCTAN, ARCTANXY, ARRAY, ASSERT,
BOOLEAN,
CASE, CEIL, CHAR, CHR, CLOSE, CONST, CONTINUE, COS, COSH, CURSOR,
DECREASING, DIV, DO,
ELSE, ELSIF, END, ENUM, EOFF, EREALSTR, EXIT, EXP,
FALSE, FLOOR, FOR, FREALSTR, FUNCTION,
GET, GETEXP, GETKEY, GOTO,
IF, INCLUDE, INDEX, INT, INTREAL, INTSTR,
LABEL, LENGTH, LN, LOCATE, LOG2, LOG10, LOOP,
MAX, MIN, MOD,
NAND, NOR, NOT,
OF, OPEN, OR, ORD,
PRED, PROCEDURE, PROGRAM, PUT, PUTCH, PUTSTR, PUTLINE, PUTPIXEL,
RAND, RANDINT, RANDOMIZE, RANDSEED, REAL, REALSTR,
RECORD, REPEAT, RETURN, ROUND,
SCROLL, SETEXP, SETVIDEO, SIGN, SIN, SINH, SQRT,
STRING, STRINT, STRREAL, SUCC,
TAN, TANH, THEN,
TRUE, TYPE,
UNION,
VALUE, VAR, VIDEOMODE, VIDEOTYPE,
WATCH, WHEN,
XOR
}
TOKEN_CODE;
struct token_struct
{
TOKEN_CODE code;
union
{
long integer;
double real;
char lexeme[ MAX_STRING_LENGTH + 1];
};
char file[ FILE_NAME_LENGTH];
int line;
int column;
};
/*--------------------------------------------------------------------*
Symbol table
*--------------------------------------------------------------------*/
typedef enum
{
NO_FORM,
SCALER_FORM, STRING_FORM, ENUM_FORM,
ARRAY_FORM, RECORD_FORM, UNION_FORM
}
TYPE_FORM;
typedef struct type_struct
{
TYPE_FORM form;
int size;
struct symtab_node *type_idp;
union
{
struct
{
int max;
struct symtab_node *field_symtab;
struct symtab_node *first_idp;
}
enumeration;
struct
{
int max_index;
int val_index;
struct type_struct *next_indexp;
struct type_struct *elmt_typep;
}
array;
struct
{
struct symtab_node *field_symtab;
}
record_struct;
struct
{
struct symtab_node *field_symtab;
}
union_struct;
};
}
TYPE_STRUCT, *TYPE_STRUCT_PTR;
typedef enum
{
UNDEFINED,
CONST_DEFN, TYPE_DEFN, VAR_DEFN, LABEL_DEFN,
FIELD_DEFN, VALPARM_DEFN, VARPARM_DEFN,
MAIN_DEFN, PROG_DEFN, PROC_DEFN, FUNC_DEFN,
}
DEFN_KEY;
typedef struct symtab_node
{
symtab_node *left; // ptr to left node
symtab_node *right; // ptr to right node
symtab_node *next; // ptr to next node
symtab_node *prev; // ptr to previous node
char *name; // ptr to id name string
TYPE_STRUCT_PTR typep; // ptr to id type struct
DEFN_KEY definition; // type definition
union // type definition info
{
int integer; // enum value
int data_offset; // offset of record field
struct
{
int parm_count; // of formal parameters
int segment; // segment number
char file[FILE_NAME_LENGTH]; // file declared in
int line; // line declared on
}
routine;
};
bool initialized; // true if assigned to
}
SYMTAB_NODE, *SYMTAB_NODE_PTR;
/*--------------------------------------------------------------------*
Intermediate code
*--------------------------------------------------------------------*/
typedef enum
{
NO_CODE, STATEMENT, EXITZ, SKIP, UNSKIP,
PUSH, POP, REG_BP, ADDR, ADDR_ADDR,
IMM_64, IMM_32, IMM_16, IMM_8, IMM_STR,
MEM_64, MEM_32, MEM_16, MEM_8, MEM_STR,
MEM_64_xi, MEM_32_xi, MEM_16_xi, MEM_8_xi,
MEM_STR_8_xi, MEM_STR_xi,
PTR_64, PTR_32, PTR_16, PTR_8, PTR_STR,
PTR_64_xi, PTR_32_xi, PTR_16_xi, PTR_8_xi,
PTR_STR_8_xi, PTR_STR_xi,
INC_sp, INC_sp_string, DEC_sp, DEC_sp_string,
ADD_xi_offset, ADD_xi_imm,
MOV_ax_imm, MOV_bx_imm,
MOV_bp_sp,
PUT_str, GET_str, GET_item,
FORMAT_STR, FORMAT_CHR, FORMAT_INDEX,
SET_file_ptr, SET_stdin, SET_stdout, FLUSH_stdin,
RMUL, RDIV, RADD, RSUB, RNEG, RPOW,
IMUL, IDIV, IADD, ISUB, INEG, IPOW, IMOD,
STRCAT,
TEST_INDEX, TEST_NUMBER, TEST_STRING, TEST_CHAR,
TEST_EQ, TEST_NE, TEST_GT, TEST_GE, TEST_LT, TEST_LE,
LOGIC_OR, LOGIC_AND, LOGIC_NOT,
LOGIC_NOR, LOGIC_NAND, LOGIC_XOR,
JMP, JNZ, JZ,
CALL, RETF, CALL_stnd, RETP,
SF_ARCCOS, SF_ARCSIN, SF_ARCTAN, SF_COS, SF_COSH,
SP_CURSOR, SF_GETKEY,
SF_EXP, SF_GETEXP, SF_LN, SF_LOG2, SF_LOG10,
SF_SIN, SF_SINH, SF_SQRT,
SF_TAN, SF_TANH,
SF_ABS, SF_ARCTANXY,
SF_CEIL, SF_FLOOR, SF_ROUND, SF_SIGN,
SF_CHR, SF_CLOSE, SF_EOFF,
SF_EREALSTR, SF_FREALSTR,
SF_INDEX, SF_INTREAL, SF_INTSTR, SF_LENGTH, SP_LOCATE,
SF_ORD, SF_MAX, SF_MIN, SF_OPEN,
SP_PUTCH, SP_PUTSTR, SP_PUTLINE, SP_PUTPIXEL,
SF_PRED, SF_SUCC,
SF_RAND, SF_RANDINT, SP_RANDOMIZE, SP_RANDSEED,
SF_REALSTR, SF_REPEAT,
SP_SCROLL, SF_SETEXP, SP_SETVIDEO, SF_STRINT, SF_STRREAL,
SF_VIDEOMODE, SF_VIDEOTYPE,
SP_WATCH
}
OPCODE;
typedef struct memory_item
{
union
{
struct
{
OPCODE code1;
OPCODE code2;
int segment;
int offset;
}
op;
double real;
long integer;
int index;
char byte;
struct
{
char *ptr;
int len;
int sig;
}
string;
struct
{
int segment;
int offset;
int ax, // index value register
bx; // base index register
}
address;
};
}
MEMORY, *MEMORY_PTR;
/*--------------------------------------------------------------------*
Error module
*--------------------------------------------------------------------*/
typedef enum
{
M_0 = 0,
M_COMMA, M_PERIOD, M_ELLIPSES,
M_LPAREN, M_RPAREN, M_COLON, M_ASSIGN,
M_ARGUMENT, M_ARRAY, M_ASSIGNMENT,
M_BY,
M_CASE, M_CODE, M_CONSTANT, M_CONTEXT,
M_DATA, M_DEEP, M_DIVISION, M_DO,
M_END, M_ERROR,
M_FAILED, M_FIELD, M_FILE,
M_FOR, M_FUNCTION,
M_IDENTIFIER, M_IF, M_INCOMPATIBLE,
M_INTEGER, M_INVALID, M_ITEM,
M_LABEL, M_LABELS, M_LARGE, M_LOOP,
M_MANY, M_MEMORY, M_MISSING,
M_NESTING, M_NOT, M_NUMBER,
M_OF, M_OPEN, M_OUT, M_OVERFLOW,
M_PARAMETER, M_PARAMETERS, M_PROGRAM,
M_RANGE, M_REAL, M_RECORD, M_REDEFINED, M_RETURN,
M_SEGMENT, M_STACK, M_SUBSCRIPTS, M_SYNTAX,
M_THEN, M_TOO, M_TYPE, M_TYPES,
M_UNDEFINED, M_UNDERFLOW, M_UNION, M_USAGE,
M_VALUE, M_VARIABLE,
M_WRONG,
M_ZERO,
}
MSG_CODE;
#ifdef DEBUG
#define incr_sptr() if(++SPtr >= MAX_STACK_SIZE) \
runtime_error(M_STACK, M_OVERFLOW, M_0)
#define decr_sptr() if(--SPtr < 0) \
runtime_error(M_STACK, M_UNDERFLOW, M_0)
#else
#define incr_sptr() ++SPtr
#define decr_sptr() --SPtr
#endif
#define int_to_real() \
SSeg[SPtr].real = (double) SSeg[SPtr].integer
#define real_to_int() \
SSeg[SPtr].integer = (long) SSeg[SPtr].real
/*
* declarations in exc_dbug.cpp
*/
void init_debugger();
void read_debugger_command();
bool execute_debugger_command(unsigned char);
void trace_statement_execution(char *, int);
void set_breakpoint();
void remove_breakpoint();
void clear_breakpoints();
void write_watch(char *);
void help();
void up_arrow();
void page_up();
void down_arrow();
void page_down();
void goto_end_of_file();
void goto_start_of_file();
int read_key();
void goto_next_source(char*);
void goto_next_statement(int);
void load_source_file();
void write_source_line(struct line *, int);
void write_source_screen(struct line *, int);
void single_box_window(int, int, int, int, int, int);
void restore_debug_window();
/*
* declarations in exc_main.cpp
*/
void interpret();
void push();
void pop();
void add_xi_offset();
void put_str();
void get_str();
void get_item();
void format_str();
void format_chr();
void format_index();
void new_string();
void delete_string();
void ipow();
void str_cat();
void test();
void logic();
void debug_to_user_screen();
void user_to_debug_screen();
void write_to_user_screen(char *);
void move_up_user_screen();
/*
* declarations in exc_stnd.cpp
*/
void standard_routine();
void sf_close();
void sp_cursor();
void sf_eoff();
void sf_erealstr();
void sf_frealstr();
void sf_getkey();
void sf_index();
void sf_intstr();
void sp_locate();
void sf_open();
void sp_putch();
void sp_putstr();
void sp_putpixel();
void sp_putline();
void sf_realstr();
void sf_repeat();
void sp_scroll();
void sf_setexp();
void sp_setvideo();
void sf_strint();
void sf_strreal();
void sf_videomode();
void sf_videotype();
void pixel(int, int, int);
/*
* declarations in prs_decl.cpp
*/
void declaration();
void const_definition();
void var_declaration();
void type_definition();
void label_declaration();
TYPE_STRUCT_PTR do_type();
TYPE_STRUCT_PTR named_type(SYMTAB_NODE_PTR);
TYPE_STRUCT_PTR string_type();
TYPE_STRUCT_PTR enumeration_type();
TYPE_STRUCT_PTR array_type();
int get_array_index(TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR record_type();
TYPE_STRUCT_PTR union_type();
void get_record_fields(TYPE_STRUCT_PTR);
void get_union_fields(TYPE_STRUCT_PTR);
void push_int_stack(int);
int pop_int_stack();
/*
* declarations in prs_emit.cpp
*/
void init_emit();
void exit_emit();
void init_code_segment();
void emit_code_segment(SYMTAB_NODE_PTR);
void fixup_code_buffer_addresses(int);
void emit_operator(OPCODE, OPCODE, int, int);
void emit_op_reg_imm(OPCODE, int);
void emit_index(int);
void emit_integer(long);
void emit_real(double);
void emit_string(char *);
void emit_code_label(int);
int next_code_label();
void emit_statement_marker(char *, int);
void emit_push_imm_real(double);
void emit_push_imm_integer(long);
void emit_push_imm_index(int);
void emit_push_imm_char(char);
void emit_push_imm_string(char *);
void emit_push_address(SYMTAB_NODE_PTR);
void emit_mem_item(OPCODE, SYMTAB_NODE_PTR, TYPE_STRUCT_PTR);
void emit_var_item(OPCODE, SYMTAB_NODE_PTR, TYPE_STRUCT_PTR);
void emit_return_value(SYMTAB_NODE_PTR);
int find_offset(SYMTAB_NODE_PTR);
int find_segment(SYMTAB_NODE_PTR);
void emit_alloc_data(SYMTAB_NODE_PTR);
void emit_alloc_array(TYPE_STRUCT_PTR);
void emit_alloc_record(TYPE_STRUCT_PTR);
void emit_alloc_union(TYPE_STRUCT_PTR);
void emit_pop_local_parm(SYMTAB_NODE_PTR);
void emit_pop_formal_parm(SYMTAB_NODE_PTR);
void delete_data(SYMTAB_NODE_PTR);
void delete_array(TYPE_STRUCT_PTR);
void delete_record(TYPE_STRUCT_PTR);
void delete_union(TYPE_STRUCT_PTR);
#ifdef DEBUG
void list_segment(SYMTAB_NODE_PTR);
#endif
/*
* declarations in prs_expr.cpp
*/
TYPE_STRUCT_PTR string_expression();
TYPE_STRUCT_PTR boolean_expression();
TYPE_STRUCT_PTR boolean_term();
TYPE_STRUCT_PTR boolean_factor();
TYPE_STRUCT_PTR expression();
TYPE_STRUCT_PTR term();
TYPE_STRUCT_PTR factor();
TYPE_STRUCT_PTR value(SYMTAB_NODE_PTR);
TYPE_STRUCT_PTR string_subscript(TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR array_subscript_list(TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR dot_field(TYPE_STRUCT_PTR);
void get_integer_expression();
TYPE_STRUCT_PTR get_number_expression();
TYPE_STRUCT_PTR int_expression();
TYPE_STRUCT_PTR int_term();
TYPE_STRUCT_PTR int_factor();
/*
* declarations in prs_main.cpp
*/
void pass_one();
void pass_two();
void program_header();
void program_body();
void procedure_header();
void procedure_body();
void function_header();
void function_body();
int formal_parameters();
TYPE_STRUCT_PTR declared_routine_call(SYMTAB_NODE_PTR);
void actual_parameters(SYMTAB_NODE_PTR);
void parse_block(SYMTAB_NODE_PTR,
TOKEN_CODE[], TOKEN_CODE[], TOKEN_CODE[]);
/*
* declarations in prs_stmt.cpp
*/
void statement(SYMTAB_NODE_PTR);
void assignment_statement(SYMTAB_NODE_PTR);
TYPE_STRUCT_PTR target_variable(SYMTAB_NODE_PTR);
TYPE_STRUCT_PTR target_string_char(TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR target_array_element(TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR target_structure_field(TYPE_STRUCT_PTR);
void loop_statement(SYMTAB_NODE_PTR);
void for_statement(SYMTAB_NODE_PTR);
void if_statement(SYMTAB_NODE_PTR);
void case_statement(SYMTAB_NODE_PTR);
TYPE_STRUCT_PTR case_label();
void assert_statement();
void continue_statement();
void exit_statement();
void goto_statement();
void label_statement(SYMTAB_NODE_PTR);
void get_statement();
void put_statement();
void return_statement(SYMTAB_NODE_PTR);
void incr_level(TOKEN_CODE, int, int);
void decr_level();
bool in_for_or_loop_construct();
int for_or_loop_end_label();
/*
* declarations in prs_stnd.cpp
*/
TYPE_STRUCT_PTR standard_routine_call();
TYPE_STRUCT_PTR real_into_real();
TYPE_STRUCT_PTR abs_func();
TYPE_STRUCT_PTR arctanxy_func();
TYPE_STRUCT_PTR real_into_integer();
TYPE_STRUCT_PTR chr_func();
TYPE_STRUCT_PTR erealstr_func();
TYPE_STRUCT_PTR file_func();
TYPE_STRUCT_PTR frealstr_func();
TYPE_STRUCT_PTR index_func();
TYPE_STRUCT_PTR intreal_func();
TYPE_STRUCT_PTR intstr_func();
TYPE_STRUCT_PTR length_func();
TYPE_STRUCT_PTR max_min_func();
TYPE_STRUCT_PTR open_func();
TYPE_STRUCT_PTR ord_func();
TYPE_STRUCT_PTR pred_succ_func();
TYPE_STRUCT_PTR rand_func();
TYPE_STRUCT_PTR randint_func();
TYPE_STRUCT_PTR randomize_proc();
TYPE_STRUCT_PTR randseed_proc();
TYPE_STRUCT_PTR realstr_func();
TYPE_STRUCT_PTR repeat_func();
TYPE_STRUCT_PTR setexp_func();
TYPE_STRUCT_PTR string_into_number();
TYPE_STRUCT_PTR watch_proc();
TYPE_STRUCT_PTR putch_proc();
TYPE_STRUCT_PTR putstr_proc();
TYPE_STRUCT_PTR cursor_proc();
TYPE_STRUCT_PTR getkey_func();
TYPE_STRUCT_PTR locate_proc();
TYPE_STRUCT_PTR scroll_proc();
TYPE_STRUCT_PTR putline_proc();
TYPE_STRUCT_PTR putpixel_proc();
TYPE_STRUCT_PTR setvideo_proc();
TYPE_STRUCT_PTR video_func();
/*
* declarations in scn_main.cpp
*/
bool init_scanner(char *);
bool open_source_file(char *);
void quit_scanner();
void get_char();
void get_token();
void get_next_token();
void get_word();
bool is_key_word();
void get_number();
void get_string();
void get_character();
int get_backslash(int);
void get_special();
bool token_in(TOKEN_CODE[]);
void synchronize(TOKEN_CODE[], TOKEN_CODE[], TOKEN_CODE[]);
bool get_source_line();
void include_file();
void delete_file();
void if_code_get_token_else_error(TOKEN_CODE);
/*
* declarations in sym_tabl.cpp
*/
void init_symtab();
SYMTAB_NODE_PTR lookup(char *, SYMTAB_NODE_PTR);
SYMTAB_NODE_PTR search_symbol_tables(char *);
SYMTAB_NODE_PTR insert(char *, SYMTAB_NODE_PTR *);
void incr_scope();
void decr_scope();
bool assign_type_compatible(TYPE_STRUCT_PTR, TYPE_STRUCT_PTR);
TYPE_STRUCT_PTR make_string_type_ptr(int);
TYPE_STRUCT_PTR alloc_type_struct();
/*
* declarations in tpl_main.cpp
*/
void init_interpreter(int, char *, char *);
void exit_interpreter();
void compile_error(MSG_CODE code, ...);
void runtime_error(MSG_CODE code, ...);
void errm_fopen();
void errm_fclose();
void save_video_mode();
void restore_video_mode();
#ifdef DEBUG
void list_fopen();
void list_fclose();
#else
#define list_fopen()
#define list_fclose()
#endif
| home
| contents
| previous
| next page
| send comment
| send link
| add bookmark |
Copyright © 2004, Stephen R. Schmitt