*** empty log message ***
This commit is contained in:
		
							
								
								
									
										236
									
								
								ase/awk/parse.c
									
									
									
									
									
								
							
							
						
						
									
										236
									
								
								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 <xp/awk/awk.h> | #include <xp/awk/awk.h> | ||||||
| @ -25,10 +25,10 @@ enum | |||||||
| 	TOKEN_GT, | 	TOKEN_GT, | ||||||
| 	TOKEN_NOT, | 	TOKEN_NOT, | ||||||
| 	TOKEN_PLUS, | 	TOKEN_PLUS, | ||||||
| 	TOKEN_PLUS_PLUS, | 	TOKEN_PLUSPLUS, | ||||||
| 	TOKEN_PLUS_ASSIGN, | 	TOKEN_PLUS_ASSIGN, | ||||||
| 	TOKEN_MINUS, | 	TOKEN_MINUS, | ||||||
| 	TOKEN_MINUS_MINUS, | 	TOKEN_MINUSMINUS, | ||||||
| 	TOKEN_MINUS_ASSIGN, | 	TOKEN_MINUS_ASSIGN, | ||||||
| 	TOKEN_MUL, | 	TOKEN_MUL, | ||||||
| 	TOKEN_DIV, | 	TOKEN_DIV, | ||||||
| @ -40,6 +40,7 @@ enum | |||||||
| 	TOKEN_BOR, | 	TOKEN_BOR, | ||||||
| 	TOKEN_BXOR, | 	TOKEN_BXOR, | ||||||
| 	TOKEN_BAND, | 	TOKEN_BAND, | ||||||
|  | 	TOKEN_BNOT, | ||||||
|  |  | ||||||
| 	TOKEN_LPAREN, | 	TOKEN_LPAREN, | ||||||
| 	TOKEN_RPAREN, | 	TOKEN_RPAREN, | ||||||
| @ -52,7 +53,8 @@ enum | |||||||
| 	TOKEN_COMMA, | 	TOKEN_COMMA, | ||||||
| 	TOKEN_SEMICOLON, | 	TOKEN_SEMICOLON, | ||||||
|  |  | ||||||
| 	TOKEN_INTEGER, | 	TOKEN_INT, | ||||||
|  | 	TOKEN_REAL, | ||||||
| 	TOKEN_STRING, | 	TOKEN_STRING, | ||||||
| 	TOKEN_REGEX, | 	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_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_or (xp_awk_t* awk); | ||||||
| static xp_awk_nde_t* __parse_bitwise_xor (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_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); | ||||||
| @ -998,6 +1001,8 @@ static xp_awk_nde_t* __parse_expression (xp_awk_t* awk) | |||||||
| 	if (x == XP_NULL) return XP_NULL; | 	if (x == XP_NULL) return XP_NULL; | ||||||
| 	if (!MATCH(awk,TOKEN_ASSIGN)) return x; | 	if (!MATCH(awk,TOKEN_ASSIGN)) return x; | ||||||
|  |  | ||||||
|  | //TODO: PLUS_ASSIGN, MINUS_ASSIGN, .... | ||||||
|  | // | ||||||
| 	xp_assert (x->next == XP_NULL); | 	xp_assert (x->next == XP_NULL); | ||||||
| 	if (x->type != XP_AWK_NDE_ARG && | 	if (x->type != XP_AWK_NDE_ARG && | ||||||
| 	    x->type != XP_AWK_NDE_ARGIDX && | 	    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 } | 		{ 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); | 	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) | static xp_awk_nde_t* __parse_relational (xp_awk_t* awk) | ||||||
| { | { | ||||||
| 	xp_awk_nde_exp_t* nde; | 	__binmap_t map[] =  | ||||||
| 	xp_awk_nde_t* left, * right; |  | ||||||
| 	int opcode; |  | ||||||
|  |  | ||||||
| 	left = __parse_shift (awk); |  | ||||||
| 	if (left == XP_NULL) return XP_NULL; |  | ||||||
| 	 |  | ||||||
| 	while (1)  |  | ||||||
| 	{ | 	{ | ||||||
| 		if (MATCH(awk,TOKEN_GT)) opcode = XP_AWK_BINOP_GT; | 		{ TOKEN_GT, XP_AWK_BINOP_GT }, | ||||||
| 		else if (MATCH(awk,TOKEN_GE)) opcode = XP_AWK_BINOP_GE; | 		{ TOKEN_GE, XP_AWK_BINOP_GE }, | ||||||
| 		else if (MATCH(awk,TOKEN_LT)) opcode = XP_AWK_BINOP_LT; | 		{ TOKEN_LT, XP_AWK_BINOP_LT }, | ||||||
| 		else if (MATCH(awk,TOKEN_LE)) opcode = XP_AWK_BINOP_LE; | 		{ TOKEN_LE, XP_AWK_BINOP_LE }, | ||||||
| 		else break; | 		{ TOKEN_EOF, 0 } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 		if (__get_token(awk) == -1)  | 	return __parse_binary_expr (awk, map, __parse_shift); | ||||||
| 		{ |  | ||||||
| 			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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static xp_awk_nde_t* __parse_shift (xp_awk_t* awk) | static xp_awk_nde_t* __parse_shift (xp_awk_t* awk) | ||||||
| { | { | ||||||
| 	xp_awk_nde_exp_t* nde; | 	__binmap_t map[] =  | ||||||
| 	xp_awk_nde_t* left, * right; |  | ||||||
| 	int opcode; |  | ||||||
|  |  | ||||||
| 	left = __parse_additive (awk); |  | ||||||
| 	if (left == XP_NULL) return XP_NULL; |  | ||||||
| 	 |  | ||||||
| 	while (1)  |  | ||||||
| 	{ | 	{ | ||||||
| 		if (MATCH(awk,TOKEN_RSHIFT)) opcode = XP_AWK_BINOP_RSHIFT; | 		{ TOKEN_LSHIFT, XP_AWK_BINOP_LSHIFT }, | ||||||
| 		else if (MATCH(awk,TOKEN_LSHIFT)) opcode = XP_AWK_BINOP_LSHIFT; | 		{ TOKEN_RSHIFT, XP_AWK_BINOP_RSHIFT }, | ||||||
| 		else break; | 		{ TOKEN_EOF, 0 } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 		if (__get_token(awk) == -1)  | 	return __parse_binary_expr (awk, map, __parse_additive); | ||||||
| 		{ |  | ||||||
| 			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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static xp_awk_nde_t* __parse_additive (xp_awk_t* awk) | static xp_awk_nde_t* __parse_additive (xp_awk_t* awk) | ||||||
| { | { | ||||||
| 	xp_awk_nde_exp_t* nde; | 	__binmap_t map[] =  | ||||||
| 	xp_awk_nde_t* left, * right; |  | ||||||
| 	int opcode; |  | ||||||
|  |  | ||||||
| 	left = __parse_multiplicative (awk); |  | ||||||
| 	if (left == XP_NULL) return XP_NULL; |  | ||||||
| 	 |  | ||||||
| 	while (1)  |  | ||||||
| 	{ | 	{ | ||||||
| 		if (MATCH(awk,TOKEN_PLUS)) opcode = XP_AWK_BINOP_PLUS; | 		{ TOKEN_PLUS, XP_AWK_BINOP_PLUS }, | ||||||
| 		else if (MATCH(awk,TOKEN_MINUS)) opcode = XP_AWK_BINOP_MINUS; | 		{ TOKEN_MINUS, XP_AWK_BINOP_MINUS }, | ||||||
| 		else break; | 		{ TOKEN_EOF, 0 } | ||||||
|  | 	}; | ||||||
|  |  | ||||||
| 		if (__get_token(awk) == -1)  | 	return __parse_binary_expr (awk, map, __parse_multiplicative); | ||||||
| 		{ |  | ||||||
| 			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; |  | ||||||
| } | } | ||||||
|  |  | ||||||
| static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) | 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_exp_t* nde; | ||||||
| 	xp_awk_nde_t* left, * right; | 	xp_awk_nde_t* left, * right; | ||||||
| 	int opcode; | 	int opcode; | ||||||
| @ -1396,10 +1308,20 @@ static xp_awk_nde_t* __parse_multiplicative (xp_awk_t* awk) | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return left; | 	return left; | ||||||
|  | #endif | ||||||
| } | } | ||||||
|  |  | ||||||
| static xp_awk_nde_t* __parse_unary (xp_awk_t* awk) | 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); | 	return __parse_primary (awk); | ||||||
| } | } | ||||||
|  |  | ||||||
| @ -1500,7 +1422,7 @@ static xp_awk_nde_t* __parse_primary (xp_awk_t* awk) | |||||||
| 			PANIC (awk, XP_AWK_EUNDEF); | 			PANIC (awk, XP_AWK_EUNDEF); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 	else if (MATCH(awk,TOKEN_INTEGER))  | 	else if (MATCH(awk,TOKEN_INT))  | ||||||
| 	{ | 	{ | ||||||
| 		xp_awk_nde_int_t* nde; | 		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; | 		return (xp_awk_nde_t*)nde; | ||||||
| 	} | 	} | ||||||
| 	/* TODO: floating point number */ |  | ||||||
| 	/* |  | ||||||
| 	else if (MATCH(awk,TOKEN_REAL)) { | 	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))  { | 	else if (MATCH(awk,TOKEN_STRING))  { | ||||||
| 		xp_awk_nde_str_t* nde; | 		xp_awk_nde_str_t* nde; | ||||||
|  |  | ||||||
| @ -2190,7 +2130,7 @@ static int __get_token (xp_awk_t* awk) | |||||||
| 			GET_CHAR_TO (awk, c); | 			GET_CHAR_TO (awk, c); | ||||||
| 		} while (xp_isdigit(c)); | 		} while (xp_isdigit(c)); | ||||||
|  |  | ||||||
| 		SET_TOKEN_TYPE (awk, TOKEN_INTEGER); | 		SET_TOKEN_TYPE (awk, TOKEN_INT); | ||||||
| // TODO: enhance nubmer handling | // TODO: enhance nubmer handling | ||||||
| 	} | 	} | ||||||
| 	else if (xp_isalpha(c) || c == XP_CHAR('_'))  | 	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("&")); | 			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('+'))  | 	else if (c == XP_CHAR('+'))  | ||||||
| 	{ | 	{ | ||||||
| 		GET_CHAR_TO (awk, c); | 		GET_CHAR_TO (awk, c); | ||||||
| 		if (c == XP_CHAR('+'))  | 		if (c == XP_CHAR('+'))  | ||||||
| 		{ | 		{ | ||||||
| 			SET_TOKEN_TYPE (awk, TOKEN_PLUS_PLUS); | 			SET_TOKEN_TYPE (awk, TOKEN_PLUSPLUS); | ||||||
| 			ADD_TOKEN_STR (awk, XP_TEXT("++")); | 			ADD_TOKEN_STR (awk, XP_TEXT("++")); | ||||||
| 			GET_CHAR_TO (awk, c); | 			GET_CHAR_TO (awk, c); | ||||||
| 		} | 		} | ||||||
| @ -2354,7 +2300,7 @@ static int __get_token (xp_awk_t* awk) | |||||||
| 		GET_CHAR_TO (awk, c); | 		GET_CHAR_TO (awk, c); | ||||||
| 		if (c == XP_CHAR('-'))  | 		if (c == XP_CHAR('-'))  | ||||||
| 		{ | 		{ | ||||||
| 			SET_TOKEN_TYPE (awk, TOKEN_MINUS_MINUS); | 			SET_TOKEN_TYPE (awk, TOKEN_MINUSMINUS); | ||||||
| 			ADD_TOKEN_STR (awk, XP_TEXT("--")); | 			ADD_TOKEN_STR (awk, XP_TEXT("--")); | ||||||
| 			GET_CHAR_TO (awk, c); | 			GET_CHAR_TO (awk, c); | ||||||
| 		} | 		} | ||||||
|  | |||||||
| @ -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_ | #ifndef _XP_AWK_RUN_H_ | ||||||
| @ -29,19 +29,32 @@ enum | |||||||
| 	XP_AWK_BINOP_BOR, | 	XP_AWK_BINOP_BOR, | ||||||
| 	XP_AWK_BINOP_BXOR, | 	XP_AWK_BINOP_BXOR, | ||||||
| 	XP_AWK_BINOP_BAND, | 	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_EQ, | ||||||
| 	XP_AWK_BINOP_NE, | 	XP_AWK_BINOP_NE, | ||||||
| 	XP_AWK_BINOP_GT, | 	XP_AWK_BINOP_GT, | ||||||
| 	XP_AWK_BINOP_GE, | 	XP_AWK_BINOP_GE, | ||||||
| 	XP_AWK_BINOP_LT, | 	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 | #endif | ||||||
|  | |||||||
| @ -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 <xp/awk/awk.h> | #include <xp/awk/awk.h> | ||||||
| @ -66,7 +66,6 @@ int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2) | |||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
|  |  | ||||||
| xp_long_t xp_strtolong (xp_char_t* str) | xp_long_t xp_strtolong (xp_char_t* str) | ||||||
| { | { | ||||||
| 	xp_long_t n = 0; | 	xp_long_t n = 0; | ||||||
| @ -80,6 +79,12 @@ xp_long_t xp_strtolong (xp_char_t* str) | |||||||
| 	return n; | 	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, ...) | int xp_printf (const xp_char_t* fmt, ...) | ||||||
| { | { | ||||||
|  | |||||||
| @ -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_ | #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); | int xp_strcmp (const xp_char_t* s1, const xp_char_t* s2); | ||||||
| xp_long_t xp_strtolong (xp_char_t* str); | 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_printf (const xp_char_t* fmt, ...); | ||||||
| int xp_vprintf (const xp_char_t* fmt, xp_va_list ap); | int xp_vprintf (const xp_char_t* fmt, xp_va_list ap); | ||||||
|  | |||||||
| @ -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 <xp/awk/awk.h> | #include <xp/awk/awk.h> | ||||||
| @ -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("<=") | 	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); | static void __print_tabs (int depth); | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user