Exemple #1
0
void CAipi_ExpParser::expression_unary_plus()
{
	AfxMessageBox(_T("CASE UNARY"));
	emit_expression(UNARY_PLUS);
	getToken();
	expression_factor();
	emit_expression(UNARY_OP);
}
Exemple #2
0
void CAipi_ExpParser::expression_unary_minus()
{
	AfxMessageBox(_T("UNARY MINUS"));
	emit_expression(UNARY_MINUS);
	getToken();
	expression_factor();
	emit_expression(UNARY_OP);
}
void emitstmt(void* stmt){
	Syntax *st = (Syntax*) stmt;
	if(st->type == IF_STATEMENT){
		int label = labelconditionid++;
		char c[10];
		emit_condition(st->if_statement->condition,label);
		emitblock(st->if_statement->then);
		sprintf(c,".LC%d",label);
		emit_label(c);
	}else if(st->type == WHILE_SYNTAX){
		int labelcondition,labelblock;
		labelcondition = labelconditionid++;
		labelblock = labelconditionid++;
		char c[10];
		emit_instr_format("jmp",".LC%d",labelcondition);//to check condition
		sprintf(c,".LC%d",labelblock);
		emit_label(c);
		emitblock(st->while_statement->body);
		sprintf(c,".LC%d",labelcondition);
		emit_label(c);
		emit_condition(st->while_statement->condition,labelblock);
	}else if(st->type == PRINT_STATEMENT){
		emit_instr_format("leaq","%s(%%rip), %%rcx",st->printstmt->tag);
		emit_ins("call","printf");
	}else if(st->type == PRINTDEC_STATEMENT){
		emit_expression(st->printexp->exp);
		emit_ins("movq","%%rax, %%rdx");
		emit_ins("leaq",".DEC(%%rip), %%rcx");//.DEC print dec format
		emit_ins("call","printf");
	}else if(st->type == PRINTHEX_STATEMENT){
		emit_expression(st->printexp->exp);
		emit_ins("movq","%%rax, %%rdx");
		emit_ins("leaq",".HEX(%%rip), %%rcx");//.HEX print hex format
		emit_ins("call","printf");
	}else if(st->type == ASSIGNMENT){
		int tempoffset = findOffsetVar(st->assignment->var_name);//not found is -1
		if(tempoffset == -1){
			OffsetVarmap* temp = (OffsetVarmap*)malloc(sizeof(OffsetVarmap));
			temp->varname = st->assignment->var_name;
			temp->offset = offset;
			tempoffset = offset;
			//printf("offset %d \n",offset);
			offset = offset+8;
			list_push(tablevar,temp);
		}
		emit_expression(st->assignment->expression);
		emit_instr_format("movq","%%rax, -%d(%%rbp)",tempoffset);//result to variable.
	}else if(st->type == VARIABLE){
		OffsetVarmap *temp = (OffsetVarmap*)malloc(sizeof(OffsetVarmap));
		temp->varname = st->variable->var_name;
		temp->offset = offset;
		offset = offset+8;
		list_push(tablevar,temp);
	}else{
		fprintf(fp,"statement error");
	}
}
Exemple #4
0
void CAipi_ExpParser::operator_unary()
{
	switch(m_lookahead)
	{
	case PLUS_SIGN:
		emit_expression(PLUS_SIGN);
		break;
	case MINUS_SIGN:
		emit_expression(MINUS_SIGN);
		break;
	
	}

}
Exemple #5
0
void CAipi_ExpParser::expression_aritmetic()
{
	expression_term();
		
	while(true)
	{
		if( m_lookahead == PLUS_SIGN || m_lookahead == MINUS_SIGN )
		{
			int tk = m_lookahead;
			//AfxMessageBox(_T("Arit get Token"));
			getToken();
			//AfxMessageBox(_T("Arit get Term"));
			expression_term();
			//AfxMessageBox(_T("Arit emit_expression"));
			//CString str;
			//str.Format(_T("Look Ahead...%d  " ), m_lookahead);
			//AfxMessageBox(str);
			emit_expression(tk);
			
		}
		else
		{
			return;
		}
	}

}
Exemple #6
0
  void Prepreprocess::magic_quote(const std::string &line)
  {
    int end=line.length();
    bool use_suffix=true;

    state=START;

    for (int pos=0; pos<end; ++pos) {
      if (line[pos]=='$') {
	if (pos == end-1) {
	  use_suffix=false;
	  break;
	} else {
	  if (id0(line[pos+1])) {
	    ++pos;
	    int begin=pos;
	    while (pos < end && id1(line[pos])) ++pos;
	    emit_expression(line.substr(begin,(pos-begin)));
	    --pos;
	    continue;
	  }
	  if (line[pos+1] == '(') {
	    ++pos;
	    int begin=pos;
	    int parens=0;
	    while (pos < end) {
	      if (line[pos]=='(') ++parens;
	      if (line[pos]==')') {--parens; if (parens==0) { ++pos; break; } }
	      ++pos;
	    }
	    emit_expression(line.substr(begin,(pos-begin)));
	    --pos;
	    continue;
	  }
	  if (line[pos+1]=='$') {
	    ++pos;
	  }
	}
      }
      emit_char(line[pos]);
    }
    emit_end(use_suffix);
  }
