*** empty log message ***

This commit is contained in:
hyung-hwan 2006-04-02 12:45:04 +00:00
parent fa776e0098
commit 29bb43c1e5
12 changed files with 437 additions and 185 deletions

View File

@ -1,17 +1,17 @@
LIBRARY "xpawk.dll" LIBRARY "xpawk.dll"
EXPORTS EXPORTS
xp_awk_open PRIVATE xp_awk_open
xp_awk_close PRIVATE xp_awk_close
xp_awk_geterrnum PRIVATE xp_awk_geterrnum
xp_awk_geterrstr PRIVATE xp_awk_geterrstr
xp_awk_clear PRIVATE xp_awk_clear
xp_awk_setparseopt PRIVATE xp_awk_setparseopt
xp_awk_attsrc PRIVATE xp_awk_attsrc
xp_awk_detsrc PRIVATE xp_awk_detsrc
xp_awk_parse PRIVATE xp_awk_parse
xp_awk_run PRIVATE xp_awk_run

View File

@ -149,10 +149,6 @@ SOURCE=.\awk_i.h
# End Source File # End Source File
# Begin Source File # Begin Source File
SOURCE=.\err.h
# End Source File
# Begin Source File
SOURCE=.\map.h SOURCE=.\map.h
# End Source File # End Source File
# Begin Source File # Begin Source File

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.39 2006-03-31 16:35:37 bacon Exp $ * $Id: awk.h,v 1.40 2006-04-02 12:41:14 bacon Exp $
*/ */
#ifndef _XP_AWK_AWK_H_ #ifndef _XP_AWK_AWK_H_
@ -31,6 +31,41 @@ enum
XP_AWK_SHIFT = (1 << 4) /* support shift operators */ XP_AWK_SHIFT = (1 << 4) /* support shift operators */
}; };
/* error code */
enum
{
XP_AWK_ENOERR, /* no error */
XP_AWK_ENOMEM, /* out of memory */
XP_AWK_ESRCOP,
XP_AWK_ESRCCL,
XP_AWK_ESRCDT, /* error in reading source */
XP_AWK_ELXCHR, /* lexer came accross an wrong character */
XP_AWK_ELXUNG, /* lexer failed to unget a character */
XP_AWK_EENDSRC, /* unexpected end of source */
XP_AWK_ELBRACE, /* left brace expected */
XP_AWK_ELPAREN, /* left parenthesis expected */
XP_AWK_ERPAREN, /* right parenthesis expected */
XP_AWK_ERBRACK, /* right bracket expected */
XP_AWK_ECOMMA, /* comma expected */
XP_AWK_ESEMICOLON, /* semicolon expected */
XP_AWK_EEXPRESSION, /* expression expected */
XP_AWK_EWHILE, /* keyword 'while' is expected */
XP_AWK_EASSIGNMENT, /* assignment statement expected */
XP_AWK_EIDENT, /* identifier expected */
XP_AWK_EDUPBEGIN, /* duplicate BEGIN */
XP_AWK_EDUPEND, /* duplicate END */
XP_AWK_EDUPFUNC, /* duplicate function name */
XP_AWK_EDUPPARAM, /* duplicate parameter name */
XP_AWK_EDUPVAR, /* duplicate variable name */
XP_AWK_EDUPNAME, /* duplicate name - function, variable, etc */
XP_AWK_EUNDEF, /* undefined identifier */
XP_AWK_ELVALUE /* l-value required */
};
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif

View File

@ -1,12 +1,11 @@
/* /*
* $Id: awk_i.h,v 1.1 2006-03-31 16:35:37 bacon Exp $ * $Id: awk_i.h,v 1.2 2006-04-02 12:41:14 bacon Exp $
*/ */
#ifndef _XP_AWK_AWKI_H_ #ifndef _XP_AWK_AWKI_H_
#define _XP_AWK_AWKI_H_ #define _XP_AWK_AWKI_H_
#include <xp/awk/awk.h> #include <xp/awk/awk.h>
#include <xp/awk/err.h>
#include <xp/awk/tree.h> #include <xp/awk/tree.h>
#include <xp/awk/tab.h> #include <xp/awk/tab.h>
#include <xp/awk/map.h> #include <xp/awk/map.h>

View File

@ -1,5 +1,5 @@
/* /*
* $Id: err.c,v 1.2 2006-03-31 16:35:37 bacon Exp $ * $Id: err.c,v 1.3 2006-04-02 12:41:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -37,7 +37,8 @@ const xp_char_t* xp_awk_geterrstr (xp_awk_t* awk)
XP_TEXT("duplicate parameter name"), XP_TEXT("duplicate parameter name"),
XP_TEXT("duplicate variable name"), XP_TEXT("duplicate variable name"),
XP_TEXT("duplicate name"), XP_TEXT("duplicate name"),
XP_TEXT("undefined identifier") XP_TEXT("undefined identifier"),
XP_TEXT("l-value required")
}; };
if (awk->errnum >= 0 && awk->errnum < xp_countof(__errstr)) { if (awk->errnum >= 0 && awk->errnum < xp_countof(__errstr)) {

View File

@ -1,45 +0,0 @@
/*
* $Id: err.h,v 1.2 2006-03-04 15:54:37 bacon Exp $
*/
#ifndef _XP_AWK_ERR_H_
#define _XP_AWK_ERR_H_
#ifndef _XP_AWK_AWK_H_
#error Never include this file directly. Include <xp/awk/awk.h> instead
#endif
enum
{
XP_AWK_ENOERR, /* no error */
XP_AWK_ENOMEM, /* out of memory */
XP_AWK_ESRCOP,
XP_AWK_ESRCCL,
XP_AWK_ESRCDT, /* error in reading source */
XP_AWK_ELXCHR, /* lexer came accross an wrong character */
XP_AWK_ELXUNG, /* lexer failed to unget a character */
XP_AWK_EENDSRC, /* unexpected end of source */
XP_AWK_ELBRACE, /* left brace expected */
XP_AWK_ELPAREN, /* left parenthesis expected */
XP_AWK_ERPAREN, /* right parenthesis expected */
XP_AWK_ERBRACK, /* right bracket expected */
XP_AWK_ECOMMA, /* comma expected */
XP_AWK_ESEMICOLON, /* semicolon expected */
XP_AWK_EEXPRESSION, /* expression expected */
XP_AWK_EWHILE, /* keyword 'while' is expected */
XP_AWK_EASSIGNMENT, /* assignment statement expected */
XP_AWK_EIDENT, /* identifier expected */
XP_AWK_EDUPBEGIN, /* duplicate BEGIN */
XP_AWK_EDUPEND, /* duplicate END */
XP_AWK_EDUPFUNC, /* duplicate function name */
XP_AWK_EDUPPARAM, /* duplicate parameter name */
XP_AWK_EDUPVAR, /* duplicate variable name */
XP_AWK_EDUPNAME, /* duplicate name - function, variable, etc */
XP_AWK_EUNDEF /* undefined identifier */
};
#endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.67 2006-03-31 16:35:37 bacon Exp $ * $Id: parse.c,v 1.68 2006-04-02 12:41:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -126,6 +126,7 @@ static xp_awk_nde_t* __parse_shift (xp_awk_t* awk);
static xp_awk_nde_t* __parse_additive (xp_awk_t* awk); static xp_awk_nde_t* __parse_additive (xp_awk_t* awk);
static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk); static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk);
static xp_awk_nde_t* __parse_unary (xp_awk_t* awk); static xp_awk_nde_t* __parse_unary (xp_awk_t* awk);
static xp_awk_nde_t* __parse_increment (xp_awk_t* awk);
static xp_awk_nde_t* __parse_primary (xp_awk_t* awk); static xp_awk_nde_t* __parse_primary (xp_awk_t* awk);
static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name); static xp_awk_nde_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name);
static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name); static xp_awk_nde_t* __parse_funcall (xp_awk_t* awk, xp_char_t* name);
@ -1262,98 +1263,100 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk)
}; };
return __parse_binary_expr (awk, map, __parse_unary); return __parse_binary_expr (awk, map, __parse_unary);
#if 0
xp_awk_nde_exp_t* nde;
xp_awk_nde_t* left, * right;
int opcode;
left = __parse_unary (awk);
if (left == XP_NULL) return XP_NULL;
while (1)
{
if (MATCH(awk,TOKEN_MUL)) opcode = XP_AWK_BINOP_MUL;
else if (MATCH(awk,TOKEN_DIV)) opcode = XP_AWK_BINOP_DIV;
else if (MATCH(awk,TOKEN_MOD)) opcode = XP_AWK_BINOP_MOD;
else break;
if (__get_token(awk) == -1)
{
xp_awk_clrpt (left);
return XP_NULL;
}
right = __parse_unary (awk);
if (right == XP_NULL)
{
xp_awk_clrpt (left);
return XP_NULL;
}
/* TODO: enhance constant folding. do it in a better way */
/* TODO: differentiate different types of numbers ... */
if (left->type == XP_AWK_NDE_INT &&
right->type == XP_AWK_NDE_INT)
{
xp_long_t l, r;
l = ((xp_awk_nde_int_t*)left)->val;
r = ((xp_awk_nde_int_t*)right)->val;
xp_awk_clrpt (right);
if (opcode == XP_AWK_BINOP_MUL) l *= r;
else if (opcode == XP_AWK_BINOP_DIV) l /= r;
else if (opcode == XP_AWK_BINOP_MOD) l %= r;
((xp_awk_nde_int_t*)left)->val = l;
continue;
}
/* TODO:
else if (left->type == XP_AWK_NDE_REAL &&
right->type == XP_AWK_NDE_REAL)
{
}
else if (left->type == XP_AWK_NDE_STR &&
right->type == XP_AWK_NDE_STR)
{
// TODO: string concatenation operator....
}
*/
nde = (xp_awk_nde_exp_t*)xp_malloc(xp_sizeof(xp_awk_nde_exp_t));
if (nde == XP_NULL)
{
xp_awk_clrpt (right);
xp_awk_clrpt (left);
PANIC (awk, XP_AWK_ENOMEM);
}
nde->type = XP_AWK_NDE_EXP_BIN;
nde->next = XP_NULL;
nde->opcode = opcode;
nde->left = left;
nde->right = right;
left = (xp_awk_nde_t*)nde;
}
return left;
#endif
} }
static xp_awk_nde_t* __parse_unary (xp_awk_t* awk) static xp_awk_nde_t* __parse_unary (xp_awk_t* awk)
{ {
// TOKEN_PLUS_PLUS, TOKEN_MINUS_MINUS xp_awk_nde_exp_t* nde;
//TODO: xp_awk_nde_t* left;
/* int opcode;
while (MATCH(awk,TOKEN_PLUS) || MATCH(awk,TOKEN_MINUS) ||
MATCH(awk,TOKEN_NOT) || MATCH(awk,TOKEN_BNOT))
{
}
*/
return __parse_primary (awk); opcode = (MATCH(awk,TOKEN_PLUS))? XP_AWK_UNROP_PLUS:
(MATCH(awk,TOKEN_MINUS))? XP_AWK_UNROP_MINUS:
(MATCH(awk,TOKEN_NOT))? XP_AWK_UNROP_NOT:
(MATCH(awk,TOKEN_BNOT))? XP_AWK_UNROP_BNOT: -1;
if (opcode == -1) return __parse_increment (awk);
if (__get_token(awk) == -1) return XP_NULL;
left = __parse_unary (awk);
if (left == XP_NULL) return XP_NULL;
nde = (xp_awk_nde_exp_t*)
xp_malloc (xp_sizeof(xp_awk_nde_exp_t));
if (nde == XP_NULL)
{
xp_awk_clrpt (left);
PANIC (awk, XP_AWK_ENOMEM);
}
nde->type = XP_AWK_NDE_EXP_UNR;
nde->next = XP_NULL;
nde->opcode = opcode;
nde->left = left;
nde->right = XP_NULL;
return (xp_awk_nde_t*)nde;
}
static xp_awk_nde_t* __parse_increment (xp_awk_t* awk)
{
xp_awk_nde_exp_t* nde;
xp_awk_nde_t* left;
int type, opcode, opcode1, opcode2;
opcode1 = MATCH(awk,TOKEN_PLUSPLUS)? XP_AWK_INCOP_PLUS:
MATCH(awk,TOKEN_MINUSMINUS)? XP_AWK_INCOP_MINUS: -1;
if (opcode1 != -1)
{
if (__get_token(awk) == -1) return XP_NULL;
}
left = __parse_primary (awk);
if (left == XP_NULL) return XP_NULL;
opcode2 = MATCH(awk,TOKEN_PLUSPLUS)? XP_AWK_INCOP_PLUS:
MATCH(awk,TOKEN_MINUSMINUS)? XP_AWK_INCOP_MINUS: -1;
if (opcode1 != -1 && opcode2 != -1)
{
xp_awk_clrpt (left);
PANIC (awk, XP_AWK_ELVALUE);
}
else if (opcode1 == -1 && opcode2 == -1)
{
return left;
}
else if (opcode1 != -1)
{
type = XP_AWK_NDE_EXP_INCPRE;
opcode = opcode1;
}
else if (opcode2 != -1)
{
type = XP_AWK_NDE_EXP_INCPST;
opcode = opcode2;
if (__get_token(awk) == -1) return XP_NULL;
}
nde = (xp_awk_nde_exp_t*)
xp_malloc (xp_sizeof(xp_awk_nde_exp_t));
if (nde == XP_NULL)
{
xp_awk_clrpt (left);
PANIC (awk, XP_AWK_ENOMEM);
}
nde->type = type;
nde->next = XP_NULL;
nde->opcode = opcode;
nde->left = left;
nde->right = XP_NULL;
return (xp_awk_nde_t*)nde;
} }
static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) static xp_awk_nde_t* __parse_primary (xp_awk_t* awk)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.28 2006-03-31 16:35:37 bacon Exp $ * $Id: run.c,v 1.29 2006-04-02 12:41:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -39,6 +39,9 @@ static int __run_exit_statement (xp_awk_t* awk, xp_awk_nde_exit_t* nde);
static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde);
static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde); static xp_awk_val_t* __eval_assignment (xp_awk_t* awk, xp_awk_nde_ass_t* nde);
static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde); static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_exp_t* nde);
static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde); static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde);
static int __raw_push (xp_awk_t* awk, void* val); static int __raw_push (xp_awk_t* awk, void* val);
@ -426,29 +429,39 @@ static xp_awk_val_t* __eval_expression (xp_awk_t* awk, xp_awk_nde_t* nde)
switch (nde->type) switch (nde->type)
{ {
case XP_AWK_NDE_ASS: case XP_AWK_NDE_ASS:
val = __eval_assignment(awk,(xp_awk_nde_ass_t*)nde); val = __eval_assignment (awk, (xp_awk_nde_ass_t*)nde);
break; break;
case XP_AWK_NDE_EXP_BIN: case XP_AWK_NDE_EXP_BIN:
val = __eval_binary(awk,(xp_awk_nde_exp_t*)nde); val = __eval_binary (awk, (xp_awk_nde_exp_t*)nde);
break; break;
case XP_AWK_NDE_EXP_UNR: case XP_AWK_NDE_EXP_UNR:
// TODO: ....................... val = __eval_unary (awk, (xp_awk_nde_exp_t*)nde);
break;
case XP_AWK_NDE_EXP_INCPRE:
val = __eval_incpre (awk, (xp_awk_nde_exp_t*)nde);
break;
case XP_AWK_NDE_EXP_INCPST:
val = __eval_incpst (awk, (xp_awk_nde_exp_t*)nde);
break; break;
case XP_AWK_NDE_STR: case XP_AWK_NDE_STR:
val = xp_awk_makestrval( val = xp_awk_makestrval (
((xp_awk_nde_str_t*)nde)->buf, ((xp_awk_nde_str_t*)nde)->buf,
((xp_awk_nde_str_t*)nde)->len); ((xp_awk_nde_str_t*)nde)->len);
break; break;
case XP_AWK_NDE_INT: case XP_AWK_NDE_INT:
val = xp_awk_makeintval(awk,((xp_awk_nde_int_t*)nde)->val); val = xp_awk_makeintval (
awk, ((xp_awk_nde_int_t*)nde)->val);
break; break;
case XP_AWK_NDE_REAL: case XP_AWK_NDE_REAL:
val = xp_awk_makerealval(awk,((xp_awk_nde_real_t*)nde)->val); val = xp_awk_makerealval (
awk, ((xp_awk_nde_real_t*)nde)->val);
break; break;
case XP_AWK_NDE_NAMED: case XP_AWK_NDE_NAMED:
@ -682,13 +695,214 @@ static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
} }
} }
xp_awk_refdownval (awk, left); xp_awk_refdownval (awk, left);
xp_awk_refdownval (awk, right); xp_awk_refdownval (awk, right);
return res; return res;
} }
static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
{
xp_awk_val_t* left, * res;
xp_assert (nde->type == XP_AWK_NDE_EXP_UNR);
xp_assert (nde->right == XP_NULL);
left = __eval_expression (awk, nde->left);
if (left == XP_NULL) return XP_NULL;
xp_awk_refupval (left);
// TODO: a lot of things to do....
if (nde->opcode == XP_AWK_UNROP_PLUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, r);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, r);
}
else
{
// TODO: error handling
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
else if (nde->opcode == XP_AWK_UNROP_MINUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, -r);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, -r);
}
else
{
// TODO: error handling
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
else if (nde->opcode == XP_AWK_UNROP_NOT)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, !r);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, !r);
}
else
{
// TODO: error handling
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
else if (nde->opcode == XP_AWK_UNROP_BNOT)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, ~r);
}
else
{
// TODO: error handling
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
xp_awk_refdownval (awk, left);
return res;
}
static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
{
xp_awk_val_t* left, * res;
xp_assert (nde->type == XP_AWK_NDE_EXP_INCPRE);
xp_assert (nde->right == XP_NULL);
left = __eval_expression (awk, nde->left); // TODO: do it differently
if (left == XP_NULL) return XP_NULL;
xp_awk_refupval (left);
if (nde->opcode == XP_AWK_UNROP_PLUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, r + 1);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, r + 1.0);
}
else
{
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
else if (nde->opcode == XP_AWK_UNROP_MINUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, r - 1);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, r - 1.0);
}
else
{
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
xp_awk_refdownval (awk, left);
return res;
}
static xp_awk_val_t* __eval_incpst (xp_awk_t* awk, xp_awk_nde_exp_t* nde)
{
xp_awk_val_t* left, * res;
xp_assert (nde->type == XP_AWK_NDE_EXP_INCPST);
xp_assert (nde->right == XP_NULL);
left = __eval_expression (awk, nde->left); // TODO: get the actual target...
if (left == XP_NULL) return XP_NULL;
xp_awk_refupval (left);
if (nde->opcode == XP_AWK_UNROP_PLUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, r);
// TODO: increment the actual target...
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, r);
// TODO: increment the actual target...
}
else
{
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
else if (nde->opcode == XP_AWK_UNROP_MINUS)
{
if (left->type == XP_AWK_VAL_INT)
{
xp_long_t r = ((xp_awk_val_int_t*)left)->val;
res = xp_awk_makeintval (awk, r - 1);
}
else if (left->type == XP_AWK_VAL_REAL)
{
xp_real_t r = ((xp_awk_val_real_t*)left)->val;
res = xp_awk_makerealval (awk, r - 1.0);
}
else
{
xp_awk_refdownval (awk, left);
return XP_NULL;
}
}
xp_awk_refdownval (awk, left);
return res;
}
static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde) static xp_awk_val_t* __eval_funccall (xp_awk_t* awk, xp_awk_nde_call_t* nde)
{ {
xp_awk_func_t* func; xp_awk_func_t* func;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.5 2006-03-31 12:04:14 bacon Exp $ * $Id: run.h,v 1.6 2006-04-02 12:41:14 bacon Exp $
*/ */
#ifndef _XP_AWK_RUN_H_ #ifndef _XP_AWK_RUN_H_
@ -22,8 +22,7 @@ struct xp_awk_frm_t
enum enum
{ {
/* if you change this, you have to change /* if you change this, you have to change
* __binop_str in tree.c accordingly */ * __binop_str in tree.c accordingly. */
XP_AWK_BINOP_LOR, XP_AWK_BINOP_LOR,
XP_AWK_BINOP_LAND, XP_AWK_BINOP_LAND,
XP_AWK_BINOP_BOR, XP_AWK_BINOP_BOR,
@ -49,12 +48,20 @@ enum
enum enum
{ {
XP_AWK_UNAOP_PLUS, /* if you change this, you have to change
XP_AWK_UNAOP_MINUS, * __unrop_str in tree.c accordingly. */
XP_AWK_UNAOP_PLUSPLUS, XP_AWK_UNROP_PLUS,
XP_AWK_UNAOP_MINUSMINUS, XP_AWK_UNROP_MINUS,
XP_AWK_UNAOP_NOT, XP_AWK_UNROP_NOT,
XP_AWK_UNAOP_BNOT XP_AWK_UNROP_BNOT
};
enum
{
/* if you change this, you have to change
* __incop_str in tree.c accordingly. */
XP_AWK_INCOP_PLUS,
XP_AWK_INCOP_MINUS
}; };
#endif #endif

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tree.c,v 1.30 2006-03-31 16:35:37 bacon Exp $ * $Id: tree.c,v 1.31 2006-04-02 12:41:14 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -35,16 +35,22 @@ static const xp_char_t* __binop_str[] =
XP_TEXT("%") XP_TEXT("%")
}; };
static const xp_char_t* __unaop_str[] = static const xp_char_t* __unrop_str[] =
{ {
XP_TEXT("+"), XP_TEXT("+"),
XP_TEXT("-"), XP_TEXT("-"),
XP_TEXT("++"),
XP_TEXT("--"),
XP_TEXT("!"), XP_TEXT("!"),
XP_TEXT("~") XP_TEXT("~")
}; };
static const xp_char_t* __incop_str[] =
{
XP_TEXT("++"),
XP_TEXT("--"),
XP_TEXT("++"),
XP_TEXT("--")
};
static void __print_tabs (int depth); static void __print_tabs (int depth);
static int __print_expression (xp_awk_nde_t* nde); static int __print_expression (xp_awk_nde_t* nde);
static int __print_expression_list (xp_awk_nde_t* tree); static int __print_expression_list (xp_awk_nde_t* tree);
@ -68,19 +74,49 @@ static int __print_expression (xp_awk_nde_t* nde)
case XP_AWK_NDE_EXP_BIN: case XP_AWK_NDE_EXP_BIN:
xp_printf (XP_TEXT("(")); xp_printf (XP_TEXT("("));
if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1) return -1; if (__print_expression(((xp_awk_nde_exp_t*)nde)->left) == -1)
return -1;
xp_assert ((((xp_awk_nde_exp_t*)nde)->left)->next == XP_NULL); xp_assert ((((xp_awk_nde_exp_t*)nde)->left)->next == XP_NULL);
xp_printf (XP_TEXT(" %s "), __binop_str[((xp_awk_nde_exp_t*)nde)->opcode]); xp_printf (XP_TEXT(" %s "),
if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS) xp_printf (XP_TEXT("(")); __binop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
if (__print_expression (((xp_awk_nde_exp_t*)nde)->right) == -1) return -1; if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS)
if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS) xp_printf (XP_TEXT(")")); xp_printf (XP_TEXT("("));
if (__print_expression (((xp_awk_nde_exp_t*)nde)->right) == -1)
return -1;
if (((xp_awk_nde_exp_t*)nde)->right->type == XP_AWK_NDE_ASS)
xp_printf (XP_TEXT(")"));
xp_assert ((((xp_awk_nde_exp_t*)nde)->right)->next == XP_NULL); xp_assert ((((xp_awk_nde_exp_t*)nde)->right)->next == XP_NULL);
xp_printf (XP_TEXT(")")); xp_printf (XP_TEXT(")"));
break; break;
case XP_AWK_NDE_EXP_UNR: case XP_AWK_NDE_EXP_UNR:
// TODO: xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
xp_printf (XP_TEXT("unary basic expression\n"));
xp_printf (XP_TEXT("%s("),
__unrop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
return -1;
xp_printf (XP_TEXT(")"));
break;
case XP_AWK_NDE_EXP_INCPRE:
xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
xp_printf (XP_TEXT("%s("),
__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
return -1;
xp_printf (XP_TEXT(")"));
break;
case XP_AWK_NDE_EXP_INCPST:
xp_assert (((xp_awk_nde_exp_t*)nde)->right == XP_NULL);
xp_printf (XP_TEXT("("));
if (__print_expression (((xp_awk_nde_exp_t*)nde)->left) == -1)
return -1;
xp_printf (XP_TEXT(")%s"),
__incop_str[((xp_awk_nde_exp_t*)nde)->opcode]);
break; break;
case XP_AWK_NDE_INT: case XP_AWK_NDE_INT:
@ -504,7 +540,10 @@ void xp_awk_clrpt (xp_awk_nde_t* tree)
break; break;
case XP_AWK_NDE_EXP_UNR: case XP_AWK_NDE_EXP_UNR:
// TODO: clear unary expression... case XP_AWK_NDE_EXP_INCPRE:
case XP_AWK_NDE_EXP_INCPST:
xp_assert (((xp_awk_nde_exp_t*)p)->right == XP_NULL);
xp_awk_clrpt (((xp_awk_nde_exp_t*)p)->left);
xp_free (p); xp_free (p);
break; break;

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tree.h,v 1.28 2006-03-28 16:33:09 bacon Exp $ * $Id: tree.h,v 1.29 2006-04-02 12:41:14 bacon Exp $
*/ */
#ifndef _XP_AWK_TREE_H_ #ifndef _XP_AWK_TREE_H_
@ -18,6 +18,8 @@ enum
XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_BIN,
XP_AWK_NDE_EXP_UNR, XP_AWK_NDE_EXP_UNR,
XP_AWK_NDE_EXP_INCPRE,
XP_AWK_NDE_EXP_INCPST,
XP_AWK_NDE_INT, XP_AWK_NDE_INT,
XP_AWK_NDE_REAL, XP_AWK_NDE_REAL,
@ -101,13 +103,14 @@ struct xp_awk_nde_ass_t
xp_awk_nde_t* right; xp_awk_nde_t* right;
}; };
/* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR */ /* XP_AWK_NDE_EXP_BIN, XP_AWK_NDE_EXP_UNR,
* XP_AWK_NDE_EXP_INCPRE, XP_AWNDE_EXP_INCPST */
struct xp_awk_nde_exp_t struct xp_awk_nde_exp_t
{ {
XP_AWK_NDE_HDR; XP_AWK_NDE_HDR;
int opcode; int opcode;
xp_awk_nde_t* left; xp_awk_nde_t* left;
xp_awk_nde_t* right; /* optional for XP_AWK_NDE_UNR */ xp_awk_nde_t* right; /* XP_NULL for UNR, INCPRE, INCPST */
}; };
/* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */ /* XP_AWK_NDE_POS - positional - $1, $2, $x, etc */

View File

@ -1,7 +1,7 @@
CC = cl CC = cl
#CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. #CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\.. CFLAGS = /nologo /MT /W3 /GR- /D_WIN32_WINNT=0x0400 -I..\..\..
LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk\debug LDFLAGS = /libpath:..\..\bas /libpath:..\..\awk
LIBS = xpbas.lib xpawk.lib LIBS = xpbas.lib xpawk.lib
#LIBS = xpawk.lib #LIBS = xpawk.lib