Example #1
0
int SUB_STMT(){//SUB_STMT() 	| SUB_STATEMENT -> id=E; SUB_STATEMENT | STATEMENT_LIST SUB_STATEMENT | e
	if(getNextToken()==ID){
		printf("			assignment begins\n");
		sa_index++;
		if(getNextToken()==ASSIGN){
			sa_index++;
			if(E()==TRUE){
				if(getNextToken()==SEMICOLON){
					sa_index++;
					printf("			assignment ends\n");
					if(SUB_STMT()==TRUE){
						return TRUE;
					}
					return FALSE;
				}
			return FALSE;
			}
		return FALSE;
		}
	return FALSE;
	}
	if(STMT_LIST()==TRUE){
		if(SUB_STMT()==TRUE){
			return TRUE;
		}
		return FALSE;
	}
	return TRUE;
}
Example #2
0
int PROG_BODY(){
	printf("	Program body begins\n");
	if(getNextToken()==VAR){
		printf("		declaration begins\n");
		sa_index++;
		if(ID_LIST()==TRUE){
			if(getNextToken()==SEMICOLON){
				printf("		declaration ends\n");
				sa_index++;
				if(STMT_LIST()==TRUE){
					printf("	Program body ends\n");
					return TRUE;
				}
				return FALSE;
			}
			return FALSE;
		}
		return FALSE;
	}

	return FALSE;
}
Example #3
0
int c_codegen_recurse(c_tree tree, int *registerNo, int topLevel,
		int getAddress, const char *breakLabel, const char *continueLabel)
{
	if (tree == NULL)
		return *registerNo;

	switch (TREE_CODE(tree))
	{
		case TREE_INTEGER_CST :
			if (!topLevel)
			{
				SET(*registerNo, INTEGER_CST(tree)->val, "integer constant", "");
				return (*registerNo)++;
			}
			break;
		case TREE_IDENTIFIER :
			break;
		case TREE_CHAIN :
			while (tree)
			{
				c_codegen_recurse(CHAIN_VALUE(tree), registerNo, topLevel,
						getAddress, breakLabel, continueLabel);
				tree = CHAIN_NEXT(tree);
			}
			break;
		case TREE_EXPR :
			return exprCodeGen(tree, registerNo, topLevel, getAddress,
					breakLabel, continueLabel);
			break;
		case TREE_EXPR_LIST :
			if (EXPR_LIST(tree)->chain)
				c_codegen_recurse(EXPR_LIST(tree)->chain, registerNo, TRUE,
						getAddress, breakLabel, continueLabel);
			break;
		case TREE_WHILE :
			return whileCodeGen(tree, registerNo, topLevel, getAddress,
					breakLabel, continueLabel);
			break;
		case TREE_FOR :
			return forCodeGen(tree, registerNo, topLevel, getAddress,
					breakLabel, continueLabel);
			break;
		case TREE_IFELSE :
			return ifCodeGen(tree, registerNo, topLevel, getAddress,
					breakLabel, continueLabel);
			break;
		case TREE_EXPRSTMT :
			c_codegen_recurse(EXPR_STMT(tree)->expr, registerNo, topLevel,
					getAddress, breakLabel, continueLabel);
			break;
		case TREE_COMPOUND :
			if (COMPOUND_STMT(tree)->decllist)
				c_codegen_recurse(COMPOUND_STMT(tree)->decllist, registerNo,
						topLevel, getAddress, breakLabel, continueLabel);
			if (COMPOUND_STMT(tree)->stmtlist)
				c_codegen_recurse(COMPOUND_STMT(tree)->stmtlist, registerNo,
						topLevel, getAddress, breakLabel, continueLabel);
			break;
		case TREE_RETURN :
			return returnCodegen(tree, registerNo, getAddress, breakLabel,
					continueLabel);
			break;
		case TREE_DECL :
			return declCodeGen(tree, registerNo, topLevel, getAddress,
					breakLabel, continueLabel);
			break;
			//			}
			break;
		case TREE_STMT_LIST :
			if (STMT_LIST(tree)->head)
			{
				c_codegen_recurse(STMT_LIST(tree)->head, registerNo, topLevel,
						getAddress, breakLabel, continueLabel);
			}
			break;
		case TREE_BREAK :
			breakCodeGen(breakLabel);
			break;
		case TREE_CONTINUE :
			continueCodeGen(continueLabel);
			break;
		default :
			break;
	}

	return *registerNo;
}