Skip to content

Commit

Permalink
hw5 fix if bug
Browse files Browse the repository at this point in the history
  • Loading branch information
lydia7635 committed Dec 31, 2020
1 parent 2c1370a commit 0ef36e8
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 39 deletions.
98 changes: 67 additions & 31 deletions hw5/src/codeGen.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ void gen_block(AST_NODE *blockNode, int *ARoffset, char *funcName);
void gen_localVar(AST_NODE *blockNode, int *ARoffset);
int isRelOp(EXPRSemanticValue exprSemanticValue);
void gen_expr(AST_NODE *exprNode, int *ARoffset);
void gen_stmt(AST_NODE *stmtNode, int *ARoffset, char *funcName);

FILE *output;

Expand Down Expand Up @@ -397,10 +398,10 @@ void gen_if(AST_NODE *stmtNode, int *ARoffset, char *funcName)
free_reg(0);
free_reg(1);
}
gen_block(stmtNode->child->rightSibling, ARoffset, funcName);
gen_stmt(stmtNode->child->rightSibling, ARoffset, funcName);
fprintf(output, "\tj IF_exit%d\n", cur_if);
fprintf(output, "IF_else%d:\n", cur_if);
gen_block(stmtNode->child->rightSibling->rightSibling, ARoffset, funcName);
gen_stmt(stmtNode->child->rightSibling->rightSibling, ARoffset, funcName);
fprintf(output, "IF_exit%d:\n", cur_if);
return;
}
Expand Down Expand Up @@ -614,6 +615,40 @@ void gen_return(AST_NODE *returnNode, int *ARoffset, char *funcName)
return;
}

void gen_stmt(AST_NODE *stmtNode, int *ARoffset, char *funcName)
{
if( stmtNode->nodeType == BLOCK_NODE ){
gen_block(stmtNode, ARoffset, funcName);
}
else if (stmtNode->nodeType != NUL_NODE){
switch(stmtNode->semantic_value.stmtSemanticValue.kind){
case WHILE_STMT:
gen_while(stmtNode, ARoffset, funcName);
break;
case FOR_STMT:
gen_for(stmtNode, ARoffset, funcName);
break;
case IF_STMT:
gen_if(stmtNode, ARoffset, funcName);
break;
case FUNCTION_CALL_STMT:
gen_function_call(stmtNode, ARoffset);
if( stmtNode->dataType == INT_TYPE )
free_reg(0);
else if( stmtNode->dataType == FLOAT_TYPE )
free_reg(1);
break;
case ASSIGN_STMT:
gen_assign(stmtNode->child,stmtNode->child->rightSibling, ARoffset);
break;
case RETURN_STMT:
gen_return(stmtNode, ARoffset, funcName);
break;
}
}
return;
}

void gen_block(AST_NODE *blockNode, int *ARoffset, char *funcName)
{
if( blockNode->child == NULL )
Expand All @@ -632,35 +667,36 @@ void gen_block(AST_NODE *blockNode, int *ARoffset, char *funcName)
}
AST_NODE *stmtNode = stmtListNode->child;
while( stmtNode != NULL ){
if( stmtNode->nodeType == BLOCK_NODE ){
gen_block(stmtNode, ARoffset, funcName);
}
else if (stmtNode->nodeType != NUL_NODE){
switch(stmtNode->semantic_value.stmtSemanticValue.kind){
case WHILE_STMT:
gen_while(stmtNode, ARoffset, funcName);
break;
case FOR_STMT:
gen_for(stmtNode, ARoffset, funcName);
break;
case IF_STMT:
gen_if(stmtNode, ARoffset, funcName);
break;
case FUNCTION_CALL_STMT:
gen_function_call(stmtNode, ARoffset);
if( stmtNode->dataType == INT_TYPE )
free_reg(0);
else if( stmtNode->dataType == FLOAT_TYPE )
free_reg(1);
break;
case ASSIGN_STMT:
gen_assign(stmtNode->child,stmtNode->child->rightSibling, ARoffset);
break;
case RETURN_STMT:
gen_return(stmtNode, ARoffset, funcName);
break;
}
}
gen_stmt(stmtNode, ARoffset, funcName);
// if( stmtNode->nodeType == BLOCK_NODE ){
// gen_block(stmtNode, ARoffset, funcName);
// }
// else if (stmtNode->nodeType != NUL_NODE){
// switch(stmtNode->semantic_value.stmtSemanticValue.kind){
// case WHILE_STMT:
// gen_while(stmtNode, ARoffset, funcName);
// break;
// case FOR_STMT:
// gen_for(stmtNode, ARoffset, funcName);
// break;
// case IF_STMT:
// gen_if(stmtNode, ARoffset, funcName);
// break;
// case FUNCTION_CALL_STMT:
// gen_function_call(stmtNode, ARoffset);
// if( stmtNode->dataType == INT_TYPE )
// free_reg(0);
// else if( stmtNode->dataType == FLOAT_TYPE )
// free_reg(1);
// break;
// case ASSIGN_STMT:
// gen_assign(stmtNode->child,stmtNode->child->rightSibling, ARoffset);
// break;
// case RETURN_STMT:
// gen_return(stmtNode, ARoffset, funcName);
// break;
// }
// }
stmtNode = stmtNode->rightSibling;
}
return;
Expand Down
10 changes: 3 additions & 7 deletions hw5/src/semanticAnalysis.c
Original file line number Diff line number Diff line change
Expand Up @@ -599,12 +599,8 @@ void processAssignmentStmt(AST_NODE* assignmentNode)
void processIfStmt(AST_NODE* ifNode)
{
processAssignmentStmt(ifNode->child); //assignment(condition)
openScope();
processBlockNode(ifNode->child->rightSibling); //"then" block
closeScope();
openScope();
processBlockNode(ifNode->child->rightSibling->rightSibling); //"else" block
closeScope();
processStmtNode(ifNode->child->rightSibling); //"then" block
processStmtNode(ifNode->child->rightSibling->rightSibling); //"else" block
return;
}

Expand Down Expand Up @@ -643,7 +639,7 @@ void processFunctionCall(AST_NODE* functionCallNode)
{
if( strcmp("write", functionCallNode->child->semantic_value.identifierSemanticValue.identifierName) == 0 ){
processWriteFunction(functionCallNode);
functionCallNode->dataType = INT_TYPE;
functionCallNode->dataType = VOID_TYPE;
}
else if( strcmp("read", functionCallNode->child->semantic_value.identifierSemanticValue.identifierName) == 0 ){
processReadFunction(functionCallNode);
Expand Down
2 changes: 1 addition & 1 deletion hw5/src/symbolTable.c
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ void initializeSymbolTable()
attribute->attributeKind = FUNCTION_SIGNATURE;
attribute->attr.functionSignature->parametersCount = 1;
attribute->attr.functionSignature->parameterList = NULL;
attribute->attr.functionSignature->returnType = INT_TYPE;
attribute->attr.functionSignature->returnType = VOID_TYPE;
enterSymbol(SYMBOL_TABLE_SYS_LIB_WRITE, attribute);

return;
Expand Down

0 comments on commit 0ef36e8

Please sign in to comment.