天天看点

编译原理词法分析器

编译原理词法分析器代码

编译原理词法分析器代码

记得输入好路径例如D:\test.txt;讲指定文件导入测试。

编译原理 词法分析器

//

//

//(1)按规则拼写单词,并转换成二元式形式。

//(2)删除注释行。

//(3)删除空白符。

//(4)列表打印源程序,按照源程序的行打印,在每行的前面加上行号,并且打印出每行包含的二元形式。

//(5)发现并定位错误。

//

#include

#include<string.h>

using namespace std;

char prog[1000],ch,token[8];

int p=0,sym=0,n;

char filename[30];

FILE *fpin;

char *keyword[8]={“if”,“then”,“else”,“end”,“repeat”,“until”,“read”,“write”};

void GetToken();

int main()

{

p=0;

cout<<“请输入源文件名:”;

for(;😉

{

cin>>filename;

if((fpin=fopen(filename,“r”))!=NULL)

break;

else cout<<“文件路径错误!请输入源文件名:”;

}

do

{

ch=fgetc(fpin);

prog[p++]=ch;

}while(ch!=EOF);

p=0;

do

{

GetToken();

switch(sym)

{

case -1:

case -2:break;

default:cout<<"("<<sym<<","<<token<<")"<<endl;break;

}

}while(ch!=EOF);

return 0;

}

void GetToken()

{

for(n=0;n<8;n++)

{

token[n]=’\0’;

}

n=0;

ch=prog[p++];

while(ch==’ ‘||ch==’\n’||ch==’\t’){ch=prog[p++];}

if((ch>=‘a’&&ch<=‘z’)||(ch>=‘A’&&ch<=‘Z’))

{

sym=1;

do{

token[n++]=ch;

ch=prog[p++];

}while((ch>=‘a’&&ch<=‘z’)||(ch>=‘A’&&ch<=‘Z’));

sym=2;

for(n=0;n<8;n++)

{

if(strcmp(token,keyword[n])0)

{

sym=n+3;

}

}

p–;

}

else if(ch’{’)

{

do{

ch=prog[p++];

}while(ch!=’}’);

sym=-1;

return;

}

else if(ch>=‘0’&&ch<=‘9’)

{

sym=11;

do

{

token[n++]=ch;

ch=prog[p++];

}while(ch>=‘0’&&ch<=‘9’);

sym=12;

p–;

return;

}

else

{

switch(ch)

{

case ‘+’:sym=13;token[0]=ch;break;

case ‘-’:sym=14;token[0]=ch;break;

case ‘*’:sym=15;token[0]=ch;break;

case ‘/’:sym=16;token[0]=ch;break;

case ‘=’:sym=17;token[0]=ch;break;

case ‘<’:sym=18;token[0]=ch;break;

case ‘;’:sym=19;token[0]=ch;break;

default:sym=-2;cout<<“词法分析出错,请检查是否输入非法字符!\n”;break;

}

}

}

继续阅读