214 - Code Generation

All about problems in Volume 2. If there is a thread about your problem, please use it. If not, create one with its number in the subject.

Moderator: Board moderators

andrei_vish
New poster
Posts: 4
Joined: Mon Nov 14, 2005 4:03 pm

Post by andrei_vish »

My code pass all tests listed here, but I got WA.
I don't know what's wrong ?

Code: Select all

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

enum TokenType
{
    UnaryOp, BinaryOp, Varible
};


TokenType GetTokenType(char token)
{
    if (token == '@')
        return UnaryOp;
    if (token == '+' || token == '-' || token == '*' || token == '/')
        return BinaryOp;
    else
        return Varible;
}

enum BinaryOperatorType
{
    Add, Sub, Mul, Div
};

BinaryOperatorType GetBinaryOperatorType(char op)
{
    switch(op) {
    case '+': return Add;
    case '-': return Sub;
    case '*': return Mul;
    case '/': return Div;
    }
	return Add;
}

unsigned mem;
char prevVar;
bool valueInStack;

void AddToStack(char val)
{
    switch(GetTokenType(val))
    {
    case Varible:
        {
			if (prevVar)
			{
				if (valueInStack)
					cout << "ST $" << mem++ << "\n";
				cout << "L " << prevVar << "\n";
				valueInStack = true;
			}
			prevVar = val;
        }
    	break;
    case UnaryOp:
        {
			if (prevVar)
			{
				if (valueInStack)
					cout << "ST $" << mem++ << "\n";
				cout << "L " << prevVar << "\n";
				prevVar = 0;
			}
			cout << "N\n";
        }
        break;
    case BinaryOp:
        {
			switch(GetBinaryOperatorType(val))
            {
            case Add:
				{
					if (prevVar)
					{
						cout << "A " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "A $" << --mem << "\n";
				}
                break;
            case Sub: 
				{
					if (prevVar)
					{
						cout << "S " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "N\nA $" << --mem << "\n";
				}
                break;
            case Mul: 
				{
					if (prevVar)
					{
						cout << "M " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "M $" << --mem << "\n";
				}
                break;
            case Div: 
				{
					if (prevVar)
					{						
						cout << "D " << prevVar << "\n";
						prevVar = 0;
					}
					else
					{
						cout << "ST $" << mem++ << "\n";
						cout << "L $" << mem - 2 << "\n";
						cout << "D $" << --mem << "\n";
						mem--;
					}
				}
                break;
            }
        }
        break;
    }
}


int main(int argc, char* argv[])
{
	string input;
	while (cin >> input)
	{
		static bool first = true;
		if (!first)
			cout << "\n";
		else
			first = false;
		mem = 1;
		prevVar = 0;
		valueInStack = false;

		for (unsigned i = 0; i < input.size(); ++i)
			AddToStack(input[i]);

		AddToStack(0);
	}

	return 0;
}
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm

Post by little joey »

Try this:

Code: Select all

A@B@+C@D@++ 
Your output contains more than one error...
andrei_vish
New poster
Posts: 4
Joined: Mon Nov 14, 2005 4:03 pm

Post by andrei_vish »

Thanks,
My answer for A@B@+C@D@++ is

Code: Select all

L A
N
ST $1
L B
N
A $1
ST $1
L C
N
ST $2
L D
N
A $2
A $1
but still got WA

Code: Select all

#include <iostream>
#include <string>
#include <vector>
#include <iterator>

using namespace std;

enum TokenType
{
    UnaryOp, BinaryOp, Varible
};


TokenType GetTokenType(char token)
{
    if (token == '@')
        return UnaryOp;
    if (token == '+' || token == '-' || token == '*' || token == '/')
        return BinaryOp;
    else
        return Varible;
}

enum BinaryOperatorType
{
    Add, Sub, Mul, Div
};

BinaryOperatorType GetBinaryOperatorType(char op)
{
    switch(op) {
    case '+': return Add;
    case '-': return Sub;
    case '*': return Mul;
    case '/': return Div;
    }
	return Add;
}

unsigned mem;
char prevVar;
bool valueInStack;

void AddToStack(char val)
{
    switch(GetTokenType(val))
    {
    case Varible:
        {
			if (prevVar)
			{
				if (valueInStack)
					cout << "ST $" << mem++ << "\n";
				cout << "L " << prevVar << "\n";
				valueInStack = true;
			}
			prevVar = val;
        }
    	break;
    case UnaryOp:
        {
			if (prevVar)
			{
				if (valueInStack)
					cout << "ST $" << mem++ << "\n";
				cout << "L " << prevVar << "\n";
				prevVar = 0;
                valueInStack = true;
			}
			cout << "N\n";
        }
        break;
    case BinaryOp:
        {
			switch(GetBinaryOperatorType(val))
            {
            case Add:
				{
					if (prevVar)
					{
						cout << "A " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "A $" << --mem << "\n";
				}
                break;
            case Sub: 
				{
					if (prevVar)
					{
						cout << "S " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "N\nA $" << --mem << "\n";
				}
                break;
            case Mul: 
				{
					if (prevVar)
					{
						cout << "M " << prevVar << "\n";
						prevVar = 0;
					}
					else
						cout << "M $" << --mem << "\n";
				}
                break;
            case Div: 
				{
					if (prevVar)
					{						
						cout << "D " << prevVar << "\n";
						prevVar = 0;
					}
					else
					{
						cout << "ST $" << mem++ << "\n";
						cout << "L $" << mem - 2 << "\n";
						cout << "D $" << --mem << "\n";
						mem--;
					}
				}
                break;
            }
        }
        break;
    }
}


int main(int argc, char* argv[])
{
	string input;
	while (cin >> input)
	{
		static bool first = true;
		if (!first)
			cout << "\n";
		else
			first = false;
		mem = 1;
		prevVar = 0;
		valueInStack = false;

		for (unsigned i = 0; i < input.size(); ++i)
			AddToStack(input[i]);

		AddToStack(0);
	}

	return 0;
}
little joey
Guru
Posts: 1080
Joined: Thu Dec 19, 2002 7:37 pm

Post by little joey »

Temporary storage locations are allocated by the assembler for an operand of the form ``$n" where n is a single digit.
But your code prints "$10" sometimes.
Hint: I got your code accepted by changing one single character in it.
andrei_vish
New poster
Posts: 4
Joined: Mon Nov 14, 2005 4:03 pm

Post by andrei_vish »

Thanks,
I fixed this bug and got AC.
sclo
Guru
Posts: 519
Joined: Mon Jan 23, 2006 10:45 pm
Location: Vancouver, BC, Canada
Contact:

Post by sclo »

N only negate the value in the register
so without A$1, the register would contain -(C+D) only
aerofoil.kite
New poster
Posts: 12
Joined: Tue Dec 06, 2011 8:59 pm
Location: Bangladesh
Contact:

Re: 214 Code Generation

Post by aerofoil.kite »

This is very important.. But i think everyone is missing this case...
$n, here n will be a single digit.. start n from zero.. Because it stores 10 operand..
Mir Shahriar Sabuj
Post Reply

Return to “Volume 2 (200-299)”