Exemple #7
0
void CAipi_ExpParser::expression_unary_decrement()
{
	AfxMessageBox(_T("DECREMENT OPERATOR"));
	getToken();
	//It just apply to identifiers
	if( m_lookahead = IDENTIFIER )
	{
		expression_factor();
		emit_expression(DEC_OP);
	}
}
Exemple #8
0
void CAipi_ExpParser::type_name()
{
	//CString str;
	//str.Format(_T("SPECIFIER_QUALIFIER_LIST...%d  " ), m_lookahead);
	//AfxMessageBox(str);
	switch(m_lookahead)
	{
	case AIPI_CHAR:
		emit_expression(AIPI_CHAR);
		break;
	case AIPI_SHORT:
		emit_expression(AIPI_SHORT);
		break;
	case AIPI_INT:
		emit_expression(AIPI_INT);
		break;
	case AIPI_LONG:
		emit_expression(AIPI_LONG);
		break;
	case AIPI_FLOAT:
		emit_expression(AIPI_FLOAT);
		break;
	case AIPI_DOUBLE:
		emit_expression(AIPI_DOUBLE);
		break;
	}

}
Exemple #9
0
void CAipi_ExpParser::expression_atom_identifier()
{
	emit_expression(IDENTIFIER);
	getToken();
	if( m_lookahead == INC_OP )
	{
		expression_unary_increment();	
	}
	if( m_lookahead == DEC_OP )
	{
		expression_unary_decrement();
	}

}
Exemple #10
0
 void Prepreprocess::emit_end(bool use_suffix) { 
   if (use_suffix) emit_expression(suffix);
   if (state == SEPARATED) {
     (*out) << "\"";
     state=LITERAL;
   }
   if (state == LITERAL) {
     (*out) << "\"";
     state=READY;
   }
   if (state == READY) {
     (*out) << ";" << std::endl;
     state = START;
   }
 }
