bool group_tokens_into_statements(evl_statements &statements, evl_tokens &tokens)
{
	for (; !tokens.empty();)
	{ // generate one statement per iteration evl_token token = tokens.front();
		evl_token token = tokens.front();

		if (token.type != evl_token::NAME)
		{
			std::cerr << "Need a NAME token but found '" << token.str << "' on line " << token.line_no << std::endl;
			return false;
		}
		if (token.str == "module") // MODULE statement 
		{
			evl_statement module;
			module.type = evl_statement::MODULE;
			if (!move_tokens_to_statement(module.tokens, tokens))
				return false;
			statements.push_back(module);

		}
		else if (token.str == "endmodule") // ENDMODULE statement 
		{
			evl_statement endmodule;
			endmodule.type = evl_statement::ENDMODULE; endmodule.tokens.push_back(token);
			tokens.erase(tokens.begin()); statements.push_back(endmodule);


		}
		else if (token.str == "wire") // WIRE statement
		{
			evl_statement wire;
			wire.type = evl_statement::WIRE;
			if (!move_tokens_to_statement(wire.tokens, tokens))
				return false;
			statements.push_back(wire);
		}
        
        //ASSIGN statement
        else if (token.str == "assign"){
            evl_statement assign;
            assign.type = evl_statement::ASSIGN;
            if (!move_tokens_to_statement(assign.tokens, tokens))
                return false;
            statements.push_back(assign);
        }
        
        
        
		else // COMPONENT statement
		{
			evl_statement component;
			component.type = evl_statement::COMPONENT;
			if (!move_tokens_to_statement(component.tokens, tokens))
				return false;
			statements.push_back(component);
		}
	}
	return true;
}
bool move_tokens_to_statement(evl_tokens &statement_tokens, evl_tokens &tokens)
{
	for (; !tokens.empty();)
	{
		statement_tokens.push_back(tokens.front());
		tokens.erase(tokens.begin()); // consume one token per iteration 
		if (statement_tokens.back().str == ";")
			break; // exit if the ending ";" is found 
	}
	if (statement_tokens.back().str != ";")
	{
		std::cerr << "Look for ';' but reach the end of file" << std::endl;
		return false;
	}
	return true;
}
Beispiel #3
0
bool move_wire_to_statement(evl_tokens &statement_tokens, evl_tokens &tokens) {
	assert(statement_tokens.empty());
	assert(!tokens.empty());

	for (; !tokens.empty();) {
		statement_tokens.push_back(tokens.front());
		tokens.erase(tokens.begin());
		if (statement_tokens.back().str == "=")
			break;		//exit if the ending "=" is found
	}
	if (statement_tokens.back().str != "=") {
		std::cerr << "Look for '=' but reach the end of file" << std::endl;
		return false;
	}
	return true;
}
// This function iterates through the vector and display a formatted line for each token
void display_tokens(ostream &out, const evl_tokens tokens)
{
	for (evl_tokens::const_iterator iter = tokens.begin(); iter != tokens.end(); ++iter) 
	{
		if(iter->type == evl_token::SINGLE)
		{
			out << "SINGLE " << iter->name << endl;	
		}
		else if(iter->type == evl_token::NAME)
		{
			out << "NAME " << iter->name << endl;
		}
		else {
			out << "NUMBER " << iter->name << endl;
		}
		
	}
}
Beispiel #5
0
void display_tokens(std::ostream &out, const evl_tokens &tokens) {
	

	for (evl_tokens::const_iterator iter = tokens.begin(); iter != tokens.end(); ++iter){
		if (iter->type == evl_token::SINGLE){
			out << "SINGLE " << iter->str << std::endl;
		}
		else if (iter->type == evl_token::NAME) {
			out << "NAME " << iter->str << std::endl;
		}
		else if (iter->type == evl_token::NUMBER) {
			out << "NUMBER " << iter->str << std::endl;
		}
		else {
			out << "LINE " << iter->line_no << ": invalid character" << std::endl;

		}
	}


}