/******************************************************** * Here a hand-coded scanner for the simple calculator * language. It is based explicity on the * finite automaton pictured in simple.ps. ********************************************************/ #include <iostream> #include <string> #include <cstdlib> //-- I need this for atoi #include <cstdio> //-- Needed for EOF constant using namespace std; #include "calcParser.tab.hpp" // Header file generated by bison // This is the scanner int yylex() { bool found = false; int state = 0; string val = ""; while(!found) { char c = cin.get(); switch(state) { case 0: switch(c) { case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': val += c; state = 1; break; case '+': case '-': val += c; state = 2; break; case '*': case '/': val += c; state = 3; break; case ';': val += c; state = 4; break; case '(': val += c; state = 5; break; case ')': val += c; state = 6; break; case ' ': case '\t': case '\n': break; case EOF: exit(0); break; default: found = true; } break; case 1: switch(c) { case '0':case '1':case '2':case '3':case '4': case '5':case '6':case '7':case '8': case '9': val += c; state = 1; break; default: cin.putback(c); found = true; } break; case 2: case 3: case 4: case 5: case 6: cin.putback(c); found = true; break; } } switch(state) { case 0: return 0; // EOF case 1: yylval.val = atoi(val.c_str()); return NUM; case 2: yylval.sym = val[0]; return OPA; case 3: yylval.sym = val[0]; return OPM; case 4: return STOP; case 5: return LP; case 6: return RP; } }