*** empty log message ***
This commit is contained in:
parent
1f94f4c4e6
commit
6dc8b225d6
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: parse.c,v 1.129 2006-06-29 15:40:30 bacon Exp $
|
* $Id: parse.c,v 1.130 2006-06-30 03:53:16 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -68,6 +68,10 @@ enum
|
|||||||
TOKEN_BEGIN,
|
TOKEN_BEGIN,
|
||||||
TOKEN_END,
|
TOKEN_END,
|
||||||
TOKEN_FUNCTION,
|
TOKEN_FUNCTION,
|
||||||
|
|
||||||
|
TOKEN_LOCAL,
|
||||||
|
TOKEN_GLOBAL,
|
||||||
|
|
||||||
TOKEN_IF,
|
TOKEN_IF,
|
||||||
TOKEN_ELSE,
|
TOKEN_ELSE,
|
||||||
TOKEN_WHILE,
|
TOKEN_WHILE,
|
||||||
@ -78,15 +82,12 @@ enum
|
|||||||
TOKEN_RETURN,
|
TOKEN_RETURN,
|
||||||
TOKEN_EXIT,
|
TOKEN_EXIT,
|
||||||
TOKEN_DELETE,
|
TOKEN_DELETE,
|
||||||
TOKEN_GETLINE,
|
|
||||||
TOKEN_NEXT,
|
TOKEN_NEXT,
|
||||||
TOKEN_NEXTFILE,
|
TOKEN_NEXTFILE,
|
||||||
TOKEN_PRINT,
|
TOKEN_PRINT,
|
||||||
TOKEN_PRINTF,
|
TOKEN_PRINTF,
|
||||||
|
|
||||||
TOKEN_LOCAL,
|
TOKEN_GETLINE,
|
||||||
TOKEN_GLOBAL,
|
|
||||||
|
|
||||||
TOKEN_IDENT,
|
TOKEN_IDENT,
|
||||||
TOKEN_INT,
|
TOKEN_INT,
|
||||||
TOKEN_REAL,
|
TOKEN_REAL,
|
||||||
@ -184,11 +185,20 @@ struct __kwent
|
|||||||
|
|
||||||
static struct __kwent __kwtab[] =
|
static struct __kwent __kwtab[] =
|
||||||
{
|
{
|
||||||
|
/* operators */
|
||||||
|
{ XP_T("in"), TOKEN_IN, 0 },
|
||||||
|
|
||||||
|
/* top-level block starters */
|
||||||
{ XP_T("BEGIN"), TOKEN_BEGIN, 0 },
|
{ XP_T("BEGIN"), TOKEN_BEGIN, 0 },
|
||||||
{ XP_T("END"), TOKEN_END, 0 },
|
{ XP_T("END"), TOKEN_END, 0 },
|
||||||
|
|
||||||
{ XP_T("function"), TOKEN_FUNCTION, 0 },
|
{ XP_T("function"), TOKEN_FUNCTION, 0 },
|
||||||
{ XP_T("func"), TOKEN_FUNCTION, 0 },
|
{ XP_T("func"), TOKEN_FUNCTION, 0 },
|
||||||
|
|
||||||
|
/* keywords for variable declaration */
|
||||||
|
{ XP_T("local"), TOKEN_LOCAL, XP_AWK_EXPLICIT },
|
||||||
|
{ XP_T("global"), TOKEN_GLOBAL, XP_AWK_EXPLICIT },
|
||||||
|
|
||||||
|
/* keywords that start statements excluding expression statements */
|
||||||
{ XP_T("if"), TOKEN_IF, 0 },
|
{ XP_T("if"), TOKEN_IF, 0 },
|
||||||
{ XP_T("else"), TOKEN_ELSE, 0 },
|
{ XP_T("else"), TOKEN_ELSE, 0 },
|
||||||
{ XP_T("while"), TOKEN_WHILE, 0 },
|
{ XP_T("while"), TOKEN_WHILE, 0 },
|
||||||
@ -199,16 +209,13 @@ static struct __kwent __kwtab[] =
|
|||||||
{ XP_T("return"), TOKEN_RETURN, 0 },
|
{ XP_T("return"), TOKEN_RETURN, 0 },
|
||||||
{ XP_T("exit"), TOKEN_EXIT, 0 },
|
{ XP_T("exit"), TOKEN_EXIT, 0 },
|
||||||
{ XP_T("delete"), TOKEN_DELETE, 0 },
|
{ XP_T("delete"), TOKEN_DELETE, 0 },
|
||||||
{ XP_T("getline"), TOKEN_GETLINE, XP_AWK_EXTIO },
|
|
||||||
{ XP_T("next"), TOKEN_NEXT, 0 },
|
{ XP_T("next"), TOKEN_NEXT, 0 },
|
||||||
{ XP_T("nextfile"), TOKEN_NEXTFILE, 0 },
|
{ XP_T("nextfile"), TOKEN_NEXTFILE, 0 },
|
||||||
{ XP_T("print"), TOKEN_PRINT, XP_AWK_EXTIO },
|
{ XP_T("print"), TOKEN_PRINT, XP_AWK_EXTIO },
|
||||||
{ XP_T("printf"), TOKEN_PRINTF, XP_AWK_EXTIO },
|
{ XP_T("printf"), TOKEN_PRINTF, XP_AWK_EXTIO },
|
||||||
|
|
||||||
{ XP_T("local"), TOKEN_LOCAL, XP_AWK_EXPLICIT },
|
/* keywords that can start an expression */
|
||||||
{ XP_T("global"), TOKEN_GLOBAL, XP_AWK_EXPLICIT },
|
{ XP_T("getline"), TOKEN_GETLINE, XP_AWK_EXTIO },
|
||||||
|
|
||||||
{ XP_T("in"), TOKEN_IN, 0 },
|
|
||||||
|
|
||||||
{ XP_NULL, 0, 0 }
|
{ XP_NULL, 0, 0 }
|
||||||
};
|
};
|
||||||
@ -1629,7 +1636,7 @@ static xp_awk_nde_t* __parse_concat (xp_awk_t* awk)
|
|||||||
|
|
||||||
/* TODO: write a better code to do this....
|
/* TODO: write a better code to do this....
|
||||||
* first of all, is the following check sufficient??? */
|
* first of all, is the following check sufficient??? */
|
||||||
while (awk->token.type > TOKEN_QUEST)
|
while (MATCH(awk,TOKEN_LPAREN) || awk->token.type >= TOKEN_GETLINE)
|
||||||
{
|
{
|
||||||
right = __parse_additive (awk);
|
right = __parse_additive (awk);
|
||||||
if (right == XP_NULL)
|
if (right == XP_NULL)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: run.c,v 1.115 2006-06-29 15:40:30 bacon Exp $
|
* $Id: run.c,v 1.116 2006-06-30 03:53:16 bacon Exp $
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <xp/awk/awk_i.h>
|
#include <xp/awk/awk_i.h>
|
||||||
@ -13,6 +13,8 @@
|
|||||||
#include <xp/bas/memory.h>
|
#include <xp/bas/memory.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define DEF_BUF_CAPA 256
|
||||||
|
|
||||||
#define STACK_INCREMENT 512
|
#define STACK_INCREMENT 512
|
||||||
|
|
||||||
#define STACK_AT(run,n) ((run)->stack[(run)->stack_base+(n)])
|
#define STACK_AT(run,n) ((run)->stack[(run)->stack_base+(n)])
|
||||||
@ -250,14 +252,14 @@ static int __open_run (
|
|||||||
|
|
||||||
run->input.buf_pos = 0;
|
run->input.buf_pos = 0;
|
||||||
run->input.buf_len = 0;
|
run->input.buf_len = 0;
|
||||||
if (xp_str_open (&run->input.line, 256) == XP_NULL)
|
if (xp_str_open (&run->input.line, DEF_BUF_CAPA) == XP_NULL)
|
||||||
{
|
{
|
||||||
run->errnum = XP_AWK_ENOMEM;
|
run->errnum = XP_AWK_ENOMEM;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (xp_awk_map_open (&run->named,
|
if (xp_awk_map_open (&run->named,
|
||||||
run, 256, __free_namedval) == XP_NULL)
|
run, DEF_BUF_CAPA, __free_namedval) == XP_NULL)
|
||||||
{
|
{
|
||||||
xp_str_close (&run->input.line);
|
xp_str_close (&run->input.line);
|
||||||
run->errnum = XP_AWK_ENOMEM;
|
run->errnum = XP_AWK_ENOMEM;
|
||||||
@ -2342,9 +2344,49 @@ static xp_awk_val_t* __eval_binop_exp (
|
|||||||
static xp_awk_val_t* __eval_binop_concat (
|
static xp_awk_val_t* __eval_binop_concat (
|
||||||
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)
|
||||||
{
|
{
|
||||||
xp_printf (XP_T("eval_binop_concat not implemented yet...\n"));
|
xp_str_t lv, rv;
|
||||||
PANIC (run, XP_AWK_EINTERNAL);
|
xp_awk_val_t* res;
|
||||||
return XP_NULL;
|
int errnum;
|
||||||
|
|
||||||
|
if (xp_str_open (&lv, DEF_BUF_CAPA) == XP_NULL)
|
||||||
|
{
|
||||||
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xp_str_open (&rv, DEF_BUF_CAPA) == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_str_close (&lv);
|
||||||
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xp_awk_valtostr (left, &errnum, &lv) == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_str_close (&lv);
|
||||||
|
xp_str_close (&rv);
|
||||||
|
PANIC (run, errnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (xp_awk_valtostr (right, &errnum, &rv) == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_str_close (&lv);
|
||||||
|
xp_str_close (&rv);
|
||||||
|
PANIC (run, errnum);
|
||||||
|
}
|
||||||
|
|
||||||
|
res = xp_awk_makestrval2 (
|
||||||
|
XP_STR_BUF(&lv), XP_STR_LEN(&lv),
|
||||||
|
XP_STR_BUF(&rv), XP_STR_LEN(&rv));
|
||||||
|
if (res == XP_NULL)
|
||||||
|
{
|
||||||
|
xp_str_close (&lv);
|
||||||
|
xp_str_close (&rv);
|
||||||
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
|
}
|
||||||
|
|
||||||
|
xp_str_close (&lv);
|
||||||
|
xp_str_close (&rv);
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
static xp_awk_val_t* __eval_binop_ma (
|
static xp_awk_val_t* __eval_binop_ma (
|
||||||
@ -3108,7 +3150,7 @@ static xp_awk_val_t* __eval_getline (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
|||||||
dst = (in == XP_NULL)? XP_T(""): in;
|
dst = (in == XP_NULL)? XP_T(""): in;
|
||||||
|
|
||||||
/* TODO: optimization in line buffer management */
|
/* TODO: optimization in line buffer management */
|
||||||
if (xp_str_open (&buf, 256) == XP_NULL)
|
if (xp_str_open (&buf, DEF_BUF_CAPA) == XP_NULL)
|
||||||
{
|
{
|
||||||
if (in != XP_NULL) xp_free (in);
|
if (in != XP_NULL) xp_free (in);
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
@ -3306,7 +3348,7 @@ static xp_char_t* __idxnde_to_str (xp_awk_run_t* run, xp_awk_nde_t* nde)
|
|||||||
/* multidimensional index */
|
/* multidimensional index */
|
||||||
xp_str_t idxstr;
|
xp_str_t idxstr;
|
||||||
|
|
||||||
if (xp_str_open (&idxstr, 256) == XP_NULL)
|
if (xp_str_open (&idxstr, DEF_BUF_CAPA) == XP_NULL)
|
||||||
{
|
{
|
||||||
PANIC (run, XP_AWK_ENOMEM);
|
PANIC (run, XP_AWK_ENOMEM);
|
||||||
}
|
}
|
||||||
|
@ -29,5 +29,6 @@ BEGIN
|
|||||||
getline x < "abc";
|
getline x < "abc";
|
||||||
print x > "abc";
|
print x > "abc";
|
||||||
|
|
||||||
|
print 1 2 getline j j;
|
||||||
print "abc" 1 + 2 3 + 49 2 / 3;
|
print "abc" 1 + 2 3 + 49 2 / 3;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user