编译原理词法分析python_编译原理-词法分析器

1.源文件:text.c

main()

{

int a,b;

a=10;

b=a+20;

}

2.源文件:词法分析

#include

#include

#include

#include

#include

#define NULL 0

FILE *fp;

char cbuffer;

char *key[8]={"if","else","for","while","do","return","break","continue"};

char *border[6]={",",";","{","}","(",")"};

char *arithmetic[4]={"+","-","*","/"};

char *relation[6]={"",">=","<>"};

char *consts[20];

char *label[20];

int constnum=0,labelnum=0;

int search(char searchchar[],int wordtype)

{

int i=0;

switch (wordtype) {

case 1:for (i=0;i<=7;i++)

{

if (strcmp(key[i],searchchar)==0)

return(i+1);

}

case 2:{for (i=0;i<=5;i++)

{

if (strcmp(border[i],searchchar)==0)

return(i+1);

} return(0);

}

case 3:{for (i=0;i<=3;i++)

{

if (strcmp(arithmetic[i],searchchar)==0)

{

return(i+1);

}

}

return(0);

}

case 4:{for (i=0;i<=5;i++)

{

if (strcmp(relation[i],searchchar)==0)

{

return(i+1);

}

}

return(0);

}

case 5:{for (i=0;i<=constnum;i++)

{

if (strcmp(consts[i],searchchar)==0)

{

return(i+1);

}

}

consts[i-1]=(char *)malloc(sizeof(searchchar));

strcpy(consts[i-1],searchchar);

constnum++;

return(i);

}

case 6:{for (i=0;i<=labelnum;i++)

{

if (strcmp(label[i],searchchar)==0)

{

return(i+1);

}

}

label[i-1]=(char *)malloc(sizeof(searchchar));

strcpy(label[i-1],searchchar);

labelnum++;

return(i);

}

}

}

char alphaprocess(char buffer)

{

int atype;

int i=-1;

char alphatp[20];

while ((isalpha(buffer))||(isdigit(buffer)))

{

alphatp[++i]=buffer;

buffer=fgetc(fp);

}

alphatp[i+1]='\0';

if (atype=search(alphatp,1))

printf("%s (1,%d)\n",alphatp,atype-1);

else

{

atype=search(alphatp,6);

printf("%s (6,%d)\n",alphatp,atype-1);

}

return(buffer);

}

char digitprocess(char buffer)

{

int i=-1;

char digittp[20];

int dtype;

while ((isdigit(buffer)))

{

digittp[++i]=buffer;

buffer=fgetc(fp);

}

digittp[i+1]='\0';

dtype=search(digittp,5);

printf("%s (5,%d)\n",digittp,dtype-1);

return(buffer);

}

char otherprocess(char buffer)

{

int i=-1;

char othertp[20];

int otype,otypetp;

othertp[0]=buffer;

othertp[1]='\0';

if (otype=search(othertp,3))

{

printf("%s (3,%d)\n",othertp,otype-1);

buffer=fgetc(fp);

goto out;

}

if (otype=search(othertp,4))

{

buffer=fgetc(fp);

othertp[1]=buffer;

othertp[2]='\0';

if (otypetp=search(othertp,4))

{

printf("%s (4,%d)\n",othertp,otypetp-1);

goto out;

}

else

othertp[1]='\0';

printf("%s (4,%d)\n",othertp,otype-1);

goto out;

}

if (buffer==':')

{

buffer=fgetc(fp);

if (buffer=='=')

printf(":= (2,2)\n");

buffer=fgetc(fp);

goto out;

}

else

{

if (otype=search(othertp,2))

{

printf("%s (2,%d)\n",othertp,otype-1);

buffer=fgetc(fp);

goto out;

}

}

if ((buffer!='\n')&&(buffer!=' '))

printf("%c error,not a word\n",buffer);

buffer=fgetc(fp);

out: return(buffer);

}

void main()

{

int i;

for (i=0;i<=20;i++)

{

label[i]=NULL;

consts[i]=NULL;

};

if ((fp=fopen("text.c","r"))==NULL)

printf("error");

else

{

cbuffer = fgetc(fp);

while (cbuffer!=EOF)

{

if (isalpha(cbuffer))

cbuffer=alphaprocess(cbuffer);

else if (isdigit(cbuffer))

cbuffer=digitprocess(cbuffer);

else cbuffer=otherprocess(cbuffer);

}

printf("over\n");

getchar();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值