示例#1
0
// 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;
}
示例#2
0
/*
<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);
}