浏览代码

core: better config parsing error messages

- on expression parsing error try to keep the number of parsing
  error messages low
- better if parse error reporting
Andrei Pelinescu-Onciul 16 年之前
父节点
当前提交
420a756d6b
共有 1 个文件被更改,包括 26 次插入21 次删除
  1. 26 21
      cfg.y

+ 26 - 21
cfg.y

@@ -1859,16 +1859,18 @@ action:
 	;
 if_cmd:
 	IF rval_expr stm	{
-		if (rval_expr_int_check($2)>=0){
+		if ($2 && rval_expr_int_check($2)>=0){
 			warn_ct_rve($2, "if");
-		}
-		$$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, NOSUBTYPE, 0);
+			$$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, NOSUBTYPE, 0);
+		}else
+			YYERROR;
 	}
 	| IF rval_expr stm ELSE stm	{ 
-		if (rval_expr_int_check($2)>=0){
+		if ($2 && rval_expr_int_check($2)>=0){
 			warn_ct_rve($2, "if");
-		}
-		$$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, ACTIONS_ST, $5); 
+			$$=mk_action( IF_T, 3, RVE_ST, $2, ACTIONS_ST, $3, ACTIONS_ST, $5);
+		}else
+			YYERROR;
 	}
 	;
 
@@ -2263,11 +2265,10 @@ rve_op:		PLUS		{ $$=RVE_PLUS_OP; }
 */
 
 rval_expr: rval						{ $$=$1;
-										/*	if ($$==0){
-												yyerror("out of memory\n");
-												YYABORT;
-											}
-											*/
+										if ($$==0){
+											yyerror("out of memory\n");
+											YYABORT;
+										}
 									}
 		| rve_un_op %prec NOT rval_expr	{$$=mk_rve1($1, $2); }
 		| INTCAST rval_expr				{$$=mk_rve1(RVE_INT_OP, $2); }
@@ -2290,18 +2291,18 @@ rval_expr: rval						{ $$=$1;
 		| rve_un_op %prec NOT error		{ $$=0; yyerror("bad expression"); }
 		| INTCAST error					{ $$=0; yyerror("bad expression"); }
 		| STRCAST error					{ $$=0; yyerror("bad expression"); }
-		| rval_expr PLUS error			{ yyerror("bad expression"); }
-		| rval_expr MINUS error			{ yyerror("bad expression"); }
-		| rval_expr STAR error			{ yyerror("bad expression"); }
-		| rval_expr SLASH error			{ yyerror("bad expression"); }
-		| rval_expr BIN_OR error		{ yyerror("bad expression"); }
-		| rval_expr BIN_AND error		{ yyerror("bad expression"); }
+		| rval_expr PLUS error			{ $$=0; yyerror("bad expression"); }
+		| rval_expr MINUS error			{ $$=0; yyerror("bad expression"); }
+		| rval_expr STAR error			{ $$=0; yyerror("bad expression"); }
+		| rval_expr SLASH error			{ $$=0; yyerror("bad expression"); }
+		| rval_expr BIN_OR error		{ $$=0; yyerror("bad expression"); }
+		| rval_expr BIN_AND error		{ $$=0; yyerror("bad expression"); }
 		| rval_expr rve_cmpop %prec GT error
-			{ yyerror("bad expression"); }
+			{ $$=0; yyerror("bad expression"); }
 		| rval_expr rve_equalop %prec EQUAL_T error
-			{ yyerror("bad expression"); }
-		| rval_expr LOG_AND error		{ yyerror("bad expression"); }
-		| rval_expr LOG_OR error		{ yyerror("bad expression"); }
+			{ $$=0; yyerror("bad expression"); }
+		| rval_expr LOG_AND error		{ $$=0; yyerror("bad expression"); }
+		| rval_expr LOG_OR error		{ $$=0; yyerror("bad expression"); }
 		| STRLEN LPAREN error RPAREN	{ $$=0; yyerror("bad expression"); }
 		| STREMPTY LPAREN error RPAREN	{ $$=0; yyerror("bad expression"); }
 		| DEFINED error					{ $$=0; yyerror("bad expression"); }
@@ -2915,6 +2916,8 @@ static struct rval_expr* mk_rve1(enum rval_expr_op op, struct rval_expr* rve1)
 		yyerror_at(&rve1->fpos, "bad expression: type mismatch"
 					" (%s instead of %s)", rval_type_name(bad_t),
 					rval_type_name(exp_t));
+		rve_destroy(ret);
+		ret=0;
 	}
 	return ret;
 }
@@ -2947,6 +2950,8 @@ static struct rval_expr* mk_rve2(enum rval_expr_op op, struct rval_expr* rve1,
 						bad_rve->fpos.s_line, bad_rve->fpos.s_col);
 		else
 			yyerror("BUG: unexpected null \"bad\" expression\n");
+		rve_destroy(ret);
+		ret=0;
 	}
 	return ret;
 }