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 #2
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;
}
bool read_tokens_file(evl_tokens	&tokens, int argc, std::string file_name)
{
	if (argc < 2)
	{
		std::cerr << "You should provide a file name." << std::endl;
		return false;
	}
	std::ifstream input_file(file_name.c_str());
	if (!input_file)
	{
		std::cerr << "I can't read " << file_name.c_str() << "." << std::endl;
		return false;
	}

	std::string line;
	for (int line_no = 1; std::getline(input_file, line); ++line_no)//read a file
	{

		for (size_t i = 0; i < line.size();)//read a line
		{
			evl_token	token;
			token.line_no = line_no;
			//first word
			// spaces
			if (line[i] == ' ')
			{
				std::cerr << "wrong in .tokens file at line: " << line_no << std::endl;; // skip this space character
				return false; // skip the rest of the iteration
			}

			// type
			if ((line[i] == 'N') || (line[i] == 'S'))
			{
				size_t type_begin = i + 1;
				for (++i; i < line.size(); ++i)
				{
					if (line[i] == ' ')
					{
						++i;
						break; // [name_begin, i) is the range for the token
					}
				}
				if (line[type_begin] == 'I')
					token.type = evl_token::SINGLE;
				else if (line[type_begin] == 'A')
					token.type = evl_token::NAME;
				else if (line[type_begin] == 'U')
					token.type = evl_token::NUMBER;
				else
				{
					std::cerr << "Wrong Type in line: " << line_no << std::endl;
					return false;
				}
			}

			//second word

			// SINGLE
			if ((line[i] == '(') || (line[i] == ')')
				|| (line[i] == '[') || (line[i] == ']')
				|| (line[i] == ':') || (line[i] == ';')
				|| (line[i] == ','))
			{
				token.str = line[i];
				++i;
			}

			// NAME or NUMBER
			else
			{
				size_t str_begin = i;
				for (++i; i < line.size(); ++i)
				{
					if (line[i] == ' ')
					{
						break; // [name_begin, i) is the range for the token
					}
				}

				token.str = line.substr(str_begin, i - str_begin);
			}
			tokens.push_back(token);
		}
	}
	return true;


}
//This function extracts individual tokens from each line and stores them in the vector "tokens"
bool extract_tokens_from_Line(int line_index, string line, evl_tokens &tokens)
{
	
	for (size_t i =0; i < line.size(); i++) 
	{
		
		// COMMENT
		if(line[i] == '/')
		{
			i++;
			if(line[i] != '/' || i==line.size())
			{
				cerr << "a single '/' is not allowed" <<endl;
				return false;

			}
			break;
		}
		
		//SPACE
		else if (isspace(line[i])) 
		{
			continue;
		}
		
		//SINGLE
		else if ((line[i] == '(') || (line[i] == ')')
				 || (line[i] == '[') || (line[i] == ']')
				 || (line[i] == ':') || (line[i] == ';')
				 || (line[i] == ',')) 
		{
			evl_token token;
			token.lineNumber = line_index;
			token.name = string(1, line[i]);
			token.type = evl_token::SINGLE;
			tokens.push_back(token);
			continue;
		}
		
		//NAME
		else if (isalpha(line[i]) || line[i] == '_' || line[i] == '.' || line[i] == '\\') 
		{
			size_t name_begin = i;
			for (i++; i < line.size(); i++)
			{
				if (!(isalpha(line[i]) || line[i] == '_' || line[i] == '.' || line[i] == '\\' || isdigit(line[i])))
				{
					break; // [name_begin, i) is the range for the token
				}
			}
			evl_token token;
			token.lineNumber = line_index;
			token.name = line.substr(name_begin, i-name_begin);
			token.type = evl_token::NAME;
			tokens.push_back(token);
			i--;
			continue;
		}
		
		//NUMBER
		else if (isdigit(line[i]))
		{
			size_t num_begin =i;
			for (i++; i<line.size(); i++) 
			{
				
				if (!isdigit(line[i])) 
				{
					break;
				}
			}
			evl_token token;
			token.lineNumber = line_index;
			token.name = line.substr(num_begin, i-num_begin);
			token.type = evl_token::NUMBER;
			tokens.push_back(token);
			i--;
			continue;
		}
		
		else 
		{
			std::cerr << "LINE " << line_index << ": invalid character" << std::endl;
			return false;
		}
	}
	return true;
}
Beispiel #5
0
bool extract_tokens_from_line(std::string line, int line_no, evl_tokens &tokens) { // use reference to modify it
	for (size_t i = 0; i < line.size();) {
		// comments
		if (line[i] == '/') {
			++i;
			if ((i == line.size()) || (line[i] != '/')) {
				std::cerr << "LINE " << line_no << ": a single / is not allowed" << std::endl;
				return false;
			}
			break; // skip the rest of the line by exiting the loop
		}
		// comments part 2
		else if (line[i] == '#') {
			break; //Comment Detected, skip to next line
		}

		// spaces
		else if (isspace(line[i]))
		{
			++i; // skip this space character
			continue; // skip the rest of the iteration
		}

		// SINGLE
		else if (issingle(line[i])) {
			evl_token token;
			token.line_no = line_no;
			token.type = evl_token::SINGLE;
			token.str = std::string(1, line[i]);
			tokens.push_back(token);
			++i;										// we consumed this character
			continue;									 // skip the rest of the iteration
		}

		// NAME
		else if (isname(line[i])) {
			size_t name_begin = i;
			for (++i; i < line.size(); ++i)
			{
				if (!(isname(line[i]) || isdigit(line[i]))) {
					break;
				}
			}
			evl_token token;
			token.line_no = line_no;
			token.type = evl_token::NAME;
			token.str = std::string(line.substr(name_begin, i-name_begin));
			tokens.push_back(token);
		}
			
		// NUMBER
		else if (isdigit(line[i])){
			size_t number_begin = i;
			for(++i; i < line.size(); ++i)
			{
				if (isname(line[i])){
					std::cerr << "LINE " << line_no << ": invalid character" << std::endl;
					return false;
				}
				else if (issingle(line[i]) || !((line[i]) || isname(line[i]))) {
					break;
				}
			}
			evl_token token;
			token.line_no = line_no;
			token.type = evl_token::NUMBER;
			token.str = std::string(line.substr(number_begin, i-number_begin));
			tokens.push_back(token);
		}
		else
		{
			std::cerr << "LINE " << line_no << ": invalid character" << std::endl;
			return false;
		}
	}
	return true;
}