mirror of
https://github.com/UberGames/EF2GameSource.git
synced 2024-11-30 15:10:51 +00:00
199 lines
3.9 KiB
C++
199 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
|