Only 2 differences with original release: add return type to main int disassem.cpp popPosStack() add cast to intptr_t
138 lines
4.6 KiB
C
138 lines
4.6 KiB
C
/*
|
|
* File: ast.h
|
|
* Purpose: definition of the abstract syntax tree ADT.
|
|
* Date: September 1993
|
|
* (C) Cristina Cifuentes
|
|
*/
|
|
|
|
#define operandSize 20
|
|
|
|
/* The following definitions and types define the Conditional Expression
|
|
* attributed syntax tree, as defined by the following EBNF:
|
|
CondExp ::= CondTerm AND CondTerm | CondTerm
|
|
CondTerm ::= (CondFactor op CondFactor)
|
|
CondFactor ::= Identifier | ! CondFactor
|
|
Identifier ::= globalVar | register | localVar | parameter | constant
|
|
op ::= <= | < | = | != | > | >=
|
|
*/
|
|
|
|
/* Conditional Expression enumeration nodes and operators */
|
|
typedef enum {
|
|
BOOLEAN_OP, /* condOps */
|
|
NEGATION, /* not (2's complement) */
|
|
ADDRESSOF, /* addressOf (&) */
|
|
DEREFERENCE, /* contents of (*) */
|
|
IDENTIFIER, /* {register | local | param | constant | global} */
|
|
/* The following are only available to C programs */
|
|
POST_INC, /* ++ (post increment) */
|
|
POST_DEC, /* -- (post decrement) */
|
|
PRE_INC, /* ++ (pre increment) */
|
|
PRE_DEC, /* -- (pre decrement) */
|
|
} condNodeType;
|
|
|
|
typedef enum {
|
|
GLOB_VAR, /* global variable */
|
|
REGISTER, /* register */
|
|
LOCAL_VAR, /* negative disp */
|
|
PARAM, /* positive disp */
|
|
GLOB_VAR_IDX, /* indexed global variable *//*** should merge w/glob-var*/
|
|
CONSTANT, /* constant */
|
|
STRING, /* string */
|
|
LONG_VAR, /* long variable */
|
|
FUNCTION, /* function */
|
|
OTHER /* other **** tmp solution */
|
|
} condId;
|
|
|
|
typedef enum {
|
|
/* For conditional expressions */
|
|
LESS_EQUAL = 0, /* <= */
|
|
LESS, /* < */
|
|
EQUAL, /* == */
|
|
NOT_EQUAL, /* != */
|
|
GREATER, /* > */
|
|
GREATER_EQUAL, /* >= */
|
|
/* For general expressions */
|
|
AND, /* & */
|
|
OR, /* | */
|
|
XOR, /* ^ */
|
|
NOT, /* ~ */ /* 1's complement */
|
|
ADD, /* + */
|
|
SUB, /* - */
|
|
MUL, /* * */
|
|
DIV, /* / */
|
|
SHR, /* >> */
|
|
SHL, /* << */
|
|
MOD, /* % */
|
|
DBL_AND, /* && */
|
|
DBL_OR, /* || */
|
|
DUMMY, /* */
|
|
} condOp;
|
|
|
|
/* High-level BOOLEAN conditions for iJB..iJNS icodes */
|
|
static condOp condOpJCond[12] = {LESS, LESS_EQUAL, GREATER_EQUAL, GREATER,
|
|
EQUAL, NOT_EQUAL, LESS, GREATER_EQUAL,
|
|
LESS_EQUAL, GREATER, GREATER_EQUAL, LESS};
|
|
|
|
static condOp invCondOpJCond[12] = {GREATER_EQUAL, GREATER, LESS, LESS_EQUAL,
|
|
NOT_EQUAL, EQUAL, GREATER_EQUAL, LESS,
|
|
GREATER, LESS_EQUAL, LESS, GREATER_EQUAL};
|
|
|
|
|
|
/* Register types */
|
|
typedef enum {
|
|
BYTE_REG, WORD_REG
|
|
} regType;
|
|
|
|
|
|
typedef struct
|
|
{
|
|
condId idType;
|
|
regType regiType; /* for REGISTER only */
|
|
union _idNode {
|
|
Int regiIdx; /* index into localId, REGISTER */
|
|
Int globIdx; /* index into symtab for GLOB_VAR */
|
|
Int localIdx; /* idx into localId, LOCAL_VAR */
|
|
Int paramIdx; /* idx into args symtab, PARAMS */
|
|
Int idxGlbIdx; /* idx into localId, GLOB_VAR_IDX */
|
|
struct _kte { /* for CONSTANT only */
|
|
dword kte; /* value of the constant */
|
|
byte size; /* #bytes size constant */
|
|
} kte;
|
|
dword strIdx; /* idx into image, for STRING */
|
|
Int longIdx; /* idx into LOCAL_ID table, LONG_VAR*/
|
|
struct _call { /* for FUNCTION only */
|
|
struct _proc *proc;
|
|
struct _STKFRAME *args;
|
|
} call;
|
|
struct { /* for OTHER; tmp struct */
|
|
byte seg; /* segment */
|
|
byte regi; /* index mode */
|
|
int16 off; /* offset */
|
|
} other;
|
|
} idNode;
|
|
} IDENTTYPE;
|
|
|
|
|
|
/* Expression data type */
|
|
typedef struct _condExpr {
|
|
condNodeType type; /* Conditional Expression Node Type */
|
|
union _exprNode { /* Different cond expr nodes */
|
|
struct { /* for BOOLEAN_OP */
|
|
condOp op;
|
|
struct _condExpr *lhs;
|
|
struct _condExpr *rhs;
|
|
} boolExpr;
|
|
struct _condExpr *unaryExp; /* for NEGATION,ADDRESSOF,DEREFERENCE*/
|
|
IDENTTYPE ident; /* for IDENTIFIER */
|
|
} expr;
|
|
} COND_EXPR;
|
|
|
|
/* Sequence of conditional expression data type */
|
|
/*** NOTE: not used at present ****/
|
|
typedef struct _condExpSeq {
|
|
COND_EXPR *expr;
|
|
struct _condExpSeq *next;
|
|
} SEQ_COND_EXPR;
|
|
|
|
|