Exemple #11
0
void CAipi_ExpParser::operator_assigment()
{
	switch(m_lookahead)
	{
	case EQUAL:
		emit_expression(EQUAL);
		break;
	case MUL_ASSIGN:
		emit_expression(MUL_ASSIGN);
		break;
	case DIV_ASSIGN:
		emit_expression(DIV_ASSIGN);
		break;
	case ADD_ASSIGN:
		emit_expression(ADD_ASSIGN);
		break;
	case SUB_ASSIGN:
		emit_expression(SUB_ASSIGN);
		break;
	
	
	}

}
Exemple #12
0
void CAipi_ExpParser::expression_logical_and()
{
	expression_equality();
		
	while(true)
	{
		if( m_lookahead == AND_OP )
		{
			getToken();
			expression_equality();
			emit_expression(AND_OP);
		}
		else
		{
			return;
		}
	}

}
Exemple #13
0
void CAipi_ExpParser::expression_relational()
{
	expression_aritmetic();

	while(true)
	{
		if( m_lookahead == LT || m_lookahead == LE || m_lookahead == GT || m_lookahead == GE  )
		{
			int tk = m_lookahead;
			getToken();
			expression_aritmetic();
			emit_expression(tk);
		}
		else
		{
			return;
		}
	}
}
Exemple #14
0
void CAipi_ExpParser::expression_term()
{
	expression_factor();
	while(true)
	{
		if( m_lookahead == ASTERIC || m_lookahead == SLASH || m_lookahead == PERCENT )
		{
			int tk = m_lookahead;
			getToken();
			expression_factor();
			emit_expression(tk);
		}
		else
		{
			return;
		}
	}

}
Exemple #15
0
void CAipi_ExpParser::expression_equality()
{
	expression_relational();

	while(true)
	{
		if( m_lookahead == ET || m_lookahead == NE )
		{
			int tk = m_lookahead;
			getToken();
			expression_relational();
			emit_expression(tk);
		}
		else
		{
			return;
		}
	}

}
void emit_expression(Syntax *exp){
	if (exp->type == UNARY_OPERATOR) {
        UnaryExpression *unary_syntax = exp->unary_expression;
		emit_expression(unary_syntax->expression);
        
        if (unary_syntax->unary_type == BITWISE_NEGATION) {
            emit_ins("notq", "%%rax");
        } else {
            emit_ins("testq", "$0xFFFFFFFF, %%rax");
            emit_ins("setz", "%%al");
        }
    } else if (exp->type == IMMEDIATE) {
		//may be fix 64 bit
        emit_instr_format("movq", "$%d, %%rax", exp->immediate->value);

    } else if (exp->type == VARIABLE) {
		int tempoffset = findOffsetVar(exp->variable->var_name);
        emit_instr_format("movq", "-%d(%%rbp), %%rax",tempoffset);

    } else if (exp->type == BINARY_OPERATOR) {
        BinaryExpression *binary_syntax = exp->binary_expression;
		char l[20];
		char r[20];//digit no exceed 20 digit.
		if(binary_syntax->left->type == VARIABLE){
			int os = findOffsetVar(binary_syntax->left->variable->var_name);
			if(os == -1)
				printf("%s not initialize",binary_syntax->left->variable->var_name);
			sprintf(l,"-%d(%%rbp)",os);
		}else if(binary_syntax->left->type == IMMEDIATE){
			sprintf(l,"$%d",binary_syntax->left->immediate->value);
		}else{
			emit_expression(binary_syntax->left);
		}
		
		if(binary_syntax->right->type == VARIABLE){
			int os = findOffsetVar(binary_syntax->right->variable->var_name);
			if(os == -1)
				printf("%s not initialize",binary_syntax->right->variable->var_name);
			sprintf(r,"-%d(%%rbp)",os);
		}else if(binary_syntax->right->type == IMMEDIATE){
			sprintf(r,"$%d",binary_syntax->right->immediate->value);
		}else{
			emit_expression(binary_syntax->right);
		}
		/*
        int stack_offset = ctx->stack_offset;
        ctx->stack_offset -= WORD_SIZE;

        emit_instr(out, "sub", "$4, %esp");
        write_syntax(out, binary_syntax->left, ctx);
        emit_instr_format(out, "mov", "%%eax, %d(%%ebp)", stack_offset);

        write_syntax(out, binary_syntax->right, ctx);
		*/
		emit_instr_format("movq", "%%rax ,%%r8");//bug
		emit_instr_format("movq","%s ,%%rax",l);
        if (binary_syntax->binary_type == MULTIPLICATION) {
            emit_instr_format("imulq", "%s ,%%rax",r);

        } else if (binary_syntax->binary_type == ADDITION) {
            emit_instr_format("addq", "%s ,%%rax",r);

        } else if (binary_syntax->binary_type == SUBTRACTION) {
			emit_instr_format("movq", "%s, %%r10", r);
            emit_ins("subq", "%%r10, %%rax");
            //emit_instr_format("movq", "%s, %%rax", r);

        } else if (binary_syntax->binary_type == DIVIDE) {
			emit_ins("cltd",NULL);
			emit_instr_format("idivl","%s",r);
		} else if (binary_syntax->binary_type == MODULO){
			emit_ins("cltd",NULL);
			emit_instr_format("idivl","%s",r);
			emit_ins("movq","%rdx, %rax");
		} else{
			printf("expression error");
		}

    } 
}
Exemple #17
0
void CAipi_ExpParser::expression_atom_literal()
{
	emit_expression(LITERAL);
	getToken();
}
Exemple #18
0
void emit_expression(expr *e) {
  // A NULL pointer is the same as the empty list.
  if (e == NULL) {
    printf("()");
    return;
  }

  switch (e->type) {
  // String expressions are printed out in quotes
  case STRING_EXPR:
    printf("\"%s\"", e->string_value);
    break;

  // Int expressions are directly printed
  case INT_EXPR:
    printf("%d", e->int_value);
    break;

  // Boolean expressions either print TRUE or FALSE
  case BOOL_EXPR:
    if (e->boolean_value)
      printf("TRUE");
    else
      printf("FALSE");
    break;

  // Symbols are directly printed
  case SYMBOL_EXPR:
    printf("%s", e->string_value);
    break;

  // Lists are printed, wrapped in parentheses
  case CELL_EXPR:
    printf("(");
    for (struct expr *curr = e; curr != NULL; curr = curr->tail) {
      emit_expression(curr->head);
      if (curr->tail != NULL)
        printf(" ");
    }
    printf(")");
    break;

  // Builtin-in function
  case BUILTIN_EXPR:
    printf("<built-in function>");
    break;

  // User-defined function object
  case FUNC_EXPR:
    printf("<%s args: ", e->ismacro ? "macro" : "function");
    emit_expression(e->arguments);
    printf(" body: ");
    emit_expression(e->body);
    printf(">");
    break;
  // Unkown expression type
  default:
    printf("UNKOWN_EXPR");
    break;
  }
}
Exemple #19
0
void CAipi_ExpParser::expression_atom_constant()
{
	emit_expression(DIGIT);
	getToken();

}