예제 #1
0
static void Term_print(ExprTerm term) {
   switch (term.t) {
      case TERM_ID:
         printf("%s", term.id);
         break;
      case TERM_LITERAL:
         Literal_print(term.val);
         break;
      case TERM_NULL:
         printf("NULL");
         break;
      case TERM_COLREF:
         if (term.ref->tableName)
            printf("%s.", term.ref->tableName);
         printf("%s", term.ref->columnName);
         break;
      case TERM_FUNC:
         switch (term.f.t) {
            case FUNC_AVG:
               printf("AVG(");
               Expression_print(term.f.expr);
               printf(")");
               break;
            case FUNC_COUNT:
               printf("COUNT(");
               Expression_print(term.f.expr);
               printf(")");
               break;
            case FUNC_MAX:
               printf("MAX(");
               Expression_print(term.f.expr);
               printf(")");
               break;
            case FUNC_MIN:
               printf("MIN(");
               Expression_print(term.f.expr);
               printf(")");
               break;
            case FUNC_SUM:
               printf("SUM(");
               Expression_print(term.f.expr);
               printf(")");
               break;
            default:
               printf("Unknown function");
         }
         break;
      default:
         printf("Unknown term type");
   }
}
예제 #2
0
void Expression_printList (Expression_t *expr) {
   int first = 1;
   printf("[");
   while (expr) {
      if (first) first = 0; else printf(", ");
      Expression_print(expr);
      expr = expr->next;
   }
   printf("]");
}
예제 #3
0
enum TermType Expression_type(Expression_t *expr) {
   enum TermType t1, t2;
   switch (expr->t) {
      case EXPR_TERM:
         return expr->expr.term.t;
      case EXPR_NEG:
         return Expression_type(expr->expr.unary.expr);
      default:
         t1 = Expression_type(expr->expr.binary.expr1);
         t2 = Expression_type(expr->expr.binary.expr2);
         if (t1 != t2) {
            fprintf(stderr, "Type mismatch on binary expression:\n");
            Expression_print(expr->expr.binary.expr1);
            fprintf(stderr, "\nis not the same type as\n");
            Expression_print(expr->expr.binary.expr2);
            exit(1);
         }
         return t1;
   }  
}
예제 #4
0
int main(int argc, char const *argv[])
{
   Expression_t *a = Term("a"),
              *b = Term("b"),
              *c = TermLiteral(litInt(5)),
              *plus = Plus(a,b),
              *mult = Multiply(plus, c);
   Expression_print(mult);
   append_expression(mult, plus);
   puts("");
   Expression_printList(mult);
   puts("");
   return 0;
}
예제 #5
0
void Condition_print(Condition_t *cond)
{
    if (!cond) return; /* just in case */
    switch(cond->t)
    {
    case RA_COND_EQ:
        Expression_print(cond->cond.comp.expr1);
        printf(" = ");
        Expression_print(cond->cond.comp.expr2);
        break;
    case RA_COND_LT:
        Expression_print(cond->cond.comp.expr1);
        printf(" < ");
        Expression_print(cond->cond.comp.expr2);
        break;
    case RA_COND_GT:
        Expression_print(cond->cond.comp.expr1);
        printf(" > ");
        Expression_print(cond->cond.comp.expr2);
        break;
    case RA_COND_LEQ:
        Expression_print(cond->cond.comp.expr1);
        printf(" <= ");
        Expression_print(cond->cond.comp.expr2);
        break;
    case RA_COND_GEQ:
        Expression_print(cond->cond.comp.expr1);
        printf(" >= ");
        Expression_print(cond->cond.comp.expr2);
        break;
    case RA_COND_AND:
        Condition_print(cond->cond.binary.cond1);
        printf(" and ");
        Condition_print(cond->cond.binary.cond2);
        break;
    case RA_COND_OR:
        Condition_print(cond->cond.binary.cond1);
        printf(" or ");
        Condition_print(cond->cond.binary.cond2);
        break;
    case RA_COND_NOT:
        if (cond->cond.unary.cond->t == RA_COND_EQ)
        {
            Expression_print(cond->cond.unary.cond->cond.comp.expr1);
            printf(" != ");
            Expression_print(cond->cond.unary.cond->cond.comp.expr2);
        }
        else
        {
            printf("not (");
            Condition_print(cond->cond.unary.cond);
            printf(")");
        }
        break;
    case RA_COND_IN:
        Expression_print(cond->cond.in.expr);
        printf(" in ");
        Literal_printList(cond->cond.in.values_list);
        break;
    default:
        puts("Unknown condession type");
    }
}
예제 #6
0
파일: main.c 프로젝트: zhuowei/SuperCalc
int main(int argc, char* argv[]) {
	Context* ctx = Context_new();
	register_math(ctx);
	
	for(nextLine(); !feof(stdin); nextLine()) {
		/* Strip trailing newline */
		char* end;
		if((end = strchr(line, '\n')) != NULL) *end = '\0';
		if((end = strchr(line, '\r')) != NULL) *end = '\0';
		if((end = strchr(line, '#')) != NULL) *end = '\0';
		
		const char* p = line;
		
		/* Get verbosity level */
		int verbose = 0;
		while(p[0] == '?') {
			verbose++;
			p++;
		}
		trimSpaces(&p);
		
		if(*p == '~') {
			/* Variable deletion */
			p++;
			
			char* name = nextToken(&p);
			if(name == NULL) {
				/* '~~~' means reset interpreter */
				if(p[0] == '~' && p[1] == '~') {
					/* Wipe out context */
					Context_free(ctx);
					ctx = Context_new();
					register_math(ctx);
					continue;
				}
				
				if(*p == '\0') {
					RAISE(earlyEnd());
					continue;
				}
				
				RAISE(badChar(*p));
				continue;
			}
			
			Context_del(ctx, name);
			
			free(name);
			
			continue;
		}
		
		/* Parse the user's input */
		Expression* expr = Expression_parse(&p);
		
		/* Print expression depending on verbosity */
		Expression_print(expr, ctx, verbose);
		
		/* Error? Go to next loop iteration */
		if(Expression_didError(expr)) {
			Expression_free(expr);
			continue;
		}
		
		/* Evaluate expression */
		Value* result = Expression_eval(expr, ctx);
		Expression_free(expr);
		
		/* Print result */
		Value_print(result, ctx);
		
		Value_free(result);
	}
	
	Context_free(ctx);
	
	return 0;
}
예제 #7
0
void Expression_print(Expression_t *expr) {
   if (expr->t != EXPR_TERM) printf("(");
   switch (expr->t) {
      case EXPR_CONCAT:
         Expression_print(expr->expr.binary.expr1);
         printf(" || ");
         Expression_print(expr->expr.binary.expr2);
         break;
      case EXPR_PLUS:
         Expression_print(expr->expr.binary.expr1);
         printf(" + ");
         Expression_print(expr->expr.binary.expr2);
         break;
      case EXPR_MINUS:
         Expression_print(expr->expr.binary.expr1);
         printf(" - ");
         Expression_print(expr->expr.binary.expr2);
         break;
      case EXPR_MULTIPLY:
         Expression_print(expr->expr.binary.expr1);
         printf(" * ");
         Expression_print(expr->expr.binary.expr2);
         break;
      case EXPR_DIVIDE:
         Expression_print(expr->expr.binary.expr1);
         printf(" / ");
         Expression_print(expr->expr.binary.expr2);
         break;
      case EXPR_NEG:
         printf("-");
         Expression_print(expr->expr.unary.expr);
         break;
      case EXPR_TERM:
         Term_print(expr->expr.term);
         break;
      default:
         printf("(Unknown expression type '%d')", expr->t);
   }
   if (expr->t != EXPR_TERM) printf(")");
   if (expr->alias) printf(" as %s", expr->alias);
}