?? cffx.cpp
字號:
#include <stdio.h>
#include <string.h>
#include <iostream.h>
void outprint(int a,char ch[20]);
main()
{
FILE *in;
char ch,infile[10],ah[20],bh[20];
int k,m,h=1;
for(int i=0;i<20;i++)
{
ah[i]='\0';
}
for(i=0;i<20;i++)
{
bh[i]='\0';
}
printf("請輸入源文件的名稱: \n");
scanf("%s",infile);
if((in=fopen(infile,"r"))==NULL)
{
printf("不能打開源文件!\n");
return 0;
}
printf("\n對%s源文件進行詞法分析所得結果如下:\n\n",infile);
cout<<"第一行程序的語法分析如下:"<<endl;
ch=fgetc(in);
while(ch!=EOF)
{
switch(ch)
{
case '\n':cout<<"第"<<++h<<"行程序的詞法分析如下:"<<endl;
ch=fgetc(in);
break;
case ' ':ch=fgetc(in);break;//刪除空格;
case '(':outprint(28,"(");ch=fgetc(in);break;//識別左括號
case ')':outprint(29,")");ch=fgetc(in);break;//識別右括號
case ';':outprint(18,";");ch=fgetc(in);break;//識別分號
case '+':outprint(13,"+");ch=fgetc(in);break;//識別加號
case '-':outprint(14,"-");ch=fgetc(in);break;//識別-號
case '*':outprint(15,"*");ch=fgetc(in);break;//識別*號
case '/':outprint(16,"/");ch=fgetc(in);break;//識別/號
case '=':outprint(25,"=");ch=fgetc(in);break;//識別等號
case ',':outprint(29,",");ch=fgetc(in);break;//識別逗號
case '#':outprint(0,"#");ch=fgetc(in);break;//識別#號
case '.':outprint(28,".");ch=fgetc(in);break;//識別句號
case '{':
do{
ch=fgetc(in);
if(ch=='\n')++h;
}
while(ch!='}');
ch=fgetc(in);
break;
case '<': //該case語句識別<=,<>,<
ch=fgetc(in);
if(ch=='>')
{
outprint(21,"<>");
ch=fgetc(in);
}
else if(ch=='=')
{
outprint(22,"<=");
ch=fgetc(in);
}
else outprint(20,"<");
break;
case '>':
ch=fgetc(in);
if(ch=='=')
{
outprint(24,">=");
ch=fgetc(in);
}
else outprint(23,">");
break;
case ':': //對:=與:的識別
ch=fgetc(in);
if(ch=='=')
{
outprint(17,":=");
ch=fgetc(in);
}
else outprint(10,":");
break;
//其中,保留字有if,then,else,end,repeat,until,read,write
default:if(ch>='0'&&ch<='9')
{
k=0;
do
{
ah[k++]=ch;
ch=fgetc(in);
}
while(ch>='0'&&ch<='9');
outprint(11,ah);//如果識別到一串數字,則標志為11
/*for(int i=0;i<20;i++)
{
ah[i]='\0';
}*/
}
else
{
if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
m=0;
bh[m++]=ch;
ch=fgetc(in);
while(ch>='0'&&ch<='9'||ch>='a'&&ch<='z'||ch>='A'&&ch<='Z')
{
bh[m++]=ch;
ch=fgetc(in);
}
strlwr(bh);
if(strcmp(bh,"if")==0) outprint(1,"if");
else if(strcmp(bh,"then")==0) outprint(2,"then");
else if(strcmp(bh,"else")==0) outprint(3,"else");
else if(strcmp(bh,"end")==0) outprint(4,"end");
else if(strcmp(bh,"repeat")==0) outprint(5,"repeat");
else if(strcmp(bh,"until")==0) outprint(6,"until");
else if(strcmp(bh,"read")==0) outprint(7,"read");
else if(strcmp(bh,"write")==0) outprint(8,"write");
else if(strcmp(bh,"iostream")==0) outprint(9,"iostream");
else outprint(10,bh);
for(i=0;i<20;i++)
{
bh[i]='\0';
}
}
else
{
printf("%c is Error!\n",ch);
ch=fgetc(in);
}
}
}
}
fclose(in);
return 0;
}
void outprint(int a,char *ch)
{
printf("(%d,%s)\n",a,ch);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -