/********************************************************
* 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; }
}