File:  [parser3project] / parser3 / src / main / compile_tools.h
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Wed Feb 21 07:31:41 2001 UTC (25 years, 3 months ago) by paf
Branches: MAIN
CVS tags: HEAD
error processing in eval & yyerror so it wouldn't cause memleaks.

/*
  $Id: compile_tools.h,v 1.5 2001/02/21 07:31:41 paf Exp $
*/

#ifndef COMPILE_TOOLS
#define COMPILE_TOOLS

#include "code.h"
#include "pa_types.h"

enum lexical_state {
	LS_USER,
	LS_VAR_NAME_SIMPLE,
	LS_VAR_NAME_CURLY,
	LS_VAR_ROUND,
	LS_VAR_CURLY,
	LS_METHOD_NAME,
	LS_METHOD_ROUND,
	LS_METHOD_CURLY,
	LS_METHOD_AFTER
};
struct parse_control {
	/* input */
	Pool *pool;
#ifndef NO_CSTRING_ORIGIN
	char *source;
	char *file;
	int line, col;
#endif
	/* state */
	int pending_state/*=0*/;
	String *string/*=new(pool) String(pool)*/;
	
#define MAX_LEXICAL_STATES 100
	enum lexical_state ls/*=LS_USER*/;
	int sp/*=0*/;
	enum lexical_state stack[MAX_LEXICAL_STATES];
	int brackets_nestages[MAX_LEXICAL_STATES];
	
	/* output: Array *  */
	Array *result;
	char error[MAX_STRING];
};

/* New array // return empty array */
inline Array/*<op>*/ *N(Pool *pool) {
	return new(*pool) Array/*<op>*/(*pool);
}

/* Assembler instruction // append ordinary instruction to ops */
inline void OP(Array/*<op>*/ *result, enum OPCODE code) {
	Operation op; op.code=code;
	*result+=op.cast;
}

/* Argument String // append String to ops*/
inline void AS(Array/*<op>*/ *result, String *string) {
	*result+=string;
}
/* Argument Array // append Array to ops */
inline void AA(Array/*<op>*/ *result, Array/*<op>*/ *array) {
	*result+=array;
}
/* Argument Eval_expression // append eval_expression to ops */
inline void AE(Array/*<op>*/ *result, char *eval_expression) {
	*result+=eval_expression;
}

inline void P(Array/*<op>*/ *result, Array *code_array) {
	result->append_array(*code_array);
}


/* Literal // returns array with 
// first: OP_STRING instruction
// second op: string itself
*/
Array *L(String *string);
/* Literal Array to(2) String // return string value from literal array OP+string array */
const String *LA2S(Array *literal_string_array);


void push_LS(struct parse_control *pc);
void pop_LS(struct parse_control *pc);

#endif

E-mail: