From f77ca39b83fbc6428d914868efba076d4036f6b2 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Tue, 24 Jan 2006 16:14:28 +0000 Subject: [PATCH] *** empty log message *** --- ase/awk/awk.c | 38 +++++++++++++++++++++++++++++--------- ase/awk/awk.h | 8 +++++++- ase/awk/parse.c | 45 +++++++++++++++++++++++++++++++++++---------- ase/awk/tree.c | 18 +++++++++++------- ase/awk/tree.h | 23 ++++++++++++++++++++--- 5 files changed, 102 insertions(+), 30 deletions(-) diff --git a/ase/awk/awk.c b/ase/awk/awk.c index 6e7f6ec2..c98f1913 100644 --- a/ase/awk/awk.c +++ b/ase/awk/awk.c @@ -1,5 +1,5 @@ /* - * $Id: awk.c,v 1.10 2006-01-22 15:11:17 bacon Exp $ + * $Id: awk.c,v 1.11 2006-01-24 16:14:28 bacon Exp $ */ #include @@ -36,6 +36,7 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk) awk->tree.begin = XP_NULL; awk->tree.end = XP_NULL; + awk->tree.unnamed = XP_NULL; //awk->tree.funcs = XP_NULL; awk->lex.curc = XP_CHAR_EOF; @@ -46,20 +47,38 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk) int xp_awk_close (xp_awk_t* awk) { - - if (awk->tree.begin != XP_NULL) xp_awk_clrpt (awk->tree.begin); - if (awk->tree.end != XP_NULL) xp_awk_clrpt (awk->tree.end); -/* -// TODO: destroy function list - if (awk->tree.funcs != XP_NULL) -*/ - + xp_awk_clear (awk); if (xp_awk_detsrc(awk) == -1) return -1; xp_str_close (&awk->token.name); if (awk->__dynamic) xp_free (awk); return 0; } +void xp_awk_clear (xp_awk_t* awk) +{ + + if (awk->tree.begin != XP_NULL) { + xp_assert (awk->tree.begin->next == XP_NULL); + xp_awk_clrpt (awk->tree.begin); + awk->tree.begin = XP_NULL; + } + + if (awk->tree.end != XP_NULL) { + xp_assert (awk->tree.end->next == XP_NULL); + xp_awk_clrpt (awk->tree.end); + awk->tree.end = XP_NULL; + } + + while (awk->tree.unnamed != XP_NULL) { + xp_awk_node_t* next = awk->tree.unnamed->next; + xp_awk_clrpt (awk->tree.unnamed); + awk->tree.unnamed = next; + } + + /* TODO: destroy pattern-actions pairs */ + /* TODO: destroy function list */ +} + int xp_awk_attsrc (xp_awk_t* awk, xp_awk_io_t src, void* arg) { if (xp_awk_detsrc(awk) == -1) return -1; @@ -94,3 +113,4 @@ int xp_awk_detsrc (xp_awk_t* awk) return 0; } + diff --git a/ase/awk/awk.h b/ase/awk/awk.h index c5b0714c..4635cefa 100644 --- a/ase/awk/awk.h +++ b/ase/awk/awk.h @@ -1,5 +1,5 @@ /* - * $Id: awk.h,v 1.17 2006-01-22 15:11:17 bacon Exp $ + * $Id: awk.h,v 1.18 2006-01-24 16:14:28 bacon Exp $ */ #ifndef _XP_AWK_AWK_H_ @@ -88,6 +88,7 @@ struct xp_awk_t //xp_awk_hash_t* funcs; xp_awk_node_t* begin; xp_awk_node_t* end; + xp_awk_node_t* unnamed; } tree; /* source buffer management */ @@ -124,6 +125,11 @@ xp_awk_t* xp_awk_open (xp_awk_t* awk); */ int xp_awk_close (xp_awk_t* awk); +/* + * FUNCTION: xp_awk_clear + */ +void xp_awk_clear (xp_awk_t* awk); + /* * FUNCTION: xp_awk_attsrc */ diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 9ba46eab..100f6d12 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.29 2006-01-22 15:11:17 bacon Exp $ + * $Id: parse.c,v 1.30 2006-01-24 16:14:28 bacon Exp $ */ #include @@ -106,6 +106,8 @@ static int __skip_spaces (xp_awk_t* awk); static int __skip_comment (xp_awk_t* awk); static int __classfy_ident (const xp_char_t* ident); +static int __find_func_arg (xp_awk_t* awk, const xp_char_t* name); + struct __kwent { const xp_char_t* name; @@ -165,6 +167,8 @@ static struct __kwent __kwtab[] = int xp_awk_parse (xp_awk_t* awk) { + /* if you want to parse anew, call xp_awk_clear first. + * otherwise, the result is appened to the accumulated result */ GET_CHAR (awk); GET_TOKEN (awk); @@ -245,7 +249,7 @@ static xp_bool_t __function_defined (xp_awk_t* awk, const xp_char_t* name) static xp_awk_node_t* __parse_function (xp_awk_t* awk) { xp_char_t* name; - xp_awk_func_t* func; + //xp_awk_func_t* func; xp_awk_node_t* body; if (__get_token(awk) == -1) return XP_NULL; @@ -335,6 +339,7 @@ static xp_awk_node_t* __parse_function (xp_awk_t* awk) return XP_NULL; } +/* func = (xp_awk_func_t*) xp_malloc (xp_sizeof(xp_awk_func_t)); if (func == XP_NULL) { xp_free (name); @@ -345,6 +350,7 @@ static xp_awk_node_t* __parse_function (xp_awk_t* awk) func->name = name; func->nargs = 0; func->body = body; +*/ /* TODO: weave the function body into awk->tree.funcs */ return body; @@ -564,7 +570,7 @@ static xp_awk_node_t* __parse_expression (xp_awk_t* awk) if (!MATCH(awk,TOKEN_ASSIGN)) return x; xp_assert (x->next == XP_NULL); - if (x->type != XP_AWK_NODE_VAR && x->type != XP_AWK_NODE_IDX) { + if (x->type != XP_AWK_NODE_VAR && x->type != XP_AWK_NODE_VARIDX) { xp_awk_clrpt (x); PANIC (awk, XP_AWK_EASSIGN); } @@ -819,17 +825,26 @@ static xp_awk_node_t* __parse_primary (xp_awk_t* awk, xp_char_t* ident) } else { /* normal variable */ - xp_awk_node_term_t* node; + xp_awk_node_var_t* node; + xp_size_t idxa; - node = (xp_awk_node_term_t*)xp_malloc(xp_sizeof(xp_awk_node_term_t)); + node = (xp_awk_node_var_t*)xp_malloc(xp_sizeof(xp_awk_node_var_t)); if (node == XP_NULL) { xp_free (name); PANIC (awk, XP_AWK_ENOMEM); } - node->type = XP_AWK_NODE_VAR; - node->next = XP_NULL; - node->value = name; + idxa = __find_func_arg (awk, name); + if (idxa == (xp_size_t)-1) { + node->type = XP_AWK_NODE_VAR; + node->next = XP_NULL; + node->id.name = name; + } + else { + node->type = XP_AWK_NODE_ARG; + node->next = XP_NULL; + node->id.idxa = idxa; + } return (xp_awk_node_t*)node; } @@ -932,9 +947,9 @@ static xp_awk_node_t* __parse_hashidx (xp_awk_t* awk, xp_char_t* name) PANIC (awk, XP_AWK_ENOMEM); } - node->type = XP_AWK_NODE_IDX; + node->type = XP_AWK_NODE_VARIDX; node->next = XP_NULL; - node->name = name; + node->id.name = name; node->idx = idx; return (xp_awk_node_t*)node; @@ -1607,3 +1622,13 @@ static int __classfy_ident (const xp_char_t* ident) return TOKEN_IDENT; } + +static xp_size_t __find_func_arg (xp_awk_t* awk, const xp_char_t* name) +{ + if (awk->curfunc != XP_NULL) { + +// TODO: finish this.... + } + + return (xp_size_t)-1; +} diff --git a/ase/awk/tree.c b/ase/awk/tree.c index c14dc369..459d7de8 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.9 2006-01-20 07:29:54 bacon Exp $ + * $Id: tree.c,v 1.10 2006-01-24 16:14:28 bacon Exp $ */ #include @@ -66,11 +66,11 @@ static int __print_expr_node (xp_awk_node_t* node) break; case XP_AWK_NODE_VAR: - xp_printf (XP_TEXT("%s"), ((xp_awk_node_term_t*)node)->value); + xp_printf (XP_TEXT("%s"), ((xp_awk_node_var_t*)node)->id.name); break; - case XP_AWK_NODE_IDX: - xp_printf (XP_TEXT("%s["), ((xp_awk_node_idx_t*)node)->name); + case XP_AWK_NODE_VARIDX: + xp_printf (XP_TEXT("%s["), ((xp_awk_node_idx_t*)node)->id.name); __print_expr_node (((xp_awk_node_idx_t*)node)->idx); xp_printf (XP_TEXT("]")); break; @@ -339,14 +339,18 @@ void xp_awk_clrpt (xp_awk_node_t* tree) case XP_AWK_NODE_STR: case XP_AWK_NODE_NUM: - case XP_AWK_NODE_VAR: xp_free (((xp_awk_node_term_t*)p)->value); xp_free (p); break; - case XP_AWK_NODE_IDX: + case XP_AWK_NODE_VAR: + xp_free (((xp_awk_node_var_t*)p)->id.name); + xp_free (p); + break; + + case XP_AWK_NODE_VARIDX: xp_awk_clrpt (((xp_awk_node_idx_t*)p)->idx); - xp_free (((xp_awk_node_idx_t*)p)->name); + xp_free (((xp_awk_node_idx_t*)p)->id.name); xp_free (p); break; diff --git a/ase/awk/tree.h b/ase/awk/tree.h index bc153855..194d1a33 100644 --- a/ase/awk/tree.h +++ b/ase/awk/tree.h @@ -1,5 +1,5 @@ /* - * $Id: tree.h,v 1.15 2006-01-22 15:11:17 bacon Exp $ + * $Id: tree.h,v 1.16 2006-01-24 16:14:28 bacon Exp $ */ #ifndef _XP_AWK_TREE_H_ @@ -21,7 +21,9 @@ enum XP_AWK_NODE_STR, XP_AWK_NODE_NUM, XP_AWK_NODE_VAR, - XP_AWK_NODE_IDX, + XP_AWK_NODE_VARIDX, + XP_AWK_NODE_ARG, + XP_AWK_NODE_ARGIDX, XP_AWK_NODE_CALL, XP_AWK_NODE_IF, XP_AWK_NODE_WHILE, @@ -34,6 +36,7 @@ typedef struct xp_awk_node_block_t xp_awk_node_block_t; typedef struct xp_awk_node_assign_t xp_awk_node_assign_t; typedef struct xp_awk_node_expr_t xp_awk_node_expr_t; typedef struct xp_awk_node_term_t xp_awk_node_term_t; +typedef struct xp_awk_node_var_t xp_awk_node_var_t; typedef struct xp_awk_node_idx_t xp_awk_node_idx_t; typedef struct xp_awk_node_call_t xp_awk_node_call_t; typedef struct xp_awk_node_if_t xp_awk_node_if_t; @@ -84,10 +87,24 @@ struct xp_awk_node_term_t xp_char_t* value; }; +struct xp_awk_node_var_t +{ + XP_AWK_NODE_HDR; + union + { + xp_char_t* name; + xp_size_t idxa; + } id; +}; + struct xp_awk_node_idx_t { XP_AWK_NODE_HDR; - xp_char_t* name; + union + { + xp_char_t* name; + xp_size_t idxa; + } id; xp_awk_node_t* idx; };