📄 token00451.c
字号:
#include<stdio.h>
#include<string.h>
#define MAX 20
typedef struct /*定义一个二元组结构体*/
{
int syn; /*token的编码*/
char value[MAX]; /*tokend值*/
}WS;
char ch;
FILE *fp;
void getbc() /*检查ch是否为空白符,是的话,继续取下一个字符,直到不为空!即消除空白符*/
{
while((ch==' ')||(ch=='\t')||(ch=='\n'))
ch=fgetc(fp);
}
int letter() /*判断ch是否为字母*/
{
if((ch>='A')&&(ch<='Z')||(ch>='a')&&(ch<='z')) return 1;
else return 0;
}
int digit() /*判断ch是否为数字*/
{
if((ch>='0')&&(ch<='9')) return 1;
else return 0;
}
int reserve(char *token) /*查关键字表,判断token中的字符串是否为关键字*/
{
int key=0,i;
char WORDS_KEY[7][20]={"begin","var","real","integer","write","read","end"};
for(i=0;i<=6;i++)
if(strcmp(token,WORDS_KEY[i])==0) {key=i+1; break;}
return key;
}
print(WS *wd) /*打印输出函数*/
{
printf("<%d,%s>",wd->syn,wd->value);
}
WS scaner() /*扫描程序函数*/
{
char token[20];
WS wd;
int c;
int i=0;
ch=fgetc(fp);
getbc(fp);
if(letter()) /*是否为字母或字符,是的话继续取字符,直到取的词不是字母或数字。并调用reserve(char *token)判断是否为关键字。*/
{
while(letter()||digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
token[i]='\0';
fseek(fp,-1L,1); /*退一个字符*/
c=reserve(&*token);
if(c!=0) {wd.syn=c;strcpy(wd.value,token); return wd;}
else {wd.syn=0;strcpy(wd.value,token); return wd;}
}
else if(digit()) /*是否为数字,是的话继续取字符,直到取的词不是数字*/
{
while(digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
if(ch=='.')
{
token[i]=ch;
ch=fgetc(fp);
i++;
while(digit())
{
token[i]=ch;
ch=fgetc(fp);
i++;
}
fseek(fp,-1L,1);
token[i]='\0';
wd.syn=9;strcpy(wd.value,token); return wd;
}
else
{
fseek(fp,-1L,1);
token[i]='\0';
wd.syn=8;strcpy(wd.value,token); return wd;
}
}
else
{
switch(ch) /*判断可识别字符*/
{
case '+': ch=fgetc(fp);
if(ch=='+') {wd.syn=20;wd.value[0]='+'; wd.value[1]='\0'; return wd; break;}/*判断是不是‘++’*/
fseek(fp,-1L,1);
wd.syn= 10;wd.value[0]='+'; wd.value[1]='\0'; return wd; break;
case ':': ch=fgetc(fp);
if(ch=='='){ wd.syn=15;wd.value[0]='f'; wd.value[1]='\0'; return wd; break;}
fseek(fp,-1L,1);
wd.syn=11;wd.value[0]=':'; wd.value[1]='\0'; return wd; break;
case ';': wd.syn=12;wd.value[0]=';'; wd.value[1]='\0'; return wd; break;
case '(': wd.syn=13;wd.value[0]='('; wd.value[1]='\0'; return wd; break;
case ')': wd.syn=14;wd.value[0]=')'; wd.value[1]='\0'; return wd; break;
default : wd.syn=-1;wd.value[0]='-'; wd.value[1]='\0'; return wd; break;
}
}
}
main()
{
WS wd;
ch=0;
if((fp=fopen("file.txt","r+"))==NULL) printf("文件打开失败");
while(ch!=EOF)
{
wd=scaner(fp);
print(&wd);
printf("\n");
}
fclose(fp);
}
/*
0 表示:变量
1 表示关键字:begin
2 表示关键字:var
3 表示关键字:real
4 表示关键字:integer
5 表示关键字:write
6 表示关键字:read
7 表示关键字:end
8 表示:常数
9 表示:实数
10 表示:‘+’
11 表示:‘:’
12 表示:‘;’
13 表示:‘(’
14 表示:‘)’
15 表示:‘:=’,注:‘:=’用f表示
-1 表示:不识别符号
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -