Home
 

mainScan.C

mainScan.C

// mainScan.C
//
// This will test the scanner.
//
// Example:  scan sample.p

#include <iostream.h>
#include <stdio.h>
#include <string.h>
#include "parser.tab.h"

int yylex();

int main(int argc, char *argv[])
{
   int token = 0;
   int count = 0;
   char *tokenString[100];
   char *badToken = "Invalid token";
   char fileName[100];

   // Initialize character version of tokens
   for (int i = 0; i < 100; ++i)
      tokenString[i] = badToken;
   tokenString[PROGRAMTK   -255] = "program";
   tokenString[BEGINTK     -255] = "begin";
   tokenString[ENDTK       -255] = "end";
   tokenString[SCTK        -255] = ";";
   tokenString[ASGTK       -255] = ":=";
   tokenString[DOTTK       -255] = ".";
   tokenString[IDENTIFIERTK-255] = "<identifier>";
   tokenString[NUMLITERALTK-255] = "<literal>";
   tokenString[WRITETK     -255] = "writeln";
   tokenString[LPARENTK    -255] = "(";
   tokenString[RPARENTK    -255] = ")";
   tokenString[VARTK       -255] = "var";
   tokenString[ARRAYTK     -255] = "array";
   tokenString[RANGETK     -255] = "..";
   tokenString[OFTK        -255] = "of";
   tokenString[LOOPTK      -255] = "loop";
   tokenString[IFTK        -255] = "if";
   tokenString[THENTK      -255] = "then";
   tokenString[ELSETK      -255] = "else";
   tokenString[EXITTK      -255] = "exit";
   tokenString[COMMATK     -255] = ",";
   tokenString[COLONTK     -255] = ":";
   tokenString[LBRACKTK    -255] = "[";
   tokenString[RBRACKTK    -255] = "]";
   tokenString[PLUSTK      -255] = "+";
   tokenString[MINUSTK     -255] = "-";
   tokenString[STARTK      -255] = "*";
   tokenString[SLASHTK     -255] = "/";
   tokenString[LTTK    -255] = "<";
   tokenString[LETK    -255] = "<=";
   tokenString[EQTK    -255] = "=";
   tokenString[NETK    -255] = "<>";
   tokenString[GETK    -255] = ">=";
   tokenString[GTTK        -255] = ">";
   tokenString[INTEGERTK   -255] = "integer";

   // Get the name of the source file
   if (argc < 2) {
      cout << "Source program: ";
      cin >> fileName;
   }
   else
      strncpy (fileName, argv[1], 80);

   // Do nothing if no filename provided
   if (strlen(fileName) == 0)
      return 0;

   // Redirect cin to the source file
   if (freopen(fileName, "r", stdin)) {
      ios::sync_with_stdio();
   }
   else {
      cerr << "*** Unable to open file " << fileName << endl;
      return 1;
   }

   // Call yylex repeatedly until a dot token is found
   while ( /*(count++ < 100) &&*/  (token != DOTTK)) {
      token = yylex();
      cout << tokenString[token-255] << endl;
   }
   return 0;
}