*** empty log message ***

This commit is contained in:
hyung-hwan 2006-06-29 15:40:30 +00:00
parent a60f6124dc
commit 1f94f4c4e6
5 changed files with 66 additions and 18 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.128 2006-06-29 14:38:01 bacon Exp $ * $Id: parse.c,v 1.129 2006-06-29 15:40:30 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -65,12 +65,6 @@ enum
TOKEN_COLON, TOKEN_COLON,
TOKEN_QUEST, TOKEN_QUEST,
TOKEN_INT,
TOKEN_REAL,
TOKEN_STR,
TOKEN_REX,
TOKEN_IDENT,
TOKEN_BEGIN, TOKEN_BEGIN,
TOKEN_END, TOKEN_END,
TOKEN_FUNCTION, TOKEN_FUNCTION,
@ -93,6 +87,12 @@ enum
TOKEN_LOCAL, TOKEN_LOCAL,
TOKEN_GLOBAL, TOKEN_GLOBAL,
TOKEN_IDENT,
TOKEN_INT,
TOKEN_REAL,
TOKEN_STR,
TOKEN_REX,
__TOKEN_COUNT__ __TOKEN_COUNT__
}; };
@ -136,6 +136,7 @@ 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_equality (xp_awk_t* awk);
static xp_awk_nde_t* __parse_relational (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); static xp_awk_nde_t* __parse_shift (xp_awk_t* awk);
static xp_awk_nde_t* __parse_concat (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);
@ -1127,13 +1128,6 @@ static xp_awk_nde_t* __parse_statement_nb (xp_awk_t* awk)
static xp_awk_nde_t* __parse_expression (xp_awk_t* awk) static xp_awk_nde_t* __parse_expression (xp_awk_t* awk)
{ {
/*
* <expression> ::= <assignment> | <basic expression>
* <assignment> ::= <assignment target> assignmentOperator <basic expression>
* assignmentOperator ::= '='
* <basic expression> ::=
*/
xp_awk_nde_t* x, * y; xp_awk_nde_t* x, * y;
xp_awk_nde_ass_t* nde; xp_awk_nde_ass_t* nde;
int opcode; int opcode;
@ -1622,7 +1616,47 @@ static xp_awk_nde_t* __parse_shift (xp_awk_t* awk)
{ TOKEN_EOF, 0 } { TOKEN_EOF, 0 }
}; };
return __parse_binary_expr (awk, map, __parse_additive); return __parse_binary_expr (awk, map, __parse_concat);
}
static xp_awk_nde_t* __parse_concat (xp_awk_t* awk)
{
xp_awk_nde_exp_t* nde;
xp_awk_nde_t* left, * right;
left = __parse_additive (awk);
if (left == XP_NULL) return XP_NULL;
/* TODO: write a better code to do this....
* first of all, is the following check sufficient??? */
while (awk->token.type > TOKEN_QUEST)
{
right = __parse_additive (awk);
if (right == XP_NULL)
{
xp_awk_clrpt (left);
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);
xp_awk_clrpt (right);
PANIC (awk, XP_AWK_ENOMEM);
}
nde->type = XP_AWK_NDE_EXP_BIN;
nde->next = XP_NULL;
nde->opcode = XP_AWK_BINOP_CONCAT;
nde->left = left;
nde->right = right;
left = (xp_awk_nde_t*)nde;
}
return left;
} }
static xp_awk_nde_t* __parse_additive (xp_awk_t* awk) static xp_awk_nde_t* __parse_additive (xp_awk_t* awk)

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.c,v 1.114 2006-06-29 14:38:01 bacon Exp $ * $Id: run.c,v 1.115 2006-06-29 15:40:30 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -112,6 +112,8 @@ static xp_awk_val_t* __eval_binop_mod (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right); xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right);
static xp_awk_val_t* __eval_binop_exp ( static xp_awk_val_t* __eval_binop_exp (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right); xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right);
static xp_awk_val_t* __eval_binop_concat (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right);
static xp_awk_val_t* __eval_binop_ma ( static xp_awk_val_t* __eval_binop_ma (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right); xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right);
static xp_awk_val_t* __eval_binop_nm ( static xp_awk_val_t* __eval_binop_nm (
@ -1514,6 +1516,7 @@ static xp_awk_val_t* __eval_binary (xp_awk_run_t* run, xp_awk_nde_t* nde)
__eval_binop_mod, __eval_binop_mod,
__eval_binop_exp, __eval_binop_exp,
__eval_binop_concat,
__eval_binop_ma, __eval_binop_ma,
__eval_binop_nm __eval_binop_nm
}; };
@ -2336,6 +2339,14 @@ static xp_awk_val_t* __eval_binop_exp (
return res; return res;
} }
static xp_awk_val_t* __eval_binop_concat (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
{
xp_printf (XP_T("eval_binop_concat not implemented yet...\n"));
PANIC (run, XP_AWK_EINTERNAL);
return XP_NULL;
}
static xp_awk_val_t* __eval_binop_ma ( static xp_awk_val_t* __eval_binop_ma (
xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right) xp_awk_run_t* run, xp_awk_val_t* left, xp_awk_val_t* right)
{ {

View File

@ -1,5 +1,5 @@
/* /*
* $Id: run.h,v 1.13 2006-04-29 12:09:29 bacon Exp $ * $Id: run.h,v 1.14 2006-06-29 15:40:30 bacon Exp $
*/ */
#ifndef _XP_AWK_RUN_H_ #ifndef _XP_AWK_RUN_H_
@ -50,6 +50,7 @@ enum
XP_AWK_BINOP_MOD, XP_AWK_BINOP_MOD,
XP_AWK_BINOP_EXP, XP_AWK_BINOP_EXP,
XP_AWK_BINOP_CONCAT,
XP_AWK_BINOP_MA, XP_AWK_BINOP_MA,
XP_AWK_BINOP_NM XP_AWK_BINOP_NM
}; };

View File

@ -1,5 +1,5 @@
/* /*
* $Id: tree.c,v 1.60 2006-06-29 14:38:01 bacon Exp $ * $Id: tree.c,v 1.61 2006-06-29 15:40:30 bacon Exp $
*/ */
#include <xp/awk/awk_i.h> #include <xp/awk/awk_i.h>
@ -48,6 +48,7 @@ static const xp_char_t* __binop_str[] =
XP_T("%"), XP_T("%"),
XP_T("**"), XP_T("**"),
XP_T(" "),
XP_T("~"), XP_T("~"),
XP_T("!~") XP_T("!~")
}; };

View File

@ -29,4 +29,5 @@ BEGIN
getline x < "abc"; getline x < "abc";
print x > "abc"; print x > "abc";
print "abc" 1 + 2 3 + 49 2 / 3;
} }