CS143-Lab/assignments/PA2/lextest.cc
2023-03-16 15:55:37 +00:00

92 lines
2.5 KiB
C++

//
// See copyright.h for copyright notice and limitation of liability
// and disclaimer of warranty provisions.
//
#include "copyright.h"
//////////////////////////////////////////////////////////////////////////////
//
// lextest.cc
//
// Reads input from file argument.
//
// Option -l prints summary of flex actions.
//
//////////////////////////////////////////////////////////////////////////////
#include <stdio.h> // needed on Linux system
#include <unistd.h> // for getopt
#include "cool-parse.h" // bison-generated file; defines tokens
#include "utilities.h"
//
// The lexer keeps this global variable up to date with the line number
// of the current line read from the input.
//
int curr_lineno = 1;
char *curr_filename = "<stdin>"; // this name is arbitrary
FILE *fin; // This is the file pointer from which the lexer reads its input.
//
// cool_yylex() is the function produced by flex. It returns the next
// token each time it is called.
//
extern int cool_yylex();
YYSTYPE cool_yylval; // Not compiled with parser, so must define this.
extern int optind; // used for option processing (man 3 getopt for more info)
//
// Option -v sets the lex_verbose flag. The main() function prints out tokens
// if the program is invoked with option -v. Option -l sets yy_flex_debug.
//
extern int yy_flex_debug; // Flex debugging; see flex documentation.
extern int lex_verbose; // Controls printing of tokens.
void handle_flags(int argc, char *argv[]);
//
// The full Cool compiler contains several debugging flags, all of which
// are handled and set by the routine handle_flags. Here we declare
// cool_yydebug, which is not used by the lexer but is needed to link
// with handle_flags.
//
int cool_yydebug;
// defined in utilities.cc
extern void dump_cool_token(ostream& out, int lineno,
int token, YYSTYPE yylval);
int main(int argc, char** argv) {
int token;
handle_flags(argc,argv);
while (optind < argc) {
fin = fopen(argv[optind], "r");
if (fin == NULL) {
cerr << "Could not open input file " << argv[optind] << endl;
exit(1);
}
// sm: the 'coolc' compiler's file-handling loop resets
// this counter, so let's make the stand-alone lexer
// do the same thing
curr_lineno = 1;
//
// Scan and print all tokens.
//
cout << "#name \"" << argv[optind] << "\"" << endl;
while ((token = cool_yylex()) != 0) {
dump_cool_token(cout, curr_lineno, token, cool_yylval);
}
fclose(fin);
optind++;
}
exit(0);
}