📄 word.c
字号:
/*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*; Programmed by 刘宏发,200631000315 hugo.working@gmail.com */
/*;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
/*; 版本信息 */
/*; 词法分析器 Ver 1.12 - 2008-10-22 */
/*;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define NULL 0
#define XOX 8000
#define WORD 14
char prog[XOX],token[10];
char ch;
int syn,p,m,n,sum;
char *rwtab[WORD]={"begin","if","then","while","do","end","break","main","int","char","printf","scanf","else","default"};//待增加
main(){
FILE *fp=NULL;
int temp;
printf("\n --------词法分析器: --------\n");//*将改为文件读取*/
printf("\n 请选择:\n \t 1-手动输入; \n \t 2-预文件测试;\n");
scanf("%d",&temp);
if(temp==2){
if((fp=fopen("test.c","r"))==NULL){
if((fp=fopen("test.c","w+"))==NULL){
printf("文件建立错误!");
exit(0);
}
}
p=0;
while(p<XOX){ //prog[p]!=EOF
prog[p++]=fgetc(fp); /*输入到缓冲prog[p++]中*/
};
fclose(fp);
}
else if(temp==1)
{
p=0;
printf("请以'@'做未结束符\n");
do{
ch=getchar();
prog[p++]=ch;
//prog[p++]=getchar();
}while(ch!='@');
}
p=0;
do{
scaner();
switch(syn){
case 1000: printf("(注释)\n");break;/*注释*/
case 11: printf("(%d,%d)\n",syn,sum);break;/*输出(数的二元组);*/
case -1: printf("(未定义)\n");/*输出(错误);*/break;
default :printf("(%d,%s)\n",syn,token);/*输出(其他单词二元组);*/
}
}while(syn!=0);
getch();
system("pause");
}
scaner()
{
for(n=0;n<8;n++)
token[n]=NULL;
m=0;
ch=prog[p++];
while(ch==' '||ch=='\n')ch=prog[p++];
if((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A'))/*ch是字母/数字字符*/
{
while((ch<='z'&&ch>='a')||(ch<='Z'&&ch>='A')||(ch<='9'&&ch>='0'))
{
token[m++]=ch;
ch=prog[p++];
}
token[m++]='\0';
ch=prog[--p];
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,rwtab[n])==0)
{
syn=n+1;/*给出syn值*/
break;
}
}
else
if((ch<='9'&&ch>='0'))
{
sum=0;
while((ch<='9'&&ch>='0'))
{
sum=sum*10+ch-'0';
ch=prog[p++];
}
ch=prog[--p];
syn=11;
}
else
switch(ch)
{
case '<':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else
if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
ch=prog[--p];
}
break;
case '>':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
ch=prog[--p];
}
break;
case ':':token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
ch=prog[--p];
}
break;
case '+':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='+')
{
syn=33;
token[m++]=ch;
}
else
{
syn=13;
ch=prog[--p];
}
break;
case '-':m=0;token[m++]=ch;
ch=prog[p++];
if(ch=='-')
{
syn=43;
token[m++]=ch;
}
else
{
syn=14;
ch=prog[--p];
}
break;
case '*':syn=15;token[0]=ch;break;
case '/': m=0;token[m++]=ch;ch=prog[p++];/*读下一个字符*/
if(ch=='*'){ /*处理"/**"类注释*/
do{
ch=prog[p++];/*读下一个字符;*/
if(ch=='*'){
ch=prog[p++];/*读下一个字符;*/
if(ch=='/'){
syn=1000;/*注释*/
break;}
}
}while(1);
}
else if(ch=='/'){ /*处理"//"类注释*/
do{
ch=prog[p++];/*读下一个字符;*/
if(ch=='\n')
{
syn=1000;/*注释*/
break;}
}while(1);
}
else
{
syn=16;
p=p-1;//回退一个字符
}
break;
case '++':syn=33;token[0]=ch;break;//++
case '--':syn=43;token[0]=ch;break;//--
case ':=':syn=18;token[0]=ch;break;
case '~':syn=19;token[0]=ch;break;
case '!':syn=20;token[0]=ch;break;
case '<>':syn=21;token[0]=ch;break;
case '<=':syn=22;token[0]=ch;break;
case '>=':syn=24;token[0]=ch;break;
case '=':syn=25;token[0]=ch;break;
case ';':syn=26;token[0]=ch;break;
case '%':syn=27;token[0]=ch;break;
case '$':syn=28;token[0]=ch;break;
case '&':syn=29;token[0]=ch;break;
case '(':syn=30;token[0]=ch;break;
case ')':syn=31;token[0]=ch;break;
case '[':syn=39;token[0]=ch;break;
case ']':syn=40;token[0]=ch;break;
case '{':syn=41;token[0]=ch;break;
case '}':syn=42;token[0]=ch;break;
case ',':syn=44;token[0]=ch;break;
case '#':syn=45;token[0]=ch;break;
case '@':syn=0;token[0]=ch;break;
default:syn=-1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -