I need a program that opens a sample program and counts the number of reserved words, operands and operators. Operands and operators are easy to distinguish. My problem is how do I determine the reserved words there?

One solution I thought of is to create a separate text file that has all the reserved words in them to be used as a cross reference. Do you think this will work and if you have a better idea, I'd be glad to listen. Thanks.

P.S. I also would like to know what it means when you add the word unique as I'm tasked to find reserved words along with unique reserved words, operators along with unique operators and operands along with unique operands. Thanks again.

Recommended Answers

All 7 Replies

Just create a std::map with all of the reserved words, and check for them using that.
And for your post script, unique just means there is only one of.

Sorry, I don't know what you mean by std::map. Can you explain more?

Map info: http://www.cplusplus.com/reference/stl/map/

It'll work but another (perhaps less effective solution) is to use string.compare() to compare words from your file against reserved words. However this will take a lot more ressources and is far from effective. Just pointing out another way to do it.

Hi, I don't understand really how to use maps. I've already finished this by using a separate txt file and the line.find function in fstream. If you don't mind though, can you maybe explain maps a bit more or provide a simple example so I can use it in the future.

An old snippet -from here(excuse my amateur style, back then)-:

map<string, Element> elements;
    elements["H"]._Element(true, false, false, 1, 1, 1);
    elements["H"].name   = "Hydrogen";
    elements["H"].symbol = "H";
    elements["H"].amu    = 1.00794;

Do you know how to use any other STL containers or pointers/arrays?

Pointers and arrays, yes. Just the simple data structures. As for STL containers, well you lost me there. I'm a computer engineer so I deal mostly with hardware and ASM. Just doing this for a friend though.

Thanks for the snippet. Will go over it in a while.

Actually forget the map approach. For small set of data it might be better to use just a sorted array. For example :

#include <fstream>
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <algorithm>

using namespace std;

class KeywordDictionary{		
private:
	std::vector<string> keyWords;
public:
	KeywordDictionary(){ _init();}
	bool isKeyword(const std::string& word)const{ return _isKeyword(word); }
private:
	void _init(){
		keyWords.push_back("if");
		keyWords.push_back("int");
		keyWords.push_back("for");
		//and more
		std::sort(keyWords.begin(),keyWords.end());
	}
	//check if the passed word is a keyword
	//The function does not care about lower/upper case
	bool _isKeyword(const std::string& word)const{		
		struct NoCaseCompare{
			bool operator()(const std::string& lhs, const std::string& rhs){
				string lhsCpy(lhs), rhsCpy(rhs);
				std::transform(lhsCpy.begin(),lhsCpy.end(),lhsCpy.begin(),tolower);
				std::transform(rhsCpy.begin(),rhsCpy.end(),rhsCpy.begin(),tolower);
				return lhsCpy < rhsCpy;
			}
		};
		return std::binary_search(keyWords.begin(),keyWords.end(),word,NoCaseCompare());
	}

};
int main() {  	
	KeywordDictionary keywords;
	cout << keywords.isKeyword("IF") << " " << keywords.isKeyword("For") << " " << keywords.isKeyword("null") << endl;
}

and later on, you can change the underlying implementation without breaking the clients code, if you choose to.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.