Objectives To better understand the lexical analysis phase o

Objectives: To better understand the lexical analysis phase of program compilation Assignment: The first phase of compilation is called scanning or lexical analysis. This phase interprets the input program as a sequence of characters and produces a sequence of tokens, which will be used by the parser. Your job is to write (in C++) a simple scanner for source code that obeys the language described below. You may assume that the input is syntactically correct. Your program simply needs to read each token and then print out what type it is, based on the following language rules: keyword if l then I else I begin l end I function I return identifier character l character identifier integer digit I digit integer real integer integer special l- l 3 l l digit 0111213 41516171819 character alblc... IzlAIBIC... IZ More details: Case is not used to distinguish keywords or identifiers. The delimiters are space, tab, and newline The token classes that should be recognized are keyword, identifier, integer, and real Your final program must compile and run using a C++ compiler (your choice) Submitting your work Submit your code via Blackboard. Do not submit a ZIP or archive file, submit each file independently. In the past, archives etc. have been problematic.

Solution

Refer following code and provide the input file to verify the output
Name the file as \"input.txt\"
Source code:
# include <iostream.h>
# include <fstream.h>
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
# include <conio.h>
# include <ctype.h>
/*************************************************************************///-------------------------- Global Variables -------------------------///*************************************************************************/
constint iRows = 34;
constint iCols = 15;
int iTT[iRows][iCols] = {0};
/*************************************************************************///------------------------ Function Definitions -----------------------///*************************************************************************///------------------------ loadTransitionTable( ) ---------------------//
void loadTransitionTable( )
{
fstream File(\"tt.txt\", ios::in|ios::nocreate);
if (!File)
{
cout << \"\ Unable to open the input file.\" << endl;
cout << \"\ Press any key to exit.\";
getch( );
exit(0);
}
char sInput[100]={NULL}; for (int i = 0; i < iRows; i ++)
{
strset(sInput, NULL);
File.getline(sInput, 80);
char *sPtr=NULL;
sPtr = strtok(sInput, \" \");
iTT[i][0] = atoi(sPtr);
for(int j = 1; j < iCols; j ++)
{
sPtr=strtok(NULL, \" \");
iTT[i][j] = atoi(sPtr);
}
} File.close( );
}
//--------------------------- getNextState( ) -------------------------//
int getNextState(int iState, char cChar)
{
if (isalpha(cChar))
return iTT[iState][1];
elseif (isdigit(cChar))
return iTT[iState][2];
elseif (cChar == \'.\')
return iTT[iState][3];
elseif (cChar == \'\"\')
return iTT[iState][4];
elseif (cChar == \'_\')
return iTT[iState][6];
elseif (cChar == \'+\')
return iTT[iState][7];
elseif (cChar == \'=\')
return iTT[iState][8];
elseif (cChar == \'-\')
return iTT[iState][9];
elseif (cChar == \'%\')
return iTT[iState][10];
elseif (cChar == \'!\')
return iTT[iState][11];
elseif (cChar == \'>\')
return iTT[iState][12];
elseif (cChar == \'<\')
return iTT[iState][13];
elseif (cChar == \'/\')
return iTT[iState][14];
return iTT[iState][0];
}
//---------------------------- isKeyword( ) ----------------------------//
int isKeyword(char* sToken)
{
if (strlen(sToken) > 16 || strlen(sToken) == 0)
return 0;
char sKeywords[64][20] = { \"asm\",\"auto\",\"bool\",\"break\",\"case\",\"catch\", \"char\",\"class\",\"const\",\"const_cast\", \"continue\",\"default\",\"delete\",\"do\",\"double\", \"dynamic_cast\",\"else\",\"enum\",\"explicit\", \"export\",\"extern\",\"false\",\"float\",\"for\", \"friend\",\"goto\",\"if\",\"inline\",\"int\",\"long\", \"main\",\"mutable\",\"namespace\",\"new\", \"operator\",\"private\",\"protected\",\"public\", \"register\",\"reinterpret_cast\",\"return\", \"short\",\"signed\",\"sizeof\",\"static\", \"static_cast\",\"struct\",\"switch\",\"template\", \"this\",\"throw\",\"true\",\"try\",\"typedef\", \"typeid\",\"typename\",\"union\",\"unsigned\",\"using\", \"virtual\",\"void\",\"volatile\",\"wchar_t\",\"while\"
};
for(int iCount = 0; iCount < 64; iCount ++)
{
if(strcmpi(sKeywords[iCount], sToken) == 0)
return 1;
}
return 0;
} /*************************************************************************///------------------------------- main( ) -----------------------------///*************************************************************************/
int main( )
{
clrscr( );
loadTransitionTable( );
fstream File(\"input.txt\", ios::in|ios::nocreate);
if (!File)
{
cout<<\"\ Unable to open the input file.\"<<endl;
cout<<\"\ Press any key to exit.\";
getch( );
exit(0);
}
char sToken[255] = {NULL};
int iTokenIndex = 0;
char cChar = NULL;
int iState = 0;
int iFlag = 0;
char cTemp = File.get( );
do
{
Start:
if (iFlag == 0)
{
cChar = cTemp;
cTemp = File.get( );
} else
iFlag = 0;
if (cChar == \'/\' && cTemp == \'/\')
{
while(File.get( ) != \'\ \')
{
if (File.eof( ))
goto End;
}
cout<<\'\ \';
cTemp = File.get( );
goto Start;
}
if (cChar == \'/\' && cTemp == \'*\')
{
cTemp = File.get( );
do
{
cChar = cTemp;
cTemp = File.get( );
if (File.eof( )) goto End;
}
while(cChar != \'*\' && cTemp != \'/\');
cout<<\'\ \';
cTemp = File.get( );
goto Start;
}
iState = getNextState(iState, cChar);
switch (iState)
{
case 0 : cout << cChar; iState = 0;
iTokenIndex = 0;
strset(sToken, NULL); break;
case 1 :
case 3 :
case 5 :
case 7 :
case 10 :
case 14 :
case 18 :
case 25 :
case 26 : sToken[iTokenIndex] = cChar;
iTokenIndex ++;
break;
case 2 : if (isKeyword(sToken)) cout << sToken;
else
cout << \"<ID>\";
iState = 0;
iTokenIndex = 0;
iFlag = 1;
strset(sToken, NULL);
break;
case 4 : cout << \"<INT>\"; iState = 0;
iTokenIndex = 0;
iFlag = 1;
strset(sToken, NULL); break;
case 6 : cout << \"<FLOAT>\";
iState = 0;
iTokenIndex = 0;
iFlag = 1;
strset(sToken, NULL); break;
case 8 : cout << \"<STR>\"; iState = 0;
iTokenIndex = 0; strset(sToken, NULL); break;
case 9 :
case 11 :
case 12 :
case 13 :
case 15 :
case 16 :
case 17 :
case 19 :
case 20 :
case 21 :
case 22 :
case 23 :
case 24 :
case 27 :
case 28 :
cout << \"<OPR>\";
if (cChar != \'+\' && cChar != \'-\' && cChar != \'/\' && cChar != \'>\' && cChar != \'<\' && cChar != \'=\')
iFlag = 1;
iState = 0;
iTokenIndex = 0;
strset(sToken, NULL);
break;
case 30 :
case 33 : iState = 0;
iTokenIndex = 0;
strset(sToken, NULL);
break;
}
}
while(!File.eof( ));
End:
getch( );
return 0;
}

 Objectives: To better understand the lexical analysis phase of program compilation Assignment: The first phase of compilation is called scanning or lexical ana
 Objectives: To better understand the lexical analysis phase of program compilation Assignment: The first phase of compilation is called scanning or lexical ana
 Objectives: To better understand the lexical analysis phase of program compilation Assignment: The first phase of compilation is called scanning or lexical ana
 Objectives: To better understand the lexical analysis phase of program compilation Assignment: The first phase of compilation is called scanning or lexical ana

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site