📄 12.cpp
字号:
#include<stdio.h>
#include<ctype.h>
#include<string.h>
#include <stdlib.h>
char table[30],currentchar,buffer1[100];
int position=0,i=0;
////////////
void ls1(),ls2(),ls5(),ls6() ,ls7();
void emptytable(), Noblank();
void readchar(char p);
int tokenletter(char s[]);
void maketoken();
void linktoken();
void main()
{FILE *fp;
char ch;
if ( (fp = fopen ("aa.txt","wt+"))==NULL)
{printf("file open error. \n");
exit(0);}//文件打开失败
printf("write file\n");
ch=getchar();
while(ch!='@')
{ fputc(ch,fp);
ch=getchar();
}
rewind(fp);
while ( (ch=fgetc(fp) ) != EOF ) //** /*从文件中读取字符 */
{ while(ch!=10 && ch!=EOF)//fput如果字母不是回车
{ buffer1[position]=ch;
position++;
ch=fgetc(fp);
}
linktoken(); maketoken();
printf("\n");
}
fclose (fp); /* 关闭文件 */
}
////////////////////
void maketoken()//形成Token字
{ //readchar(buffer1[position]);
Noblank();
if (isalpha(currentchar))//字母和数字
ls1();
else
if(isdigit(currentchar))//数字
ls2();
else
switch(currentchar)
{ case '+':printf(" $plus");break;
case ';':printf(" $semicolon"); break;
case ',':printf(" $comma");break;
case '(': printf(" $Lparen");break;
case ')':printf(" $Rparen");break;
case '-':printf(" $Minus");break;
case '*':printf(" $Multiply");break;
case '/':printf(" $Dquote");break;
case '_':printf(" $Underscore");break;
case '[':printf(" $Lzparen");break;
case ']':printf(" $Rzparen");break;
case '=':printf(" $equal");break;
case ':':ls5();break;
case '<':ls6();break;
case '>':ls7();break;
case '@': case '!':case '$':printf("illegal character");break;
}
}
//////////////
void ls1() //当前为字符
{ Lg:
table[i]=currentchar;
i++;
readchar(buffer1[position]);
if(isalnum(currentchar))
goto Lg;
else
{position--;
table[i]='\0';
}
if(tokenletter(table)==1)
printf(" $%s",table);
else
printf(" $id %s",table);
emptytable();
}
/////////////s
void ls2()//当前为数字,验证后,如果为整数,输出$interger,否则输出$real
{ int flag=0;
Lg1:
table[i]=currentchar;i++;
readchar(buffer1[position]);
if(isdigit(currentchar))
goto Lg1;
else
if(currentchar=='.')
{flag=1;goto Lg1;}
else
position-=1;
if (flag==1)
printf(" $real %s",table);
else
printf(" $interger,%s",table);
emptytable();
}
///////////
void ls5()//冒号
{ table[i]=currentchar;
readchar(buffer1[position]);//putchar('T');
if(currentchar=='=')
printf(" $assi");
else
{position-=1; printf(" $colon");}//putchar(currentchar);
emptytable();
}
///////////////////
void ls6()//小于
{table[i]=currentchar;
readchar(buffer1[position]);
if(currentchar=='=')
printf(" $le");
else
{ position-=1;printf(" $lt");}
emptytable();
}
///////
void ls7()//大于等于
{table[i]=currentchar;
readchar(buffer1[position]);
if(currentchar=='=')
printf("\n$lg");
else
{position-=1;printf(" $lge");}
emptytable();
}
//////////////
int tokenletter(char s[])//验证是不是关键字
{char keyname[][20]={"begin","end","procedure","if","then","with","do","var","int","real"};
int y2=strlen(s),y1;
// L3:
for(int a=0;a<=10;a++)
{
y1=strlen(keyname[a]);
if(y1!=y2)
continue;
for(int b=0;b<=y1;b++)
{if(s[b]!=keyname[a][b])
break;}
if((b-1)==y1)
return 1;}
return 0;
}
///////////////////////////
void readchar(char p)
{ currentchar=p;
position+=1;
}
/////////////////////
void Noblank()//去掉空格符
{ if(currentchar==' ')
{ readchar(buffer1[position]);
Noblank();
}
}
void emptytable()
{ for(int ii=0;ii<20;ii++)
table[ii]=0;
i=0;
}
/////////////////
void linktoken()
{int mm;
mm=position;
position=0;
readchar(buffer1[position]);
Noblank();
while(position<mm)
{ maketoken();
readchar(buffer1[position]);}
for(int ii=0;ii<30;ii++)
buffer1[ii]=0;
position=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -