// Parse an additive expression. // // ordering-expr -> ordering-expr '<' additive-expr // | ordering-expr '>' additive-expr // | ordering-expr '<=' additive-expr // | ordering-expr '>=' additive-expr // | additive-expr Expr* Parser::ordering_expr() { Expr* e1 = additive_expr(); while (true) { if (match_if(lt_tok)) { Expr* e2 = additive_expr(); e1 = on_lt(e1, e2); } else if (match_if(gt_tok)) { Expr* e2 = additive_expr(); e1 = on_gt(e1, e2); } else if (match_if(le_tok)) { Expr* e2 = additive_expr(); e1 = on_le(e1, e2); } else if (match_if(ge_tok)) { Expr* e2 = additive_expr(); e1 = on_ge(e1, e2); } else { break; } } return e1; }
/* <bool_expr>::=<additive_expr> |< additive_expr >><additive_expr>@GT |< additive_expr ><<additive_expr>@LES |< additive_expr >>=<additive_expr >@GE |< additive_expr ><=< additive_expr >@LE |< additive_expr >==< additive_expr >@EQ |< additive_expr >!=< additive_expr >@NOTEQ */ int bool_expr() { int es = 0; es = additive_expr(); if (es > 0) return(es); if (strcmp(token, ">") == 0 || strcmp(token, ">=") == 0 || strcmp(token, "<") == 0 || strcmp(token, "<=") == 0 || strcmp(token, "==") == 0 || strcmp(token, "!=") == 0) { char token2[20]; strcpy(token2, token);//保存运算符 fscanf(fp, "%s %s\n", &token, &token1); printf("%s %s\n", token, token1); es = additive_expr(); if (es > 0) return(es); if (strcmp(token2, ">") == 0) fprintf(fout, " GT\n"); if (strcmp(token2, ">=") == 0) fprintf(fout, " GE\n"); if (strcmp(token2, "<") == 0) fprintf(fout, " LES\n"); if (strcmp(token2, "<=") == 0) fprintf(fout, " LE\n"); if (strcmp(token2, "==") == 0) fprintf(fout, " EQ\n"); if (strcmp(token2, "!=") == 0) fprintf(fout, " NOTEQ\n"); } return(es); }