diff --git a/ase/awk/parse.c b/ase/awk/parse.c index 1f1110c7..25f44684 100644 --- a/ase/awk/parse.c +++ b/ase/awk/parse.c @@ -1,5 +1,5 @@ /* - * $Id: parse.c,v 1.65 2006-03-30 16:38:51 bacon Exp $ + * $Id: parse.c,v 1.66 2006-03-31 12:04:14 bacon Exp $ */ #include @@ -25,10 +25,10 @@ enum TOKEN_GT, TOKEN_NOT, TOKEN_PLUS, - TOKEN_PLUS_PLUS, + TOKEN_PLUSPLUS, TOKEN_PLUS_ASSIGN, TOKEN_MINUS, - TOKEN_MINUS_MINUS, + TOKEN_MINUSMINUS, TOKEN_MINUS_ASSIGN, TOKEN_MUL, TOKEN_DIV, @@ -40,6 +40,7 @@ enum TOKEN_BOR, TOKEN_BXOR, TOKEN_BAND, + TOKEN_BNOT, TOKEN_LPAREN, TOKEN_RPAREN, @@ -52,7 +53,8 @@ enum TOKEN_COMMA, TOKEN_SEMICOLON, - TOKEN_INTEGER, + TOKEN_INT, + TOKEN_REAL, TOKEN_STRING, TOKEN_REGEX, @@ -117,6 +119,7 @@ static xp_awk_nde_t* __parse_logical_or (xp_awk_t* awk); static xp_awk_nde_t* __parse_logical_and (xp_awk_t* awk); static xp_awk_nde_t* __parse_bitwise_or (xp_awk_t* awk); static xp_awk_nde_t* __parse_bitwise_xor (xp_awk_t* awk); +static xp_awk_nde_t* __parse_bitwise_and (xp_awk_t* awk); static xp_awk_nde_t* __parse_equality (xp_awk_t* awk); static xp_awk_nde_t* __parse_relational (xp_awk_t* awk); static xp_awk_nde_t* __parse_shift (xp_awk_t* awk); @@ -998,6 +1001,8 @@ static xp_awk_nde_t* __parse_expression (xp_awk_t* awk) if (x == XP_NULL) return XP_NULL; if (!MATCH(awk,TOKEN_ASSIGN)) return x; +//TODO: PLUS_ASSIGN, MINUS_ASSIGN, .... +// xp_assert (x->next == XP_NULL); if (x->type != XP_AWK_NDE_ARG && x->type != XP_AWK_NDE_ARGIDX && @@ -1151,6 +1156,17 @@ static xp_awk_nde_t* __parse_bitwise_xor (xp_awk_t* awk) { TOKEN_EOF, 0 } }; + return __parse_binary_expr (awk, map, __parse_bitwise_and); +} + +static xp_awk_nde_t* __parse_bitwise_and (xp_awk_t* awk) +{ + __binmap_t map[] = + { + { TOKEN_BAND, XP_AWK_BINOP_BAND }, + { TOKEN_EOF, 0 } + }; + return __parse_binary_expr (awk, map, __parse_equality); } @@ -1168,158 +1184,54 @@ static xp_awk_nde_t* __parse_equality (xp_awk_t* awk) static xp_awk_nde_t* __parse_relational (xp_awk_t* awk) { - xp_awk_nde_exp_t* nde; - xp_awk_nde_t* left, * right; - int opcode; - - left = __parse_shift (awk); - if (left == XP_NULL) return XP_NULL; - - while (1) + __binmap_t map[] = { - if (MATCH(awk,TOKEN_GT)) opcode = XP_AWK_BINOP_GT; - else if (MATCH(awk,TOKEN_GE)) opcode = XP_AWK_BINOP_GE; - else if (MATCH(awk,TOKEN_LT)) opcode = XP_AWK_BINOP_LT; - else if (MATCH(awk,TOKEN_LE)) opcode = XP_AWK_BINOP_LE; - else break; + { TOKEN_GT, XP_AWK_BINOP_GT }, + { TOKEN_GE, XP_AWK_BINOP_GE }, + { TOKEN_LT, XP_AWK_BINOP_LT }, + { TOKEN_LE, XP_AWK_BINOP_LE }, + { TOKEN_EOF, 0 } + }; - if (__get_token(awk) == -1) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - right = __parse_shift (awk); - if (right == XP_NULL) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - // TODO: constant folding -> in other parts of the program also... - - 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; + return __parse_binary_expr (awk, map, __parse_shift); } static xp_awk_nde_t* __parse_shift (xp_awk_t* awk) { - xp_awk_nde_exp_t* nde; - xp_awk_nde_t* left, * right; - int opcode; - - left = __parse_additive (awk); - if (left == XP_NULL) return XP_NULL; - - while (1) + __binmap_t map[] = { - if (MATCH(awk,TOKEN_RSHIFT)) opcode = XP_AWK_BINOP_RSHIFT; - else if (MATCH(awk,TOKEN_LSHIFT)) opcode = XP_AWK_BINOP_LSHIFT; - else break; + { TOKEN_LSHIFT, XP_AWK_BINOP_LSHIFT }, + { TOKEN_RSHIFT, XP_AWK_BINOP_RSHIFT }, + { TOKEN_EOF, 0 } + }; - if (__get_token(awk) == -1) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - right = __parse_additive (awk); - if (right == XP_NULL) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - // TODO: constant folding -> in other parts of the program also... - - 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; + return __parse_binary_expr (awk, map, __parse_additive); } static xp_awk_nde_t* __parse_additive (xp_awk_t* awk) { - xp_awk_nde_exp_t* nde; - xp_awk_nde_t* left, * right; - int opcode; - - left = __parse_multiplicative (awk); - if (left == XP_NULL) return XP_NULL; - - while (1) + __binmap_t map[] = { - if (MATCH(awk,TOKEN_PLUS)) opcode = XP_AWK_BINOP_PLUS; - else if (MATCH(awk,TOKEN_MINUS)) opcode = XP_AWK_BINOP_MINUS; - else break; + { TOKEN_PLUS, XP_AWK_BINOP_PLUS }, + { TOKEN_MINUS, XP_AWK_BINOP_MINUS }, + { TOKEN_EOF, 0 } + }; - if (__get_token(awk) == -1) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - right = __parse_multiplicative (awk); - if (right == XP_NULL) - { - xp_awk_clrpt (left); - return XP_NULL; - } - - // TODO: constant folding -> in other parts of the program also... - - 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; + return __parse_binary_expr (awk, map, __parse_multiplicative); } static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) { + __binmap_t map[] = + { + { TOKEN_MUL, XP_AWK_BINOP_MUL }, + { TOKEN_DIV, XP_AWK_BINOP_DIV }, + { TOKEN_MOD, XP_AWK_BINOP_MOD }, + { TOKEN_EOF, 0 } + }; + + return __parse_binary_expr (awk, map, __parse_unary); +#if 0 xp_awk_nde_exp_t* nde; xp_awk_nde_t* left, * right; int opcode; @@ -1396,10 +1308,20 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) } return left; +#endif } static xp_awk_nde_t* __parse_unary (xp_awk_t* awk) { + // TOKEN_PLUS_PLUS, TOKEN_MINUS_MINUS + //TODO: + /* + while (MATCH(awk,TOKEN_PLUS) || MATCH(awk,TOKEN_MINUS) || + MATCH(awk,TOKEN_NOT) || MATCH(awk,TOKEN_BNOT)) + { + } + */ + return __parse_primary (awk); } @@ -1500,7 +1422,7 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) PANIC (awk, XP_AWK_EUNDEF); } } - else if (MATCH(awk,TOKEN_INTEGER)) + else if (MATCH(awk,TOKEN_INT)) { xp_awk_nde_int_t* nde; @@ -1523,11 +1445,29 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) return (xp_awk_nde_t*)nde; } - /* TODO: floating point number */ - /* else if (MATCH(awk,TOKEN_REAL)) { + xp_awk_nde_real_t* nde; + + nde = (xp_awk_nde_real_t*) + xp_malloc (xp_sizeof(xp_awk_nde_real_t)); + if (nde == XP_NULL) PANIC (awk, XP_AWK_ENOMEM); + + nde->type = XP_AWK_NDE_REAL; + nde->next = XP_NULL; + nde->val = xp_strtoreal (XP_STR_BUF(&awk->token.name)); + + xp_assert ( + XP_STR_LEN(&awk->token.name) == + xp_strlen(XP_STR_BUF(&awk->token.name))); + + if (__get_token(awk) == -1) + { + xp_free (nde); + return XP_NULL; + } + + return (xp_awk_nde_t*)nde; } - */ else if (MATCH(awk,TOKEN_STRING)) { xp_awk_nde_str_t* nde; @@ -2190,7 +2130,7 @@ static int __get_token (xp_awk_t* awk) GET_CHAR_TO (awk, c); } while (xp_isdigit(c)); - SET_TOKEN_TYPE (awk, TOKEN_INTEGER); + SET_TOKEN_TYPE (awk, TOKEN_INT); // TODO: enhance nubmer handling } else if (xp_isalpha(c) || c == XP_CHAR('_')) @@ -2324,12 +2264,18 @@ static int __get_token (xp_awk_t* awk) ADD_TOKEN_STR (awk, XP_TEXT("&")); } } + else if (c == XP_CHAR('~')) + { + SET_TOKEN_TYPE (awk, TOKEN_BNOT); + 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_PLUS_PLUS); + SET_TOKEN_TYPE (awk, TOKEN_PLUSPLUS); ADD_TOKEN_STR (awk, XP_TEXT("++")); GET_CHAR_TO (awk, c); } @@ -2354,7 +2300,7 @@ static int __get_token (xp_awk_t* awk) GET_CHAR_TO (awk, c); if (c == XP_CHAR('-')) { - SET_TOKEN_TYPE (awk, TOKEN_MINUS_MINUS); + SET_TOKEN_TYPE (awk, TOKEN_MINUSMINUS); ADD_TOKEN_STR (awk, XP_TEXT("--")); GET_CHAR_TO (awk, c); } diff --git a/ase/awk/run.h b/ase/awk/run.h index fa73381f..4d17e801 100644 --- a/ase/awk/run.h +++ b/ase/awk/run.h @@ -1,5 +1,5 @@ /* - * $Id: run.h,v 1.4 2006-03-30 16:31:50 bacon Exp $ + * $Id: run.h,v 1.5 2006-03-31 12:04:14 bacon Exp $ */ #ifndef _XP_AWK_RUN_H_ @@ -29,19 +29,32 @@ enum XP_AWK_BINOP_BOR, XP_AWK_BINOP_BXOR, XP_AWK_BINOP_BAND, - XP_AWK_BINOP_PLUS, - XP_AWK_BINOP_MINUS, - XP_AWK_BINOP_MUL, - XP_AWK_BINOP_DIV, - XP_AWK_BINOP_MOD, - XP_AWK_BINOP_RSHIFT, - XP_AWK_BINOP_LSHIFT, + XP_AWK_BINOP_EQ, XP_AWK_BINOP_NE, XP_AWK_BINOP_GT, XP_AWK_BINOP_GE, XP_AWK_BINOP_LT, - XP_AWK_BINOP_LE + XP_AWK_BINOP_LE, + + XP_AWK_BINOP_LSHIFT, + XP_AWK_BINOP_RSHIFT, + + XP_AWK_BINOP_PLUS, + XP_AWK_BINOP_MINUS, + XP_AWK_BINOP_MUL, + XP_AWK_BINOP_DIV, + XP_AWK_BINOP_MOD +}; + +enum +{ + XP_AWK_UNAOP_PLUS, + XP_AWK_UNAOP_MINUS, + XP_AWK_UNAOP_PLUSPLUS, + XP_AWK_UNAOP_MINUSMINUS, + XP_AWK_UNAOP_NOT, + XP_AWK_UNAOP_BNOT }; #endif diff --git a/ase/awk/sa.c b/ase/awk/sa.c index d1898774..886aaf23 100644 --- a/ase/awk/sa.c +++ b/ase/awk/sa.c @@ -1,5 +1,5 @@ /* - * $Id: sa.c,v 1.11 2006-03-29 16:37:31 bacon Exp $ + * $Id: sa.c,v 1.12 2006-03-31 12:04:14 bacon Exp $ */ #include @@ -66,7 +66,6 @@ int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2) return 0; } - xp_long_t xp_strtolong (xp_char_t* str) { xp_long_t n = 0; @@ -80,6 +79,12 @@ xp_long_t xp_strtolong (xp_char_t* str) return n; } +xp_real_t xp_strtoreal (xp_char_t* str) +{ + /* TODO: */ + return (xp_real_t)0.0; +} + int xp_printf (const xp_char_t* fmt, ...) { diff --git a/ase/awk/sa.h b/ase/awk/sa.h index 8208c5b6..f74b9626 100644 --- a/ase/awk/sa.h +++ b/ase/awk/sa.h @@ -1,5 +1,5 @@ /* - * $Id: sa.h,v 1.15 2006-03-29 16:37:31 bacon Exp $ + * $Id: sa.h,v 1.16 2006-03-31 12:04:14 bacon Exp $ */ #ifndef _XP_AWK_SA_H_ @@ -141,6 +141,7 @@ xp_size_t xp_strxncpy ( int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2); xp_long_t xp_strtolong (xp_char_t* str); +xp_real_t xp_strtoreal (xp_char_t* str); int xp_printf (const xp_char_t* fmt, ...); int xp_vprintf (const xp_char_t* fmt, xp_va_list ap); diff --git a/ase/awk/tree.c b/ase/awk/tree.c index cab13c38..6020f4d1 100644 --- a/ase/awk/tree.c +++ b/ase/awk/tree.c @@ -1,5 +1,5 @@ /* - * $Id: tree.c,v 1.28 2006-03-30 16:31:50 bacon Exp $ + * $Id: tree.c,v 1.29 2006-03-31 12:04:14 bacon Exp $ */ #include @@ -17,19 +17,32 @@ static const xp_char_t* __binop_str[] = XP_TEXT("|"), XP_TEXT("^"), XP_TEXT("&"), - XP_TEXT("+"), - XP_TEXT("-"), - XP_TEXT("*"), - XP_TEXT("/"), - XP_TEXT("%"), - XP_TEXT("<<"), - XP_TEXT(">>"), + XP_TEXT("=="), XP_TEXT("!="), XP_TEXT(">"), XP_TEXT(">="), 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* __unaop_str[] = +{ + XP_TEXT("+"), + XP_TEXT("-"), + XP_TEXT("++"), + XP_TEXT("--"), + XP_TEXT("!"), + XP_TEXT("~") }; static void __print_tabs (int depth);