コード例 #1
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void DeclarationAssignmentStatementNode::Code(InstructionsClass & machineCode) {
	in->DeclareVariable();
	machineCode.PushValue(0);
	machineCode.PopAndStore(in->GetIndex());
	en->CodeEvaluate(machineCode);
	machineCode.PopAndStore(in->GetIndex());
}
コード例 #2
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void TimesAssignmentStatementNode::Code(InstructionsClass &machinecode) {
	MSG("    CODING MINUSASSIGNMENTSTATEMENTNODE");
	this->mIdentifierNode->CodeEvaluate(machinecode);
	this->mExpressionNode->CodeEvaluate(machinecode);
	machinecode.PopPopMulPush();
	machinecode.PopAndStore(this->mIdentifierNode->GetIndex());
}
コード例 #3
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void DivideAssignmentStatementNode::Code(InstructionsClass &machineCode) {
	// push vars value on stack
	machineCode.PushVariable(in->GetIndex());
	// put modifier on stack
	en->CodeEvaluate(machineCode);
	// divide those values
	machineCode.PopPopDivPush();
	// store result
	machineCode.PopAndStore(in->GetIndex());
}
コード例 #4
0
int main( void )
{
	cout << "in main of teste.cpp\n";
	// Create an array of machine codes, and stuff it with initial
	// machine codes that are at the beginning of every function:
	InstructionsClass code;

	// Generate machine code to push a literal integer onto the stack:
	code.PushValue(17);
	// Generate machine code to pop and print integer on top of stack:
	code.PopAndWrite();


	// Generate machine code to push a literal integer onto the stack:
	code.PushValue(27);
	// Generate machine code to pop the top of stack and move to variable index 99:
	code.PopAndStore(99);

	// Generate machine code to push variable 99's contents onto the stack:
	code.PushVariable(99); // (holds int 27 from before)
	// Generate machine code to pop and print integer on top of stack:
	code.PopAndWrite();

	// Generate machine code to return to the calling code:
	code.Finish();
	// Treat the array of machine codes like a function, and jump in!
	code.Execute();

	return 0;
}
コード例 #5
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void IfStatementNode::Code(InstructionsClass &machinecode) {
	MSG("    CODING IFSTATEMENTNODE");
	this->mExpressionNode->CodeEvaluate(machinecode);
	unsigned char * jump_address = machinecode.SkipIfZeroStack();

	unsigned char * address1 = machinecode.GetAddress();
	this->mStatementNode->Code(machinecode);
	unsigned char * address2 = machinecode.GetAddress();

	machinecode.SetOffset(jump_address, address2 - address1);
}
コード例 #6
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void CoutStatementNode::Code(InstructionsClass &machineCode) {
	for (unsigned int i = 0; i < ens.size(); i++) {
		if (ens.at(i) == NULL) {
			machineCode.WriteEndl();
		}
		else {
			ens.at(i)->CodeEvaluate(machineCode);
			machineCode.PopAndWrite();
		}
	}
}
コード例 #7
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void IfStatementNode::Code(InstructionsClass &machineCode) {
	// evaluate test and put on stack
	test->CodeEvaluate(machineCode);
	// get variable to record 'size' of block
	unsigned char* jump_address = machineCode.SkipIfZeroStack();
	// measure block 'size'
	unsigned char* block_start = machineCode.GetAddress();
	block->Code(machineCode);
	unsigned char* block_end = machineCode.GetAddress();
	// set variable that records 'size' of block
	machineCode.SetOffset(jump_address, block_end - block_start);
}
コード例 #8
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void CoutStatementNode::Code(InstructionsClass &machinecode) {
	MSG("    CODING COUTSTATEMENTNODE");
	for (unsigned int i = 0; i < this->mExpressionNodes.size(); i++) {
		if (this->mExpressionNodes[i])
		{
			this->mExpressionNodes[i]->CodeEvaluate(machinecode);
			machinecode.PopAndWrite();
		}
		else
		{
			machinecode.WriteEndl();
		}
	}
	//this->mExpressionNode->CodeEvaluate(machinecode);
	//machinecode.PopAndWrite();
}
コード例 #9
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void WhileStatementNode::Code(InstructionsClass &machineCode) {
	// store beginning of while evaluate
	unsigned char* begin_address = machineCode.GetAddress();
	// evaluate test and put on stack
	test->CodeEvaluate(machineCode);
	// get variable to record 'size' of block
	unsigned char* jump_address = machineCode.SkipIfZeroStack();
	// measure block 'size'
	unsigned char* block_start = machineCode.GetAddress();
	block->Code(machineCode);
	unsigned char* jump_address2 = machineCode.Jump();
	unsigned char* block_end = machineCode.GetAddress();
	// set variable that records 'size' of block
	machineCode.SetOffset(jump_address, block_end - block_start);
	// set variable that jumps to the while loop evaluate
	machineCode.SetOffset(jump_address2, begin_address - block_end);
}
コード例 #10
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void LessNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopLessPush();
}
コード例 #11
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void DivideNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopDivPush();
}
コード例 #12
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void TimesNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopMulPush();
}
コード例 #13
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void MinusNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopSubPush();
}
コード例 #14
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void TimesNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING TIMENODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopMulPush();
}
コード例 #15
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void PlusNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING PLUSNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopAddPush();
}
コード例 #16
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void AndNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopAndPush();
}
コード例 #17
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void IdentifierNode::CodeEvaluate(InstructionsClass &machineCode) {
	machineCode.PushVariable(table->GetIndex(label));
}
コード例 #18
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void NotEqualNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING NOTEQUALNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopNotEqualPush();
}
コード例 #19
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void IdentifierNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING IDENTIFIERNODE");
	machinecode.PushVariable(this->mSymbolTable->GetIndex(this->mLabel));
}
コード例 #20
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void GreaterEqualNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING GREATEREQUALNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopGreaterEqualPush();
}
コード例 #21
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void LessNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING LESSNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopLessPush();
}
コード例 #22
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void DivideNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING DIVIDENODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopDivPush();
}
コード例 #23
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void GreaterNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopGreaterPush();
}
コード例 #24
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void AndNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING ANDNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopAndPush();
}
コード例 #25
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void NotEqualNode::CodeEvaluate(InstructionsClass & machineCode) {
	lhs->CodeEvaluate(machineCode);
	rhs->CodeEvaluate(machineCode);
	machineCode.PopPopNotEqualPush();
}
コード例 #26
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void MinusNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING MINUSNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopSubPush();
}
コード例 #27
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void NotNode::CodeEvaluate(InstructionsClass & machineCode) {
	expression->CodeEvaluate(machineCode);
	machineCode.LogicalNot();
}
コード例 #28
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void IntegerNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING INTEGERNODE");
	machinecode.PushValue(this->mValue);
}
コード例 #29
0
ファイル: Node.cpp プロジェクト: i2c2-caj/Compiler
void AssignmentStatementNode::Code(InstructionsClass &machineCode) {
	en->CodeEvaluate(machineCode);
	machineCode.PopAndStore(in->GetIndex());
}
コード例 #30
0
ファイル: Node.cpp プロジェクト: kevbateman/cs4550
void OrNode::CodeEvaluate(InstructionsClass &machinecode) {
	MSG("\tCODING ORNODE");
	mLeft->CodeEvaluate(machinecode);
	mRight->CodeEvaluate(machinecode);
	machinecode.PopPopOrPush();
}