Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <fstream>
- #include <iostream>
- #include <vector>
- #include <string>
- #include <unistd.h>
- #include <map>
- #include <algorithm>
- using std::string;
- using std::vector;
- using std::map;
- using std::ifstream;
- class state_machine {
- string start;
- vector<string> final_states;
- vector<string> states;
- vector<bool> alphabet;
- map<char, map<string, string> > transisions;
- public:
- state_machine(const std::string& filename)
- : alphabet(256, 0)
- {
- ifstream fs(filename);
- fs >> start;
- int n;
- fs >> n;
- final_states.resize(n);
- for (int i = 0; i < n; ++i) {
- fs >> final_states[i];
- }
- fs >> n;
- for (int i = 0; i < n; ++i) {
- string s, f;
- char c;
- fs >> c >> s >> f;
- alphabet[c] = true;
- transisions[c][s] = f;
- }
- }
- bool check(const string& input) const {
- string curr_state = start;
- for (char i : input) {
- if (!alphabet[i])
- return false;
- auto tit = transisions.find(i);
- if (tit == transisions.end()) {
- return false;
- }
- auto qit = tit->second.find(curr_state);
- if (qit == tit->second.end()) {
- return false;
- }
- curr_state = qit->second;
- }
- if (find(final_states.begin(), final_states.end(), curr_state) != final_states.end()) {
- return true;
- }
- return false;
- }
- };
- void usage(char *argv[]) {
- std::cerr << "Usage: " << argv[0] << " -f filename\n";
- }
- int main(int argc, char *argv[]) {
- std::string filename;
- char opt;
- while ((opt = getopt(argc, argv, "f:")) != -1) {
- switch (opt) {
- case 'f':
- filename = optarg;
- break;
- default:
- usage(argv);
- return 1;
- }
- }
- if (filename.size() == 0) {
- std::cerr << "Missed required argument -f\n";
- usage(argv);
- return 1;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement