MatchingAn array of strings containing the name of each opcode could easily be searched for the purpose of matching. Certainly this is not the most efficient way to do it. A more efficient algorithm might make use of a hash table to allow matching in constant time, but a simple array will work for this example. typedef std::vector<std::string> StringArray; . . . private: StringArray _codeNames; . . . MatchCode() will assume that _codeNames contains the name of each opcode at the time it is called: bool MatchCode(const std::string& str) { char codeVal; StringArray::iterator itr = _codeNames.begin(); for (codeVal = 0; itr != _codeNames.end(); ++itr, ++codeVal) { if (str == *itr) { _tokBuffer.push_back(codeVal); return true; } } return false; } To make our assumption legitimate, we will provide the scanner with the list of opcode names at the time of its creation: public: Scanner(const StringArray& codeNames) : _codeNames(codeNames) {} Scanner(const std::string* codeNames, size_t nameCount) { _codeNames.resize(nameCount); const std::string* end = codeNames+nameCount; std::copy(codeNames, end, _codeNames.begin()); } In our testing code we now include an aggregate list of strings containing opcode names in the order you find them enumerated, and use it to create the scanner: int main() { string codeList[num_codes] = { "talk", "print", "set", "inc", "dec", "add", "end" }; VirtualMachine vm; Scanner scanner(codeList, num_codes); . . . One small change was made to the opcode enumeration list to allow an implicit count of the number of opcodes included: // enumerations describing the bytecode instructions the VM is able to process enum opcode { op_talk=0, op_print, // our new printing code // variable manipulators op_set, // char, char : destination index, value to set op_inc, // char : index to increment op_dec, // char : index to decrement op_add, // char, char, char : dest index, srce index1, srce index2 op_end, // not an opcode num_codes // value is the number of opcodes if first opcode has value of 0 }; It should now be possible to compile and execute the test to verify that the scanning process does indeed function correctly. With this complete we may move on to file handling.
|