The lexical analyzer is to scan a program to determine whether it is a keyword, identifier, constant, delimiter, operator. Generally divided into one character and the classic V;
Here I use the classic V, this lexical parser is written in C + +;
/*
Reserved words | Keyword: 1
operator | operators: 2
Delimiter: 3
Identifier: 4
Constant: 5
No recognition: 6
*/
The main code is:
#include <iostream>using namespace std; #define MAX 10/* reserved word | keyword: 1 operator | operator: 2 delimiter: 3 identifier: 4 constant: 5 unrecognized: 6*/char ch = "; char* KEYWORD[10] = {"Void", "main", "Break", "include", "Begin", "End", "if", "Else", "while", "Switch"};char token[20];// Defines whether the obtained character//determines if the keyword bool IsKey (char * token) {for (int i = 0;i < max;i++) {if (strcmp (token,keyword[i]) = = 0) return true; return false;} Determine if the letter is bool Isletter (char letters) {if (>= ' a ' && s ' <= ' z ') | | (Letter >= ' A ' && letter <= ' Z ')) return True;elsereturn false;} Determine if the number bool IsDigit (char digit) {if (digit >= ' 0 ' && digit <= ' 9 ') return True;elsereturn false;} Lexical analysis void analyze (FILE *fpin) {while ((ch = fgetc (fpin))! = EOF) {if (ch = = ' | | ch = = ' \ t ' | | ch = = ' \ n ') {}else if (isletter (ch)) {char token[20]={' + '};int i=0;while (isletter (ch) | | IsDigit (CH)) {Token[i] = Ch;i++;ch = Fgetc (Fpin);} Fallback one pointer fseek (fpin,-1l,seek_cur), if (IsKey (token)) {//keyword cout<<token<< "\t1" << "\ t keyword" << Endl;} else{//identifier COUT<<TOKEN≪< "\t4" << "\ t identifier" <<ENDL;} else if (isdigit (ch) | | | (ch = = '. ')) {int I=0;char token[20]={'};while (isdigit (ch) | | | (ch = = '. ') &&isdigit (Fgetc (Fpin))) {if (ch = = '. ') Fseek (fpin,-1l,seek_cur); Token[i] = Ch;i++;ch = Fgetc (Fpin);} Fseek (fpin,-1l,seek_cur);//belongs to the unsigned constant cout<<token<< "\t5" << "\ t constant" <<ENDL;} else switch (CH) {//Operator case ' + ': {ch = fgetc (Fpin); if (ch = = ' + ') cout<< "+ +" << "\t2" << "\ t operator" << Endl;else {cout<< "+" << "\t2" << "\ t operator" <<endl;fseek (Fpin,-1l,seek_cur);}} Break;case '-': {ch = fgetc (Fpin), if (ch = = '-') cout<< "--" << "\t2" << "\ t operator" <<endl;else {cout << "-" << "\t2" << "\ t operator" <<endl;fseek (fpin,-1l,seek_cur);} }break;case ' * ':cout<<ch<< "\t2" << "\ t operator" <<endl;break;case '/':cout<<ch<< "\t2 "<<" \ t operator "<<endl;break;//delimiter case" (':cout<<ch<< "\t3" << "\ t delimiter" <<endl;break; Case ') ':cout<<ch<< "\t3" << "\ t delimiter ' <<endl;break;case ' [':cout<<ch<< ' \t3 ' << ' \ t ' delimiter ' <<endl;break;case '] ':cout< <ch<< "\t3" << "\ t delimiter" <<endl;break;case '; ':cout<<ch<< "\t3" << \ t delimiter "< <endl;break;case ' {':cout<<ch<< ' \t3 ' << ' \ t ' delimiter ' <<endl;break;case '} ':cout<<ch< < "\t3" << "\ t delimiter" <<endl;break;//operator case ' = ': {ch = fgetc (Fpin), if (ch = = ') cout<< "= =" << "\ T2 "<<" \ t operator "<<endl;else {cout<<" = "<<" \t2 "<<" \ t operator "<<endl;fseek (fpin,-1l, Seek_cur);} }break;case ': ': {ch = fgetc (Fpin), if (ch = = ' = ') cout<< ": =" << "\t2" << "\ t operator" <<endl;else {cout << ":" << "\t2" << "\ t operator" <<endl;fseek (fpin,-1l,seek_cur);} }break;case ' > ': {ch = fgetc (Fpin), if (ch = = = ') cout<< ">=" << "\t2" << "\ t operator" <<endl;else { cout<< ">" << "\t2" << "\ t operator" <<endl;fseek (fpin,-1l,seek_cur);} }break;case ' < ': {ch = fgetc (fpin); if(ch = = ') cout<< "<=" << "\t2" << "\ t operator" <<endl;else {cout<< "<" << "\t2" < < "\ t operator" <<endl;fseek (fpin,-1l,seek_cur);} }break;//no recognition default:cout<<ch<< "\t6" << "\ t no identifier" <<ENDL;}} int main () {char input[30]; File *fpin;cout<< "Please enter source file name: \ n" <<endl;for (;;) {cin>>input;if ((Fpin = fopen (input, "r")) = NULL) break;else cout<< "Path input error" <<ENDL;} cout<< "**************** Lexical analysis results ********************" <<endl;analyze (Fpin); fclose (Fpin);}
Operation Result:
C + + Lexical analyzer