Question: Using the sample C Programming Language code in Section 4.2 (Lexical Analysis) of the Textbook, create the C++ equivalent (front.cpp). Specifically, you need to convert
Using the sample C Programming Language code in Section 4.2 (Lexical Analysis) of the Textbook, create the C++ equivalent (front.cpp). Specifically, you need to convert the C input and output statements to their C++ equivalents. Also, use the C++ string data type instead of the C character array, wherever possible.
#include
int charClass; char lexeme [100]; char nextChar; int lexLen; int token; int nextToken; FILE *in_fp, *fopen(); //Function declarations void addChar(); void getChar(); void getNonBlank(); int lex(); //Character classes #define LETTER 0 #define DIGIT 1 #define UNKNOWN 99 //Token codes #define INT_LIT 10 #define IDENT 11 #define ASSIGN_OP 20 #define ADD_OP 21 #define SUB_OP 22 #define MULT_OP 23 #define DIV_OP 24 #define LEFT_PAREN 25 #define RIGHT_PAREN 26 /*********************************/ //main driver main() { //Open the input data file if ((in_fp = fopen ("front.in", "r")) == NULL) printf("ERROR - cannot open front.in "); else { getChar(); do { lex(); } while (nextToken!= EOF); } } /**********************************/ /*lookup - a function to lookup*/ int lookup(char ch) { switch (ch) { case '(': addChar(); nextToken = LEFT_PAREN; break; case ')': addChar(); nextToken = RIGHT_PAREN; break; case '+': addChar(); nextToken = ADD_OP; break; case '-': addChar(); nextToken = SUB_OP; break; case '*': addChar(); nextToken = MULT_OP; break; case '/': addChar(); nextToken = DIV_OP; break; default: addChar(); nextToken = EOF; break; } return nextToken; } /*********************/ //addChar - a function to add void addChar() { if (lexLen <= 98) { lexeme[lexLen++] = nextChar; lexeme[lexLen] = 0; } else printf("Error - lexeme is too long "); } /***********************/ //getChar - a function ton get the void getChar() { if ((nextChar = getc(in_fp)) = EOF) { if (isalpha (nextChar)) charClass = LETTER; else if (isdigit(nextChar)) charClass = DIGIT; else charClass = UNKNOWN; } else charClass = EOF; } /*****************************/ //getNonBlank - a function to call void getNonBlank() { while (isspace(nextChar)) getChar(); } /*******************************/ //lex - a simple lexical analyzer int lex() { lexLen = 0; getNonBlank(); switch (charClass) { //Parse identifiers case LETTER: addChar(); getChar(); while (charClass == LETTER || charClass == DIGIT) { addChar(); getChar(); } nextToken = IDENT; break; //Parse integer case DIGIT: addChar(); getChar(); while (charClass == DIGIT) { addChar(); getChar(); } nextToken = INT_LIT; break; //Parantheses and operators case UNKNOWN: lookup(nextChar); getChar(); break; //EOF case EOF: nextToken = EOF; lexeme[0] = 'E'; lexeme[1] = 'O'; lexeme[2] = 'F'; lexeme[3] = 0; break; } //End of switch printf("Next token is : %d, Next lexeme is %s ", nextToken, lexeme); return nextToken; } //End of function lex
Step by Step Solution
There are 3 Steps involved in it
Get step-by-step solutions from verified subject matter experts
