当前位置:文档之家› 词法分析器源代码

词法分析器源代码

词法分析器源代码
词法分析器源代码

词法分析器源代码

#include #include #include #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 ppp(p,p+34); int u;

for(u=0;u

if(!https://www.doczj.com/doc/482380175.html,pare(ppp[u]))

return u+1;

return 0;

}

vector > scan(vector vec)//本次程序的主要分析程序 {

vector > temp;

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 pp(_ME,jk);

temp.push_back(pp);

continue;}

else if(vec[i+1]==">"&&vec[i+2]!="=") { string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_A,jk);

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 pp(_B,jk);

temp.push_back(pp);

continue;

}

else {

pair pp(_LG,vec[i]);//标识符temp.push_back(pp);}

}

else if(vec[i]=="<") {

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_LE,jk);

temp.push_back(pp);

continue; }

else if(vec[i+1]=="<"&&vec[i+2]!="=") { string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_C,jk);

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 pp(_D,jk);

temp.push_back(pp);

continue; }

else {

pair pp(_LT,vec[i]);//标识符temp.push_back(pp);}

}

else if(vec[i]=="!") {

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_LE,jk);

temp.push_back(pp);

continue;}

else {

pair pp(_NE,vec[i]);//标识符temp.push_back(pp);

}

else if(vec[i]=="=") {

if(vec[i+1]=="="){

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_EQ,jk);

temp.push_back(pp);

continue; }

else {

pair pp(_AS,vec[i]);//标识符temp.push_back(pp); }

}

else if(vec[i]=="&") {

if(vec[i+1]=="&") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_F,jk);

temp.push_back(pp);

continue;}

else if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_G,jk);

temp.push_back(pp);

continue;}

else {

pair pp(_E,vec[i]);//标识符temp.push_back(pp);}

}

else if(vec[i]=="|"){

if(vec[i+1]=="|") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_I,jk);

temp.push_back(pp);

continue;}

else if(vec[i+1]=="="){

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_J,jk);

temp.push_back(pp);

continue;}

else {

pair pp(_H,vec[i]);//标识符

temp.push_back(pp);}

}

else if(vec[i]=="(") {

{

pair pp(_LP,vec[i]);//标识符temp.push_back(pp);

}

}

else if(vec[i]==")"){

{

pair pp(_RP,vec[i]);//标识符temp.push_back(pp); }

}

else if(vec[i]=="["){

{

pair pp(_LB1,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]=="]") {

{

pair pp(_RB1,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]=="~") {

{

pair pp(_K,vec[i]);//标识符

temp.push_back(pp); } }

else if(vec[i]==",") {

{

pair pp(_COM,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]=="{") {

{

pair pp(_LB2,vec[i]);//标识符temp.push_back(pp);} }

else if(vec[i]==":") {

{

pair pp(_COL,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]==";") {

{

pair pp(_SEM,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]=="}") {

{

pair pp(_RB2,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i]=="*") {

if(vec[i+1]=="="){

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_Q,jk);

temp.push_back(pp);

continue; }

else {

pair pp(_TIMES,vec[i]);//标识符

temp.push_back(pp); } }

else if(vec[i]=="/") {

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_R,jk);

temp.push_back(pp);

continue; }

else if(vec[i+1]=="*") {

i=i+4;

while(i

else {

pair pp(_DIV,vec[i]);//标识符

temp.push_back(pp); }

}

else if(vec[i]=="%") {

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_S,jk);

temp.push_back(pp);

continue; }

else {

pair pp(_U,vec[i]);//标识符temp.push_back(pp); } }

else if(vec[i][0]=='"') {

pair pp(_V,vec[i]);//标识符temp.push_back(pp);

}

else if(vec[i][0]=='\'') {

pair pp(_W,vec[i]);//标识符temp.push_back(pp);

}

else if(vec[i][0]=='?'){

pair pp(_X,vec[i]);//标识符temp.push_back(pp); }

else if(vec[i]=="+") {

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_O,jk);

temp.push_back(pp);

continue; }

else if(vec[i+1]=="+") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_L,jk);

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 pp(_NUM,jk);

temp.push_back(pp);

continue; }

else{

pair pp(_PLUS,vec[i]);//标识符

temp.push_back(pp); } }

else if(vec[i]=="-"){

if(vec[i+1]=="=") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_P,jk);

temp.push_back(pp);

continue;}

else if(vec[i+1]=="-") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_M,jk);

temp.push_back(pp);

continue; }

else if(vec[i+1]==">") {

string jk=vec[i];

jk.append(vec[++i],0,1);

pair pp(_N,jk);

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 pp(_NUM,jk);

temp.push_back(pp);

continue; }

else {

pair pp(_SUB,vec[i]);//标识符

temp.push_back(pp);

}

}

else if(vec[i][0]<='9'&&vec[i][0]>='0')

{

pair pp(_NUM,vec[i]);

temp.push_back(pp);

}

else

{

pair pp(_ID,vec[i]);//标识符

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 pp(_NUM,jk);

temp.push_back(pp);

continue;

}

else{

pair pp(_NUM,vec[i]);

temp.push_back(pp);}

}

else if(iskey(vec[i]))

{

pair pp(iskey(vec[i]),vec[i]);

temp.push_back(pp);

}

else

{

pair pp(_ID,vec[i]);

temp.push_back(pp);

}

}

return temp;

}

void OutFile(vector > v) {

int i;

for(i=0;i

outfile<<"<"<"<

}

相关主题
文本预览
相关文档 最新文档