*** empty log message ***
This commit is contained in:
parent
f77ca39b83
commit
377b10e8f9
39
ase/awk/awk.txt
Normal file
39
ase/awk/awk.txt
Normal file
@ -0,0 +1,39 @@
|
||||
Variables
|
||||
|
||||
global variables (enabled when awk->opt & XP_AWK_OPT_VARDCL)
|
||||
|
||||
global x;
|
||||
global x, y;
|
||||
|
||||
local variables (enabled when awk->opt & XP_AWK_OPT_VARDCL)
|
||||
|
||||
local x;
|
||||
local x, y;
|
||||
|
||||
function arguments (enabled always)
|
||||
|
||||
function funca (x, y)
|
||||
|
||||
|
||||
local variables in function declaration (enabled when awk->opt & XP_AWK_OPT_FUNCLOCAL)
|
||||
|
||||
function funca (x, y, v1, v2)
|
||||
|
||||
|
||||
variables without any declarations (enabled when awk->opt & XP_AWK_OPT_NAMEDVAR)
|
||||
|
||||
x = 10; // x is put into the global hash table.
|
||||
|
||||
|
||||
Optimization
|
||||
|
||||
constant folding
|
||||
2 * 10 => 20
|
||||
|
||||
loop
|
||||
remove while (0) { ... }
|
||||
|
||||
if
|
||||
remove if (0) {}
|
||||
use else_part only
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: parse.c,v 1.30 2006-01-24 16:14:28 bacon Exp $
|
||||
* $Id: parse.c,v 1.31 2006-01-25 04:27:01 bacon Exp $
|
||||
*/
|
||||
|
||||
#include <xp/awk/awk.h>
|
||||
@ -106,7 +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);
|
||||
static xp_size_t __find_func_arg (xp_awk_t* awk, const xp_char_t* name);
|
||||
static xp_long_t __str_to_long (const xp_char_t* name);
|
||||
|
||||
struct __kwent
|
||||
{
|
||||
@ -237,6 +238,7 @@ static xp_awk_node_t* __parse_progunit (xp_awk_t* awk)
|
||||
// TODO: weave the action block into awk->tree.actions...
|
||||
}
|
||||
|
||||
xp_awk_prnpt(node);
|
||||
return node;
|
||||
}
|
||||
|
||||
@ -722,6 +724,8 @@ static xp_awk_node_t* __parse_additive (xp_awk_t* awk, xp_char_t* ident)
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
// TODO: constant folding -> in other parts of the program also...
|
||||
|
||||
node = (xp_awk_node_expr_t*)xp_malloc(xp_sizeof(xp_awk_node_expr_t));
|
||||
if (node == XP_NULL) {
|
||||
xp_awk_clrpt (right);
|
||||
@ -767,6 +771,42 @@ static xp_awk_node_t* __parse_multiplicative (xp_awk_t* awk, xp_char_t* ident)
|
||||
return XP_NULL;
|
||||
}
|
||||
|
||||
/* TODO: enhance constant folding. do it in a better way */
|
||||
/* TODO: differentiate different types of numbers ... */
|
||||
if (left->type == XP_AWK_NODE_NUM &&
|
||||
right->type == XP_AWK_NODE_NUM) {
|
||||
xp_long_t l, r;
|
||||
xp_awk_node_term_t* tmp;
|
||||
xp_char_t buf[256];
|
||||
|
||||
l = __str_to_long (((xp_awk_node_term_t*)left)->value);
|
||||
r = __str_to_long (((xp_awk_node_term_t*)right)->value);
|
||||
|
||||
xp_awk_clrpt (left);
|
||||
xp_awk_clrpt (right);
|
||||
|
||||
if (opcode == BINOP_MUL) l *= r;
|
||||
else if (opcode == BINOP_DIV) l /= r;
|
||||
else if (opcode == BINOP_MOD) l %= r;
|
||||
|
||||
xp_sprintf (buf, xp_countof(buf), XP_TEXT("%lld"), (long long)l);
|
||||
|
||||
tmp = (xp_awk_node_term_t*) xp_malloc (xp_sizeof(xp_awk_node_term_t));
|
||||
if (tmp == XP_NULL) PANIC (awk, XP_AWK_ENOMEM);
|
||||
|
||||
tmp->type = XP_AWK_NODE_NUM;
|
||||
tmp->next = XP_NULL;
|
||||
tmp->value = xp_strdup (buf);
|
||||
|
||||
if (tmp->value == XP_NULL) {
|
||||
xp_free (tmp);
|
||||
PANIC (awk, XP_AWK_ENOMEM);
|
||||
}
|
||||
|
||||
left = (xp_awk_node_t*) tmp;
|
||||
continue;
|
||||
}
|
||||
|
||||
node = (xp_awk_node_expr_t*)xp_malloc(xp_sizeof(xp_awk_node_expr_t));
|
||||
if (node == XP_NULL) {
|
||||
xp_awk_clrpt (right);
|
||||
@ -1625,10 +1665,24 @@ static int __classfy_ident (const xp_char_t* 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;
|
||||
}
|
||||
|
||||
static xp_long_t __str_to_long (const xp_char_t* name)
|
||||
{
|
||||
xp_long_t n = 0;
|
||||
|
||||
while (xp_isdigit(*name)) {
|
||||
n = n * 10 + (*name - XP_CHAR('0'));
|
||||
name++;
|
||||
}
|
||||
|
||||
return n;
|
||||
}
|
||||
|
10
ase/awk/sa.h
10
ase/awk/sa.h
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sa.h,v 1.6 2006-01-20 17:00:36 bacon Exp $
|
||||
* $Id: sa.h,v 1.7 2006-01-25 04:27:01 bacon Exp $
|
||||
*/
|
||||
|
||||
#ifndef _XP_AWK_SA_H_
|
||||
@ -61,6 +61,12 @@ typedef long xp_ssize_t;
|
||||
typedef ssize_t xp_ssize_t;
|
||||
#endif
|
||||
|
||||
#if defined(_WIN32)
|
||||
typedef __int64 xp_long_t;
|
||||
#else
|
||||
typedef long long xp_long_t;
|
||||
#endif
|
||||
|
||||
#define XP_STR_LEN(x) ((x)->size)
|
||||
#define XP_STR_SIZE(x) ((x)->size + 1)
|
||||
#define XP_STR_CAPA(x) ((x)->capa)
|
||||
@ -84,7 +90,7 @@ xp_char_t* xp_strdup (const xp_char_t* str);
|
||||
|
||||
int xp_printf (const xp_char_t* fmt, ...);
|
||||
int xp_vprintf (const xp_char_t* fmt, xp_va_list ap);
|
||||
int xp_sprint (xp_char_t* buf, xp_size_t size, const xp_char_t* fmt, ...);
|
||||
int xp_sprintf (xp_char_t* buf, xp_size_t size, const xp_char_t* fmt, ...);
|
||||
int xp_vsprintf (
|
||||
xp_char_t* buf, xp_size_t size, const xp_char_t* fmt, xp_va_list ap);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user