词法分析器源代码
#include
/*单词种别码*/
#define _CHAR 1 #define _INT 2
#define _SHORT 3 #define _LONG 4 #define _SIGNED 5 #define _UNSIGNED 6 #define _FLOAT 7 #define _DOUBLE 8 #define _CONST 9 #define _VOID 10 #define _VOLATILE 11 #define _ENUM 12 #define _STRUCT 13 #define _UNION 14 #define _TYPEDEF 15 #define _AUTO 16 #define _EXTERN 17 #define
_STATIC 18 #define _REGISTER 19 #define _IF 20
#define _ELSE 21 #define _SWITCH 22 #define _CASE 23 #define
_DEFAULT 24 #define _WHILE 25 #define _DO 26
#define _FOR 27 #define _BREAK 28 #define _CONTINUE 29 #define _GOTO 30 #define _RETURN 31 #define _SIZEOF 32 #define _INCLUDE 33 #define
_DEFINE 34 /*
以上为关键字的种别码
*/
#define _ID 40 //标识符
#define _NUM 50 //数
#define _AS 51 //= #define _PLUS 52 //+ #define _SUB 53 //- #define _TIMES 54 // * #define _DIV 55 // / #define _LP 56 // ( #define _RP 57 // ) #define _LB1 58 // [ #define _RB1 59 // ] #define _LB2 60 //
{ #define _RB2 61 // } #define _COM 62 // , #define _COL 63 // : #define
_SEM 64 // #define _POINT 65 // . #define _LG 66 // > #define _LT 67 // < #define _ME 68 // >= #define _LE 69 // <= #define _EQ 70 // == #define _NE 71 // != #define _A 72 // >> #define _B 73 // >>= #define _C 74 // << #define _D 75 // <<= #define _E 76 // & #define _F 76 // && #define _G 77 // &= #define _H 78 // | #define _I 79 // || #define _J 80 // |= #define _K 81 // ~ #define _L 82 // ++ #define _M 83 // -- #define _N 84 // -> #define _O 85 // += #define _P 86 // -= #define _Q 87 // *=
#define _R 88 // /= #define _S 89 // %=
#define _T 90 // ^=
#define _U 91 // %
#define _V 92 // "
#define _W 93 // '
#define _X 94 // ?
#define _EROOR -1 // 错误
using namespace std;
int ERROR_NUM=0; //记载词法编译错误个数
bool isnum(string str) //判断是不是合法的数字
{
int y;
int i;
int j=0;
int k=0;
for(i=0;i { if(!(str[i]<='9'&&str[i]>='0')) { k++; if((k-j)>1){ cout<<"数字串"< return false;} if(str[i]=='.') { j++; if(j>1) { cout<<"数字串"< return false;} } else if((str[i]=='E'||str[i]=='e')&&(str[i-1]<='9'&&str[i- 1]>='0')&&((str[i+1]<='9'&&str[i+1]>='0')||(y=i+1)==str.size())) continue; else{ cout<<"数字串"< return false;} } } return true; } /* 该函数用来略过空格和换行符,找到有效字符的位置 第一个参数为目标字符串,第二个参数为开始位置 返回值为连续的空格和换行后的第一个有效字符在字符串的位置 */ int valuable(string str,int i) { while(true){ if(str[i]!=' '&&str[i]!='\n') return i; i++; } } int isexp(string str,int i) { if(str[i]=='/'&&str[i+1]=='/') { while(str[i]!='\n'){ i++; } } return i; } int iskey(string str) //判断是不是关键字 { string p[34]={"char","int","short","long","signed","unsigned","float","double", "const","void","volatile","enum","struct","union","typedef","auto"," extern","st atic","register","if","else","switch","case","default","while","do", "for","brea k","continue","goto","return","size of","#include","#define"}; vector for(u=0;u if(!https://www.doczj.com/doc/482380175.html,pare(ppp[u])) return u+1; return 0; } vector vector int i; for(i=0;i { if(vec[i].size()==1) { if(vec[i]==">") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else if(vec[i+1]==">"&&vec[i+2]!="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if(vec[i+1]==">"&&vec[i+2]=="="){ string jk=vec[i]; jk.append(vec[++i],0,1); jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else { pair } else if(vec[i]=="<") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if(vec[i+1]=="<"&&vec[i+2]!="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else if(vec[i+1]=="<"&&vec[i+2]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else { pair } else if(vec[i]=="!") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else { pair } else if(vec[i]=="=") { if(vec[i+1]=="="){ string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else { pair } else if(vec[i]=="&") { if(vec[i+1]=="&") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else { pair } else if(vec[i]=="|"){ if(vec[i+1]=="|") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else if(vec[i+1]=="="){ string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else { pair temp.push_back(pp);} } else if(vec[i]=="(") { { pair } } else if(vec[i]==")"){ { pair } else if(vec[i]=="["){ { pair else if(vec[i]=="]") { { pair else if(vec[i]=="~") { { pair temp.push_back(pp); } } else if(vec[i]==",") { { pair else if(vec[i]=="{") { { pair else if(vec[i]==":") { { pair else if(vec[i]==";") { { pair else if(vec[i]=="}") { { pair else if(vec[i]=="*") { if(vec[i+1]=="="){ string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else { pair temp.push_back(pp); } } else if(vec[i]=="/") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if(vec[i+1]=="*") { i=i+4; while(i else { pair temp.push_back(pp); } } else if(vec[i]=="%") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else { pair else if(vec[i][0]=='"') { pair } else if(vec[i][0]=='\'') { pair } else if(vec[i][0]=='?'){ pair else if(vec[i]=="+") { if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if(vec[i+1]=="+") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if((vec[i-1]=="="||vec[i-1]=="(")&&isnum(vec[i+1])) { string jk=vec[i]; jk.append(vec[++i]); pair temp.push_back(pp); continue; } else{ pair temp.push_back(pp); } } else if(vec[i]=="-"){ if(vec[i+1]=="=") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue;} else if(vec[i+1]=="-") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if(vec[i+1]==">") { string jk=vec[i]; jk.append(vec[++i],0,1); pair temp.push_back(pp); continue; } else if((vec[i-1]=="="||vec[i-1]=="(")&&isnum(vec[i+1])) { string jk=vec[i]; jk.append(vec[++i]); pair temp.push_back(pp); continue; } else { pair temp.push_back(pp); } } else if(vec[i][0]<='9'&&vec[i][0]>='0') { pair temp.push_back(pp); } else { pair temp.push_back(pp); } } else if((vec[i][0]<='9'&&vec[i][0]>='0')||vec[i][0]=='.') { if(!isnum(vec[i]))ERROR_NUM++; else if((vec[i+1][0]=='+'||vec[i+1][0]=='-')&&isnum(vec[i+2])) { string jk=vec[i]; jk.append(vec[++i]); jk.append(vec[++i]); pair temp.push_back(pp); continue; } else{ pair temp.push_back(pp);} } else if(iskey(vec[i])) { pair temp.push_back(pp); } else { pair temp.push_back(pp); } } return temp; } void OutFile(vector int i; for(i=0;i outfile<<"<"< }