编译原理上机,急求代码!
大家好,有没有用C语言实现的编译原理 词法分析器的原代码!
请大家帮个忙,有的话麻烦把代码贴一下!
谢谢拉
问题点数:0、回复次数:1Top
1 楼dazern(夏天的零度)回复于 2005-04-01 14:21:47 得分 0
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int i,j,k,sign,number,flag;
/*flag which is use to judge the string is keywords or not!*/
char ch;
char words[10]={" "};
char program[500];
int scan(char program[])
{
char*keywords[13]={"void","main","if","then","break","int","char","float","include","for","while","printf","scanf"};
number=0;
flag=0;
j=0;
ch=program[i++];
/*To handle the lettle space ands tab*/
while((ch==' ')||(ch=='\n')||(ch=='\t')||(ch=='\r'))
ch=program[i++];
/*handle letters*/
if((ch>='a')&&(ch<='z'))
{
while((ch>='a')&&(ch<='z'))
{
words[j++]=ch;
ch=program[i++];
}
words[j++]='\0';
for(k=0;k<13;k++)
if(strcmp(words,keywords[k])==0)
switch(k)
{
case 0:
sign=1;flag=1;break;
case 1:
sign=2;flag=1;break;
case 2:
sign=3;flag=1;break;
case 3:
sign=4;flag=1;break;
case 4:
sign=5;flag=1;break;
case 5:
sign=6;flag=1;break;
case 6:
sign=7;flag=1;break;
case 7:
sign=8;flag=1;break;
case 8:
sign=9;flag=1;break;
case 9:
sign=10;flag=1;break;
case 10:
sign=11;flag=1;break;
case 11:
sign=12;flag=1;break;
case 12:
sign=13;flag=1;break;
}
if (flag==0)
{i--;sign=100;}
}
/*handle digits*/
else if((ch>='0')&&(ch<='9'))
{
number=0;
while((ch>='0')&&(ch<='9'))
{
number=number*10+(ch-'0');
ch=program[i++];
}
sign=200;i--;
}
/*opereation and edge handle*/
else switch(ch)
{
case'=':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=401;
}
else
{
i--;sign=402;
}
break;
case'>':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=403;
}
else
{
i--;sign=404;
}
break;
case'<':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=405;
}
else
{
i--;sign=406;
}
break;
case'!':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=407;
}
else
{
i--;sign=408;
}
break;
case'+':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=409;
}
else if(ch=='+')
{
words[j++]=ch;
sign=410;
}
else
{
i--;sign=411;
}
break;
case'-':
words[j++]=ch;
ch=program[i++];
if(ch=='=')
{
words[j++]=ch;
sign=412;
}
else if(ch=='-')
{
words[j++]=ch;
sign=413;
}
else
{
i--;sign=414;
}
break;
case'*':
words[j]=ch;
sign=415;
break;
case'/':
words[j]=ch;
sign=415;
break;
case';':
words[j]=ch;
sign=501;
break;
case'(':
words[j]=ch;
sign=502;
break;
case')':
words[j]=ch;
sign=503;
break;
case'[':
words[j]=ch;
sign=504;
break;
case']':
words[j]=ch;
sign=505;
break;
case'{':
words[j]=ch;
sign=506;
break;
case'}':
words[j]=ch;
sign=507;
break;
case':':
words[j]=ch;
sign=508;
break;
case'"':
words[j]=ch;
sign=509;
break;
case'%':
words[j]=ch;
sign=510;
break;
case',':
words[j]=ch;
sign=511;
break;
case'#':
words[j]=ch;
sign=511;
break;
case'@':
words[j]='#';
sign=0;
break;
default:sign=-1;
}
return sign;
return number;
}
void main()
{
i=0;
printf("please input a program end with @:\n");
do
{
ch=getchar(); program[i++]=ch;
}while(ch!='@');
i=0;
do
{
sign=scan(program);
if(sign==200)
{
printf("(%2d,%4d)\n",sign,number);
}
else if(sign==-1)
{
printf("(%d,error)\n",sign);
}
else
{
printf("(%2d,%4s)\n",sign,words);
}
} while(sign!=0);
}
Top




