Question
Make the lexical analyzer given in front.c better. In this problem you will rewrite that code to take in to recognize the following list of
Make the lexical analyzer given in front.c better. In this problem you will rewrite that code to take in to recognize the following list of reserved words and special symbols and return their respective token codes:
for (FOR_CODE, 30), if (IF_CODE, 31), else (ELSE_CODE, 32), while
(WHILE_CODE, 33), do (DO_CODE, 34), int (INT_CODE, 35), float
(FLOAT_CODE, 36), switch (SWITCH_CODE, 37) ,
> (LESS_THAN_OP, 38) , >= (LESS_EQUAL_OP, 39) ,
< (GREATER_THAN_OP, 40) , <= (GREATER_ EQUAL_OP, 40) ,
== (IS_ EQUAL_OP, 40) , == (NOT_ EQUAL_OP, 40) ,
This code should also be modified to identify floating point literals and separate them from integer literals. ==========================================================================================================
/* front.c - a lexical analyzer system for simple arithmetic expressions */ #include
/* Global declarations */ /* Variables */ int charClass; char lexeme[100]; char nextChar; int lexLen; int token; int nextToken; FILE *in_fp;
/* Function declarations */ int lookup(char ch); void addChar(void); void getChar(void); void getNonBlank(void); int lex(void);
/* 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 */ int main(void) { /* Open the input data file and process its contents */ if ((in_fp = fopen("front.in", "r")) == NULL) printf("ERROR - cannot open front.in "); else { getChar(); do { lex(); } while (nextToken != EOF); } return 0; } /******************************************************/ /* lookup - a function to look up operators and parentheses and return the token */ 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 nextChar to lexeme */ void addChar(void) { if (lexLen <= 98) { lexeme[lexLen++] = nextChar; lexeme[lexLen] = '\0'; } else printf("Error - lexeme is too long "); }
/******************************************************/ /* getChar - a function to get the next character of input and determine its character class */ void getChar(void) { 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 getChar until it returns a non-whitespace character */ void getNonBlank(void) { while (isspace(nextChar)) getChar(); }
/******************************************************/ /* lex - a simple lexical analyzer for arithmetic expressions */ int lex(void) { lexLen = 0; getNonBlank(); switch (charClass) { /* Identifiers */ case LETTER: addChar(); getChar(); while (charClass == LETTER || charClass == DIGIT) { addChar(); getChar(); } nextToken = IDENT; break; /* Integer literals */ case DIGIT: addChar(); getChar(); while (charClass == DIGIT) { addChar(); getChar(); } nextToken = INT_LIT; break; /* Parentheses 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
Step: 1
Get Instant Access to Expert-Tailored Solutions
See step-by-step solutions with expert insights and AI powered tools for academic success
Step: 2
Step: 3
Ace Your Homework with AI
Get the answers you need in no time with our AI-driven, step-by-step assistance
Get Started