Added QSE_AWK_TOLERANT

This commit is contained in:
2012-08-17 06:53:17 +00:00
parent ec5537a35f
commit 8f1e15366d
10 changed files with 582 additions and 175 deletions

View File

@ -311,7 +311,7 @@ static global_t gtab[] =
{ QSE_T("OFILENAME"), 9, QSE_AWK_PABLOCK | QSE_AWK_NEXTOFILE },
/* output real-to-str conversion format for 'print' */
{ QSE_T("OFMT"), 4, QSE_AWK_RIO},
{ QSE_T("OFMT"), 4, QSE_AWK_RIO },
/* output field separator for 'print' */
{ QSE_T("OFS"), 3, QSE_AWK_RIO },
@ -2727,6 +2727,16 @@ static qse_awk_nde_t* parse_print (
qse_awk_nde_t* args_tail;
qse_awk_nde_t* tail_prev;
/* print and printf provide weird syntaxs.
*
* 1. print 10, 20;
* 2. print (10, 20);
* 3. print (10,20,30) in a;
* 4. print ((10,20,30) in a);
*
* Due the case 3, i can't consume LPAREN
* here and expect RPAREN later.
*/
{
qse_awk_loc_t eloc = awk->tok.loc;
args = parse_expr_dc (awk, &eloc);
@ -2831,11 +2841,11 @@ static qse_awk_nde_t* parse_print (
if (out == QSE_NULL)
{
out_type = MATCH(awk,TOK_GT)? QSE_AWK_OUT_FILE:
MATCH(awk,TOK_RS)? QSE_AWK_OUT_APFILE:
MATCH(awk,TOK_RS)? QSE_AWK_OUT_APFILE:
MATCH(awk,TOK_BOR)? QSE_AWK_OUT_PIPE:
((awk->option & QSE_AWK_RWPIPE) &&
MATCH(awk,TOK_LOR))? QSE_AWK_OUT_RWPIPE:
QSE_AWK_OUT_CONSOLE;
MATCH(awk,TOK_LOR))? QSE_AWK_OUT_RWPIPE:
QSE_AWK_OUT_CONSOLE;
if (out_type != QSE_AWK_OUT_CONSOLE)
{
@ -2977,15 +2987,21 @@ static qse_awk_nde_t* parse_statement_nb (
if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_reset (awk, xloc);
}
else if (MATCH(awk,TOK_PRINT))
else if (!(awk->option & QSE_AWK_TOLERANT))
{
if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_print (awk, xloc, QSE_AWK_NDE_PRINT);
}
else if (MATCH(awk,TOK_PRINTF))
{
if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_print (awk, xloc, QSE_AWK_NDE_PRINTF);
/* in the non-tolerant mode, we treat print and printf
* as a separate statement */
if (MATCH(awk,TOK_PRINT))
{
if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_print (awk, xloc, QSE_AWK_NDE_PRINT);
}
else if (MATCH(awk,TOK_PRINTF))
{
if (get_token(awk) <= -1) return QSE_NULL;
nde = parse_print (awk, xloc, QSE_AWK_NDE_PRINTF);
}
else nde = parse_expr_dc (awk, xloc);
}
else
{
@ -3860,6 +3876,8 @@ static qse_awk_nde_t* parse_concat (
MATCH(awk,TOK_PLUSPLUS) ||
MATCH(awk,TOK_MINUSMINUS) ||
MATCH(awk,TOK_LNOT) ||
((awk->option & QSE_AWK_TOLERANT) &&
(awk->tok.type == TOK_PRINT || awk->tok.type == TOK_PRINTF)) ||
awk->tok.type >= TOK_GETLINE)
{
/* TODO: is the check above sufficient? */
@ -4514,9 +4532,9 @@ static qse_awk_nde_t* parse_primary_nogetline (
}
/* check if it is a chained node */
if (nde->next != QSE_NULL)
if (nde->next)
{
/* if so, it is a expression group */
/* if so, it is an expression group */
/* (expr1, expr2, expr2) */
qse_awk_nde_grp_t* tmp;
@ -4525,7 +4543,8 @@ static qse_awk_nde_t* parse_primary_nogetline (
awk->parse.id.stmt != TOK_PRINTF) ||
awk->parse.depth.cur.expr != 1)
{
if (!MATCH(awk,TOK_IN))
if (!(awk->option & QSE_AWK_TOLERANT) &&
!MATCH(awk,TOK_IN))
{
qse_awk_clrpt (awk, nde);
SETERR_TOK (awk, QSE_AWK_EKWIN);
@ -4611,6 +4630,21 @@ static qse_awk_nde_t* parse_primary_nogetline (
return (qse_awk_nde_t*)nde;
}
else if (awk->option & QSE_AWK_TOLERANT)
{
/* in the tolerant mode, we treat print and printf
* as a function like getline */
if (MATCH(awk,TOK_PRINT))
{
if (get_token(awk) <= -1) return QSE_NULL;
return parse_print (awk, xloc, QSE_AWK_NDE_PRINT);
}
else if (MATCH(awk,TOK_PRINTF))
{
if (get_token(awk) <= -1) return QSE_NULL;
return parse_print (awk, xloc, QSE_AWK_NDE_PRINTF);
}
}
/* valid expression introducer is expected */
if (MATCH(awk,TOK_NEWLINE))