# include <iostream.h> # include <fstream.h> # include <string.h> # include <stdlib.h> # include <stdio.h> # include <conio.h> # include <ctype.h> //-------------------------- Global Variables -------------------------// const int iRows = 34; const int iCols = 15; int iTT[iRows][iCols] = {0}; //------------------------ Function Definitions -----------------------// //------------------------ loadTransitionTable( ) ---------------------// void loadTransitionTable( ) { fstream File(\"tt.txt\", ios::in|ios::nocreate); if (!File) { cout << \"\\n Unable to open the input file.\" << endl; cout << \"\\n 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]; else if (isdigit(cChar)) return iTT[iState][2]; else if (cChar == \'.\') return iTT[iState][3]; else if (cChar == \'\"\') return iTT[iState][4]; else if (cChar == \'_\') return iTT[iState][6]; else if (cChar == \'+\') return iTT[iState][7]; else if (cChar == \'=\') return iTT[iState][8]; else if (cChar == \'-\') return iTT[iState][9]; else if (cChar == \'%\') return iTT[iState][10]; else if (cChar == \'!\') return iTT[iState][11]; else if (cChar == \'>\') return iTT[iState][12]; else if (cChar == \'<\') return iTT[iState][13]; else if (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<<\"\\n Unable to open the input file.\"<<endl; cout<<\"\\n 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( ) != \'\\n\') { if (File.eof( )) goto End; } cout<<\'\\r\'; 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<<\'\\r\'; 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; } //------------------------------ THE END ------------------------------//