*** empty log message ***

This commit is contained in:
hyung-hwan 2007-03-05 14:58:36 +00:00
parent c1cd8fa18f
commit 7af37961ac
3 changed files with 57 additions and 69 deletions

View File

@ -1,5 +1,5 @@
/* /*
* $Id: awk.h,v 1.201 2007-03-04 15:04:40 bacon Exp $ * $Id: awk.h,v 1.202 2007-03-05 14:58:36 bacon Exp $
* *
* {License} * {License}
*/ */
@ -253,6 +253,7 @@ enum
ASE_AWK_ECOMMA, /* comma expected */ ASE_AWK_ECOMMA, /* comma expected */
ASE_AWK_ESCOLON, /* semicolon expected */ ASE_AWK_ESCOLON, /* semicolon expected */
ASE_AWK_ECOLON, /* colon expected */ ASE_AWK_ECOLON, /* colon expected */
ASE_AWK_ESTMEND, /* statement not ending with a semicolon */
ASE_AWK_EIN, /* keyword 'in' is expected */ ASE_AWK_EIN, /* keyword 'in' is expected */
ASE_AWK_ENOTVAR, /* not a variable name after 'in' */ ASE_AWK_ENOTVAR, /* not a variable name after 'in' */
ASE_AWK_EEXPRES, /* expression expected */ ASE_AWK_EEXPRES, /* expression expected */
@ -260,7 +261,7 @@ enum
ASE_AWK_EWHILE, /* keyword 'while' is expected */ ASE_AWK_EWHILE, /* keyword 'while' is expected */
ASE_AWK_EASSIGN, /* assignment statement expected */ ASE_AWK_EASSIGN, /* assignment statement expected */
ASE_AWK_EIDENT, /* identifier expected */ ASE_AWK_EIDENT, /* identifier expected */
ASE_AWK_EFNNAME, /* invalid function name */ ASE_AWK_EFNNAME, /* not a valid function name */
ASE_AWK_EBLKBEG, /* BEGIN requires an action block */ ASE_AWK_EBLKBEG, /* BEGIN requires an action block */
ASE_AWK_EBLKEND, /* END requires an action block */ ASE_AWK_EBLKEND, /* END requires an action block */
ASE_AWK_EDUPBEG, /* duplicate BEGIN */ ASE_AWK_EDUPBEG, /* duplicate BEGIN */

View File

@ -1,5 +1,5 @@
/* /*
* $Id: err.c,v 1.84 2007-03-04 15:04:40 bacon Exp $ * $Id: err.c,v 1.85 2007-03-05 14:58:36 bacon Exp $
* *
* {License} * {License}
*/ */
@ -59,13 +59,14 @@ static const ase_char_t* __geterrstr (int errnum)
ASE_T("unexpected end of a comment"), ASE_T("unexpected end of a comment"),
ASE_T("unexpected end of a string"), ASE_T("unexpected end of a string"),
ASE_T("unexpected end of a regular expression"), ASE_T("unexpected end of a regular expression"),
ASE_T("left brace expected"), ASE_T("a left brace expected"),
ASE_T("left parenthesis expected"), ASE_T("a left parenthesis expected"),
ASE_T("right parenthesis expected"), ASE_T("a right parenthesis expected in place of '%.*s'"),
ASE_T("right bracket expected"), ASE_T("a right bracket expected"),
ASE_T("comma expected"), ASE_T("a comma expected in place of '%.*s'"),
ASE_T("semicolon expected"), ASE_T("a semicolon expected in place of '%.*s'"),
ASE_T("colon expected"), ASE_T("a colon expected"),
ASE_T("statement not ending with a semicolon"),
ASE_T("keyword 'in' expected"), ASE_T("keyword 'in' expected"),
ASE_T("not a variable after 'in'"), ASE_T("not a variable after 'in'"),
ASE_T("expression expected"), ASE_T("expression expected"),

View File

@ -1,5 +1,5 @@
/* /*
* $Id: parse.c,v 1.250 2007-03-04 06:45:43 bacon Exp $ * $Id: parse.c,v 1.251 2007-03-05 14:58:36 bacon Exp $
* *
* {License} * {License}
*/ */
@ -126,9 +126,6 @@ struct __binmap_t
int binop; int binop;
}; };
#define PTR_EOF ASE_T("<EOF>")
#define LEN_EOF 5
static int __parse (ase_awk_t* awk); static int __parse (ase_awk_t* awk);
static ase_awk_t* __parse_progunit (ase_awk_t* awk); static ase_awk_t* __parse_progunit (ase_awk_t* awk);
@ -320,14 +317,35 @@ static global_t gtab[] =
#define ADD_TOKEN_CHAR(awk,c) \ #define ADD_TOKEN_CHAR(awk,c) \
do { \ do { \
if (ase_str_ccat(&(awk)->token.name,(c)) == (ase_size_t)-1) { \ if (ase_str_ccat(&(awk)->token.name,(c)) == (ase_size_t)-1) \
ase_awk_seterror_old (awk, ASE_AWK_ENOMEM, (awk)->token.line, ASE_NULL); \ { \
ase_awk_seterror (awk, ASE_AWK_ENOMEM, (awk)->token.line, ASE_NULL, 0); \
return -1; \ return -1; \
} \ } \
} while (0) } while (0)
#define MATCH(awk,token_type) ((awk)->token.type == (token_type)) #define MATCH(awk,token_type) ((awk)->token.type == (token_type))
#define SET_ERROR_TOKEN(awk,code) \
do { \
ase_cstr_t errarg; \
errarg.len = ASE_STR_LEN(&(awk)->token.name); \
errarg.ptr = ASE_STR_BUF(&(awk)->token.name); \
if (MATCH(awk,TOKEN_EOF)) \
ase_awk_seterror (awk, code, (awk)->token.prev.line, &errarg, 1); \
else \
ase_awk_seterror (awk, code, (awk)->token.line, &errarg, 1); \
} while (0)
#define SET_ERROR_TOKEN_LINE(awk,code,line) \
do { \
ase_cstr_t errarg; \
errarg.len = ASE_STR_LEN(&(awk)->token.name); \
errarg.ptr = ASE_STR_BUF(&(awk)->token.name); \
ase_awk_seterror (awk, code, line, &errarg, 1); \
} while (0)
#define SET_ERROR_0(awk,code,msg) \ #define SET_ERROR_0(awk,code,msg) \
do { \ do { \
if (MATCH(awk,TOKEN_EOF)) \ if (MATCH(awk,TOKEN_EOF)) \
@ -713,21 +731,7 @@ static ase_awk_nde_t* __parse_function (ase_awk_t* awk)
if (!MATCH(awk,TOKEN_IDENT)) if (!MATCH(awk,TOKEN_IDENT))
{ {
/* cannot find a valid identifier for a function name */ /* cannot find a valid identifier for a function name */
ase_cstr_t errarg; SET_ERROR_TOKEN (awk, ASE_AWK_EFNNAME);
if (MATCH(awk,TOKEN_EOF))
{
errarg.ptr = PTR_EOF;
errarg.len = LEN_EOF;
}
else
{
errarg.ptr = ASE_STR_BUF(&awk->token.name);
errarg.len = ASE_STR_LEN(&awk->token.name);
}
ase_awk_seterror (
awk, ASE_AWK_EFNNAME, awk->token.line, &errarg, 1);
return ASE_NULL; return ASE_NULL;
} }
@ -964,8 +968,7 @@ static ase_awk_nde_t* __parse_function (ase_awk_t* awk)
ASE_AWK_FREE (awk, name_dup); ASE_AWK_FREE (awk, name_dup);
ase_awk_tab_clear (&awk->parse.params); ase_awk_tab_clear (&awk->parse.params);
SET_ERROR_0 (awk, ASE_AWK_ECOMMA, SET_ERROR_TOKEN (awk, ASE_AWK_ECOMMA);
ASE_T("comma expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -1454,8 +1457,7 @@ static ase_awk_t* __collect_globals (ase_awk_t* awk)
if (!MATCH(awk,TOKEN_COMMA)) if (!MATCH(awk,TOKEN_COMMA))
{ {
SET_ERROR_0 (awk, ASE_AWK_ECOMMA, SET_ERROR_TOKEN (awk, ASE_AWK_ECOMMA);
ASE_T("comma expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -1596,8 +1598,7 @@ static ase_awk_t* __collect_locals (ase_awk_t* awk, ase_size_t nlocals)
if (!MATCH(awk,TOKEN_COMMA)) if (!MATCH(awk,TOKEN_COMMA))
{ {
SET_ERROR_0 (awk, ASE_AWK_ECOMMA, SET_ERROR_TOKEN (awk, ASE_AWK_ECOMMA);
ASE_T("comma expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -1768,18 +1769,8 @@ static ase_awk_nde_t* __parse_statement_nb (ase_awk_t* awk, ase_size_t line)
{ {
if (nde != ASE_NULL) ase_awk_clrpt (awk, nde); if (nde != ASE_NULL) ase_awk_clrpt (awk, nde);
if (MATCH(awk,TOKEN_EOF)) ase_awk_seterror (
{ awk, ASE_AWK_ESTMEND, awk->token.prev.line, ASE_NULL, 0);
ase_awk_seterror_old (
awk, ASE_AWK_EENDSRC,
awk->token.prev.line, ASE_NULL);
}
else
{
ase_awk_seterror_old (
awk, ASE_AWK_ESCOLON, awk->token.prev.line,
ASE_T("statement not terminated with a semicolon"));
}
return ASE_NULL; return ASE_NULL;
} }
@ -2849,8 +2840,7 @@ static ase_awk_nde_t* __parse_primary (ase_awk_t* awk, ase_size_t line)
{ {
ase_awk_clrpt (awk, nde); ase_awk_clrpt (awk, nde);
SET_ERROR_0 (awk, ASE_AWK_ERPAREN, SET_ERROR_TOKEN (awk, ASE_AWK_ERPAREN);
ASE_T("right parenthesis expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -3321,8 +3311,7 @@ static ase_awk_nde_t* __parse_fncall (
{ {
if (head != ASE_NULL) ase_awk_clrpt (awk, head); if (head != ASE_NULL) ase_awk_clrpt (awk, head);
SET_ERROR_0 (awk, ASE_AWK_ECOMMA, SET_ERROR_TOKEN (awk, ASE_AWK_ECOMMA);
ASE_T("comma expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -3401,9 +3390,7 @@ static ase_awk_nde_t* __parse_if (ase_awk_t* awk, ase_size_t line)
{ {
ase_awk_clrpt (awk, test); ase_awk_clrpt (awk, test);
SET_ERROR_0 ( SET_ERROR_TOKEN (awk, ASE_AWK_ERPAREN);
awk, ASE_AWK_ERPAREN,
ASE_T("right parenthesis expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -3482,9 +3469,8 @@ static ase_awk_nde_t* __parse_while (ase_awk_t* awk, ase_size_t line)
if (!MATCH(awk,TOKEN_RPAREN)) if (!MATCH(awk,TOKEN_RPAREN))
{ {
ase_awk_clrpt (awk, test); ase_awk_clrpt (awk, test);
SET_ERROR_0 (
awk, ASE_AWK_ERPAREN, SET_ERROR_TOKEN (awk, ASE_AWK_ERPAREN);
ASE_T("right parenthesis expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -3557,9 +3543,7 @@ static ase_awk_nde_t* __parse_for (ase_awk_t* awk, ase_size_t line)
if (!MATCH(awk,TOKEN_RPAREN)) if (!MATCH(awk,TOKEN_RPAREN))
{ {
ase_awk_clrpt (awk, init); ase_awk_clrpt (awk, init);
SET_ERROR_0 ( SET_ERROR_TOKEN (awk, ASE_AWK_ERPAREN);
awk, ASE_AWK_ERPAREN,
ASE_T("right parenthesis expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
@ -3601,8 +3585,7 @@ static ase_awk_nde_t* __parse_for (ase_awk_t* awk, ase_size_t line)
{ {
ase_awk_clrpt (awk, init); ase_awk_clrpt (awk, init);
SET_ERROR_0 (awk, ASE_AWK_ESCOLON, SET_ERROR_TOKEN (awk, ASE_AWK_ESCOLON);
ASE_T("semicolon expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
} }
@ -3628,8 +3611,7 @@ static ase_awk_nde_t* __parse_for (ase_awk_t* awk, ase_size_t line)
ase_awk_clrpt (awk, init); ase_awk_clrpt (awk, init);
ase_awk_clrpt (awk, test); ase_awk_clrpt (awk, test);
SET_ERROR_0 (awk, ASE_AWK_ESCOLON, SET_ERROR_TOKEN (awk, ASE_AWK_ESCOLON);
ASE_T("semicolon expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
} }
@ -3658,9 +3640,7 @@ static ase_awk_nde_t* __parse_for (ase_awk_t* awk, ase_size_t line)
ase_awk_clrpt (awk, test); ase_awk_clrpt (awk, test);
ase_awk_clrpt (awk, incr); ase_awk_clrpt (awk, incr);
SET_ERROR_0 ( SET_ERROR_TOKEN (awk, ASE_AWK_ERPAREN);
awk, ASE_AWK_ERPAREN,
ASE_T("right parenthesis expected in place of '%.*s'"));
return ASE_NULL; return ASE_NULL;
} }
} }
@ -4240,6 +4220,12 @@ static int __get_token (ase_awk_t* awk)
if (c == ASE_CHAR_EOF) if (c == ASE_CHAR_EOF)
{ {
ADD_TOKEN_CHAR (awk, ASE_T('<'));
ADD_TOKEN_CHAR (awk, ASE_T('E'));
ADD_TOKEN_CHAR (awk, ASE_T('O'));
ADD_TOKEN_CHAR (awk, ASE_T('F'));
ADD_TOKEN_CHAR (awk, ASE_T('>'));
SET_TOKEN_TYPE (awk, TOKEN_EOF); SET_TOKEN_TYPE (awk, TOKEN_EOF);
} }
else if (ASE_AWK_ISDIGIT (awk, c)/*|| c == ASE_T('.')*/) else if (ASE_AWK_ISDIGIT (awk, c)/*|| c == ASE_T('.')*/)