📄 编译原理实验一.txt
字号:
#include <stdio.h>
#include <ctype.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
FILE *fp;//定义文件指针
char cbuffer;//用来接收从文件中读取的字符
//保留字存入指针数组中
char *key[13] = {"begin","call","const","do","end","if","odd","procedure","read","then","var","while","write"};
//运算符存入arithmetic数组中
char *arithmetic[5] = {"+","-","*","/","="};
//关系运算符
char *relation[5] = {"<",">",">=","<=","=="};
char *border[7] = {",",".",";","(",")","{","}"};
int wordlength = 0;
//判断单词是哪种类型
int search(char searchchar[],int wordtype)
{
int i = 0;
switch(wordtype)
{//判断是否为保留字
case 1:
for(i = 0;i<13;i++)
{
if(strcmp(key[i],searchchar)==0)
return 1;//若是,返回1
}
return 0;//否则返回0
//判断是否为运算符
case 2:
for(i = 0;i<5;i++)
{
if(strcmp(arithmetic[i],searchchar)==0)
{
return 1;
}
}
return 0;
//判断是否为关系运算符
case 3:
for(i = 0;i<5;i++)
{
if(strcmp(relation[i],searchchar)==0)
return 1;
}
return 0;
case 4:
for(i = 0;i<7;i++)
{
if(strcmp(border[i],searchchar)==0)
return 1;
}
return 0;
default:
return 0;
}
}
//若第一个字符为字母,则调用此函数
char alphaprocess(char buffer)
{
int i = 0;
char temp[10];
char alphatp[20];
//取出整个单词存入数组alphatp中
while((isalpha(buffer)) || (isdigit(buffer)))
{
alphatp[i++] = buffer;
buffer = fgetc(fp);
wordlength++;//计算单词的长度
}
alphatp[i] = '\0';//添加字符串结束符
if(search(alphatp,1)==1)
printf("%s -----------1:保留字\n",alphatp);
else
{
//如果单词位数超过十位
printf("%s -----------5:正常的标识符\n",strcpy(temp,alphatp));
}
return buffer;
}
//如果第一个字符是数字,则调用此函数
char digitprocess(char buffer)
{
int i = 0;
char digittp[20];
//取出整个单词存入digittp数组中
wordlength = 0;
while(isdigit(buffer) || isalpha(buffer))
{
digittp[i++] = buffer;
buffer = fgetc(fp);
wordlength++;
}
digittp[i] = '\0';//添加字符串的结束符
//判断是否为合法的标识符,如果第一个字符是数字而后面有字母则为非法
for(i = 0;i<wordlength;i++)
{
if(isalpha(digittp[i]))
break;
}
if(i==wordlength)
printf("%s -----------4:数字\n",digittp);
else
printf("%s -----------6:错误的标识符\n",digittp);
return buffer;
}
//如果第一个字符既不是字母也不是数字,则调用此函数
char otherprocess(char buffer)
{
int i = 0;
char othertp[20];
othertp[0] = buffer;
othertp[1] = '\0';
if(search(othertp,4)==1)
{
printf("%s -----------7:界符\n",othertp);
goto out;
}
if(search(othertp,2)==1)
{
printf("%s -----------2:算术运算符\n",othertp);
buffer = fgetc(fp);
goto out;
}
if(search(othertp,3)==1)
{
//因为关系运算符有的为两位,故需再取出一个判断
buffer = fgetc(fp);
othertp[1] = buffer;
othertp[2] = '\0';
if(search(othertp,3)==1)
{
printf("%s -----------3:关系运算符\n",othertp);
goto out;
}
else
{
othertp[1] = '\0';
printf("%s -----------3:关系运算符\n",othertp);
goto out;
}
}
if(buffer == ':')
{
buffer = fgetc(fp);
if(buffer=='=')
printf(":= -----------定义为\n");
buffer = fgetc(fp);
return buffer;
}
if(buffer!='\n' || buffer!=' ')
printf("%c 错误!不是一个单词\n",buffer);
buffer = fgetc(fp);
out: return buffer;
}
//主函数
void main()
{
//说明
printf("*------------------------说明----------------------*\n");
printf("*------------ 1--保留字 2--运算符 -------------*\n");
printf("*------------ 3--关系运算符 4--数字 -------------*\n");
printf("*------------ 5--正常的单词 6--错误的标识符 -------*\n");
printf("*------------ 7--界符 ----------------------------*\n");
printf("*--------------------------------------------------*\n");
//打开测试文件,文件物理地址为"D:/test.txt"
if((fp = fopen("D:/test.txt","r")) == NULL)
printf("该文件不能打开!");
else
{
cbuffer = fgetc(fp);
while(cbuffer!=EOF)
{
if(isalpha(cbuffer))//如果是字母
cbuffer = alphaprocess(cbuffer);
else if(isdigit(cbuffer))//如果是数字
cbuffer = digitprocess(cbuffer);
else cbuffer = otherprocess(cbuffer);//其他
cbuffer = fgetc(fp);
}
printf("词法分析结束!");
getchar();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -