From 46a2b28e62c458ee923114a73f3d1855c464fe3b Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 11 Apr 2006 15:44:30 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/parse.c | 106 ++++++++++++++++++++++++++++++++++++++++-------- ase/awk/run.c | 61 +++++++++++++++++++++++++++- ase/awk/run.h | 7 ++-- ase/awk/tree.c | 5 ++- 4 files changed, 154 insertions(+), 25 deletions(-) diff --git a/ase/awk/parse.c b/ase/awk/parse.c index c62d9cc9..c67f6036 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.77 2006-04-11 09:16:20 bacon Exp $ + * $Id: parse.c,v 1.78 2006-04-11 15:44:30 bacon Exp $ */ #include @@ -17,30 +17,38 @@ enum TOKEN_EOF, TOKEN_ASSIGN, + TOKEN_PLUS_ASSIGN, + TOKEN_MINUS_ASSIGN, + TOKEN_MUL_ASSIGN, + TOKEN_DIV_ASSIGN, + TOKEN_MOD_ASSIGN, + TOKEN_EXP_ASSIGN, + TOKEN_EQ, TOKEN_NE, TOKEN_LE, TOKEN_LT, TOKEN_GE, TOKEN_GT, + TOKEN_MA, /* match */ + TOKEN_NM, /* not match */ TOKEN_NOT, TOKEN_PLUS, TOKEN_PLUSPLUS, - TOKEN_PLUS_ASSIGN, TOKEN_MINUS, TOKEN_MINUSMINUS, - TOKEN_MINUS_ASSIGN, TOKEN_MUL, TOKEN_DIV, TOKEN_MOD, - TOKEN_RSHIFT, - TOKEN_LSHIFT, TOKEN_LOR, TOKEN_LAND, TOKEN_BOR, TOKEN_BXOR, TOKEN_BAND, TOKEN_BNOT, + TOKEN_RSHIFT, + TOKEN_LSHIFT, + TOKEN_EXP, TOKEN_LPAREN, TOKEN_RPAREN, @@ -80,6 +88,8 @@ enum TOKEN_LOCAL, TOKEN_GLOBAL, + TOKEN_IN, + __TOKEN_COUNT__ }; @@ -167,6 +177,7 @@ static struct __kwent __kwtab[] = { { XP_TEXT("BEGIN"), TOKEN_BEGIN, 0 }, { XP_TEXT("END"), TOKEN_END, 0 }, + { XP_TEXT("function"), TOKEN_FUNCTION, 0 }, { XP_TEXT("func"), TOKEN_FUNCTION, 0 }, { XP_TEXT("if"), TOKEN_IF, 0 }, @@ -185,6 +196,8 @@ static struct __kwent __kwtab[] = { XP_TEXT("local"), TOKEN_LOCAL, XP_AWK_EXPLICIT }, { XP_TEXT("global"), TOKEN_GLOBAL, XP_AWK_EXPLICIT }, + { XP_TEXT("in"), TOKEN_IN, 0 }, + { XP_NULL, 0, 0 } }; @@ -1325,6 +1338,7 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) { TOKEN_MUL, XP_AWK_BINOP_MUL }, { TOKEN_DIV, XP_AWK_BINOP_DIV }, { TOKEN_MOD, XP_AWK_BINOP_MOD }, + { TOKEN_EXP, XP_AWK_BINOP_EXP }, { TOKEN_EOF, 0 } }; @@ -2297,6 +2311,12 @@ static int __get_token (xp_awk_t* awk) ADD_TOKEN_STR (awk, XP_TEXT("!=")); GET_CHAR_TO (awk, c); } + else if (c == XP_CHAR('@')) + { + SET_TOKEN_TYPE (awk, TOKEN_NM); + ADD_TOKEN_STR (awk, XP_TEXT("!=")); + GET_CHAR_TO (awk, c); + } else { SET_TOKEN_TYPE (awk, TOKEN_NOT); @@ -2360,12 +2380,6 @@ static int __get_token (xp_awk_t* awk) ADD_TOKEN_STR (awk, XP_TEXT("|")); } } - else if (c == XP_CHAR('^')) - { - SET_TOKEN_TYPE (awk, TOKEN_BXOR); - ADD_TOKEN_CHAR (awk, c); - GET_CHAR_TO (awk, c); - } else if (c == XP_CHAR('&')) { GET_CHAR_TO (awk, c); @@ -2387,6 +2401,18 @@ static int __get_token (xp_awk_t* awk) ADD_TOKEN_CHAR (awk, c); GET_CHAR_TO (awk, c); } + else if (c == XP_CHAR('^')) + { + SET_TOKEN_TYPE (awk, TOKEN_BXOR); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } + else if (c == XP_CHAR('@')) + { + SET_TOKEN_TYPE (awk, TOKEN_MA); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } else if (c == XP_CHAR('+')) { GET_CHAR_TO (awk, c); @@ -2431,23 +2457,67 @@ static int __get_token (xp_awk_t* awk) } else if (c == XP_CHAR('*')) { - SET_TOKEN_TYPE (awk, TOKEN_MUL); - ADD_TOKEN_CHAR (awk, c); GET_CHAR_TO (awk, c); + + if (c == XP_CHAR('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_MUL_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } + else if (c == XP_CHAR('*')) + { + GET_CHAR_TO (awk, c); + if (c == XP_CHAR('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_EXP_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_EXP); + ADD_TOKEN_CHAR (awk, c); + } + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_MUL); + ADD_TOKEN_CHAR (awk, c); + } } else if (c == XP_CHAR('/')) { // TODO: handle regular expression here... /^pattern$/ - - SET_TOKEN_TYPE (awk, TOKEN_DIV); - ADD_TOKEN_CHAR (awk, c); GET_CHAR_TO (awk, c); + + if (c == XP_CHAR('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_DIV_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_DIV); + ADD_TOKEN_CHAR (awk, c); + } } else if (c == XP_CHAR('%')) { - SET_TOKEN_TYPE (awk, TOKEN_MOD); - ADD_TOKEN_CHAR (awk, c); GET_CHAR_TO (awk, c); + + if (c == XP_CHAR('=')) + { + SET_TOKEN_TYPE (awk, TOKEN_MOD_ASSIGN); + ADD_TOKEN_CHAR (awk, c); + GET_CHAR_TO (awk, c); + } + else + { + SET_TOKEN_TYPE (awk, TOKEN_MOD); + ADD_TOKEN_CHAR (awk, c); + } } else if (c == XP_CHAR('(')) { diff --git a/ase/awk/run.c b/ase/awk/run.c index 57a32933..8d41bb61 100644 --- a/ase/awk/run.c +++ b/ase/awk/run.c @@ -1,9 +1,12 @@ /* - * $Id: run.c,v 1.45 2006-04-11 09:16:20 bacon Exp $ + * $Id: run.c,v 1.46 2006-04-11 15:44:30 bacon Exp $ */ #include +// TODO: remove this dependency... +#include + #ifndef __STAND_ALONE #include #include @@ -83,6 +86,8 @@ static xp_awk_val_t* __eval_binop_div ( xp_awk_t* awk, xp_awk_val_t* left, xp_awk_val_t* right); static xp_awk_val_t* __eval_binop_mod ( xp_awk_t* awk, xp_awk_val_t* left, xp_awk_val_t* right); +static xp_awk_val_t* __eval_binop_exp ( + xp_awk_t* awk, xp_awk_val_t* left, xp_awk_val_t* right); static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_t* nde); static xp_awk_val_t* __eval_incpre (xp_awk_t* awk, xp_awk_nde_t* nde); @@ -228,7 +233,11 @@ int xp_awk_run (xp_awk_t* awk) while (awk->run.exit_level != EXIT_GLOBAL) { awk->run.exit_level = EXIT_NONE; + + // // TODO: execute pattern blocks. + // + break; } @@ -772,7 +781,8 @@ static xp_awk_val_t* __eval_binary (xp_awk_t* awk, xp_awk_nde_t* nde) __eval_binop_minus, __eval_binop_mul, __eval_binop_div, - __eval_binop_mod + __eval_binop_mod, + __eval_binop_exp }; xp_awk_nde_exp_t* exp = (xp_awk_nde_exp_t*)nde; xp_awk_val_t* left, * right, * res; @@ -1471,6 +1481,53 @@ static xp_awk_val_t* __eval_binop_mod ( return res; } +static xp_awk_val_t* __eval_binop_exp ( + xp_awk_t* awk, xp_awk_val_t* left, xp_awk_val_t* right) +{ + xp_awk_val_t* res = XP_NULL; + + if (left->type == XP_AWK_VAL_INT && + right->type == XP_AWK_VAL_INT) + { + xp_long_t r = 1; + xp_long_t cnt = ((xp_awk_val_int_t*)right)->val; + + while (cnt-- > 0) r *= ((xp_awk_val_int_t*)left)->val; + res = xp_awk_makeintval (awk, r); + } + else if (left->type == XP_AWK_VAL_INT && + right->type == XP_AWK_VAL_REAL) + { +// TODO: write own pow... + double x = ((xp_awk_val_int_t*)left)->val; + double y = ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, pow (x, y)); + } + else if (left->type == XP_AWK_VAL_REAL && + right->type == XP_AWK_VAL_INT) + { +// TODO: write own pow... + double x = ((xp_awk_val_real_t*)left)->val; + double y = ((xp_awk_val_int_t*)right)->val; + res = xp_awk_makerealval (awk, pow (x, y)); + } + else if (left->type == XP_AWK_VAL_REAL && + right->type == XP_AWK_VAL_REAL) + { +// TODO: wirte own pow... + double x = ((xp_awk_val_real_t*)left)->val; + double y = ((xp_awk_val_real_t*)right)->val; + res = xp_awk_makerealval (awk, pow (x, y)); + } + else + { + PANIC (awk, XP_AWK_EOPERAND); + } + + if (res == XP_NULL) PANIC (awk, XP_AWK_ENOMEM); + return res; +} + static xp_awk_val_t* __eval_unary (xp_awk_t* awk, xp_awk_nde_t* nde) { xp_awk_val_t* left, * res = XP_NULL; diff --git a/ase/awk/run.h b/ase/awk/run.h index c9014946..d5a328dd 100644 --- a/ase/awk/run.h +++ b/ase/awk/run.h @@ -1,5 +1,5 @@ /* - * $Id: run.h,v 1.6 2006-04-02 12:41:14 bacon Exp $ + * $Id: run.h,v 1.7 2006-04-11 15:44:30 bacon Exp $ */ #ifndef _XP_AWK_RUN_H_ @@ -22,7 +22,7 @@ struct xp_awk_frm_t enum { /* if you change this, you have to change - * __binop_str in tree.c accordingly. */ + * __binop_str in tree.c and __binop_func in run.c accordingly. */ XP_AWK_BINOP_LOR, XP_AWK_BINOP_LAND, XP_AWK_BINOP_BOR, @@ -43,7 +43,8 @@ enum XP_AWK_BINOP_MINUS, XP_AWK_BINOP_MUL, XP_AWK_BINOP_DIV, - XP_AWK_BINOP_MOD + XP_AWK_BINOP_MOD, + XP_AWK_BINOP_EXP }; enum diff --git a/ase/awk/tree.c b/ase/awk/tree.c index 09448924..a56eded8 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.33 2006-04-11 09:16:20 bacon Exp $ + * $Id: tree.c,v 1.34 2006-04-11 15:44:30 bacon Exp $ */ #include @@ -32,7 +32,8 @@ static const xp_char_t* __binop_str[] = XP_TEXT("-"), XP_TEXT("*"), XP_TEXT("/"), - XP_TEXT("%") + XP_TEXT("%"), + XP_TEXT("**") }; static const xp_char_t* __unrop_str[] =