ef2gamesource/dlls/game/compiler.h

200 lines
3.9 KiB
C++

//-----------------------------------------------------------------------------
//
// $Logfile:: /Code/DLLs/game/compiler.h $
// $Revision:: 4 $
// $Date:: 10/13/03 8:53a $
//
// Copyright (C) 1999 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
//
//
// DESCRIPTION:
//
//
// Form of for statement with a counter:
//
// a = 0;
// start: << patch4
// if ( !( a < 10 ) )
// {
// goto end; << patch1
// }
// else
// {
// goto process; << patch3
// }
//
// increment: << patch2
// a = a + 1;
// goto start; << goto patch4
//
// process:
// statements;
// goto increment; << goto patch2
//
// end:
//
// Form of for statement without a counter:
//
// a = 0;
// start: << patch2
// if ( !( a < 10 ) )
// {
// goto end; << patch1
// }
//
// process:
// statements;
// goto increment; << goto patch2
//
// end:
//
#ifndef __COMPILER_H__
#define __COMPILER_H__
#include "program.h"
#include "lexer.h"
#define MAX_ERRORS 10
typedef struct
{
int code; // first statement
char *file; // source file with definition
int file_line;
int parm_ofs[ MAX_PARMS ]; // allways contiguous, right?
} function_t;
typedef struct
{
const char *name;
const char *opname;
float priority;
bool right_associative;
def_t *type_a;
def_t *type_b;
def_t *type_c;
} opcode_t;
extern opcode_t pr_opcodes[ 99 ]; // sized by initialization
enum
{
OP_DONE,
OP_UINC_F,
OP_UDEC_F,
OP_MUL_F,
OP_MUL_V,
OP_MUL_FV,
OP_MUL_VF,
OP_DIV_F,
OP_ADD_F,
OP_ADD_V,
OP_ADD_S,
OP_ADD_FS,
OP_ADD_SF,
OP_ADD_VS,
OP_ADD_SV,
OP_SUB_F,
OP_SUB_V,
OP_EQ_F,
OP_EQ_V,
OP_EQ_S,
OP_EQ_E,
OP_EQ_FNC,
OP_NE_F,
OP_NE_V,
OP_NE_S,
OP_NE_E,
OP_NE_FNC,
OP_LE,
OP_GE,
OP_LT,
OP_GT,
OP_STORE_F,
OP_STORE_V,
OP_STORE_S,
OP_STORE_ENT,
OP_STORE_FNC,
OP_STORE_FTOS,
OP_UMUL_F,
OP_UDIV_F,
OP_UADD_F,
OP_USUB_F,
OP_UAND_F,
OP_UOR_F,
OP_RETURN,
OP_NOT_F,
OP_NOT_V,
OP_NOT_S,
OP_NOT_ENT,
OP_NOT_FNC,
OP_IF,
OP_IFNOT,
OP_CALL,
OP_OCALL,
OP_THREAD,
OP_PUSH_F,
OP_PUSH_V,
OP_PUSH_S,
OP_PUSH_ENT,
OP_PUSH_FNC,
OP_PUSH_FTOS,
OP_GOTO,
OP_AND,
OP_OR,
OP_BITAND,
OP_BITOR
};
class Compiler
{
public :
def_t *pr_scope; // the function being parsed, or NULL
Program &program;
Lexer lex;
bool callthread;
int filenumber;
Compiler( Program &prg );
def_t *Statement( const opcode_t *op, def_t *var_a, const def_t *var_b );
def_t *ParseImmediate( void );
def_t *ParseFunctionCall( def_t *func );
def_t *ParseObjectCall( def_t *func, def_t *object );
def_t *ParseValue( void );
def_t *Term( void );
def_t *Expression( int priority );
void ParseStatement( void );
function_t ParseImmediateStatements( const type_t *type, const char parm_names[ MAX_PARMS ][ MAX_NAME ], int numparms );
type_t *ParseFunction( type_t *returntype, char parm_names[ MAX_PARMS ][ MAX_NAME ], int *numparms );
void ParseFunctionDef( type_t *type, const char *name );
void ParseVariableDef( type_t *type, const char *name );
void ParseDefs( void );
//bool CompileFile( const char *text, const char *filename, int filenum );
bool CompileFile( const char *text, int filenum );
};
#endif