📄 lexicalanalysis.cpp
字号:
#include <ctype.h>
#include <string.h>
#include <stdio.h>
#define N 83 /* 用来标记 C++ 和 Pascal 语言中关键字的个数 */
/* 定义一个全局变量,一个全局文件指针 */
FILE *fp; /* fp是一个指向FILE类型结构的指针变量,可以使fp指向某一个文件
* 的结构变量,从而通过该结构体变量中的文件信息访问该文件
*/
int id; /* 标志变量,用来标识各类型的ID */
/* 主函数 */
int main()
{
/* 自定义函数的声明 */
char cbuffer;
char alphaprocess(char buffer);
char digitprocess(char buffer);
char otherprocess(char buffer);
if((fp = fopen("example.txt","r")) == NULL) /* 以只读方式打开文件 "example.txt",NULL在 stdio.h 文件中已被定义为 0 */
printf("error\n");
else
{
cbuffer = fgetc(fp); /* 文件不为空则从文件中取字符 */
while(cbuffer != EOF) /* EOF文件结束标志 */
{
if(cbuffer==' ' || cbuffer == '\n' || cbuffer == '\t') /* 掠过空格和回车符 */
{
cbuffer = fgetc(fp);
id = 4;
}
else if(isalpha(cbuffer))
cbuffer = alphaprocess(cbuffer); /* 检查cbuffer是否为字母,是则调用alphaprocess()函数 */
else if(isdigit(cbuffer))
cbuffer = digitprocess(cbuffer); /* 检查cbuffer是否为数字 0~9,是则调用digitprocess()函数 */
else cbuffer = otherprocess(cbuffer); /* 非上述两者则调用otherprocess()函数 */
}
}
printf("\n");
return 0;
}/* 主函数结束 */
/* 处理读取字符为字母的情况 */
char alphaprocess(char buffer)
{
int search(char searchchar[],int wordtype); /* 函数声明 */
int atype; /* 保存是关键字的字符串在关键字表中的索引 */
int i = 0;
char alphatp[20]; /* 字符数组存储从文件中读取的字符 */
while((isalpha(buffer)) || (isdigit(buffer)) || buffer == '_' || buffer == '.' ) /* 标识符的组成成分 */
{
alphatp[i++] = buffer; /* 将当前读取的字符存入数组 */
buffer = fgetc(fp); /* 读取下一个字符 */
}
if(atype != 0) /* 是关键字则输出该关键字,编号为1,并输出该关键字在关键字表中的位置 */
{
if(atype != 23)
printf("(%s, (1,%d))\n",alphatp,atype);
id = 1; /* 关键字的ID为1 */
}
else
{
printf("(%s ,2)\n",alphatp); /* 为标识符时,编号为2 */
id = 2; /* 标识符的ID为2 */
}
return 'a';
}
/* 判断字符串是否为关键字 */
int search(char searchchar[],int wordtype)
{
char key[N][10] = {"abstract","and","array","asm","auto","begin","bool","break","case","catch",
"char","class","const","continue","default","delete","div","do","double","downto",
"dynamic","else","float","for",,"integer","long","mod","namespace","private","program",
"protected","public","read","register","repeat","return","set","short","signed",
"sizeof","static","string","struct","switch","template","then","this","throw","true","try",
"type","typedef","union","unsigned","using","until","var","virtual","volatile","void",
"while","write","xor"};
/* 设置数组指针存储 C++ 和 Pascal 语言中的 83 个关键字 */
int i,p;
switch(wordtype)
{
case 1:
for(i = 0; i <= N; i++)
{
if(strcmp(key[i],searchchar) == 0) /* 比较字符串,为关键字则定位该关键字的序号 */
{ p = i + 1; break; }
else p = 0;
}
default:;
}
return(p);
}/* alphaprocess()函数结束 */
/* 处理读取字符为数字时的情况 */
char digitprocess(char buffer)
{
int i = 0;
char digittp[20];
while((isdigit(buffer)))
{
digittp[i++] = buffer;
}
printf("(%s ,3)\n",digittp); /* 输出该数字,编号为3 */
id = 3; /* 设置ID为3 */
return(buffer);
}/* digitprocess()函数结束 */
/* 处理读出字符为其他字符的情况 */
char otherprocess(char buffer)
{
int i;
int n = 0;
char ch[20];
ch[0] = buffer;
if(ch[0] == '#' || ch[0] == '"')
{
printf("(%s ,4)\n",ch);
id = 4;
}
else if(ch[0] == ':')
{
buffer = fgetc(fp);
if(buffer == '=')
{
ch[1] = buffer;
printf("(%s ,5)\n",ch);
id = 5;
return(buffer);
}
printf("(%s ,5)\n",ch);
id = 5;
}
else if(ch[0] == '%' || ch[0] == '\')
{ /* 处理标准输出格式和转义字符 */
printf("(%s ,5)\n",ch);
id = 5;
buffer = fgetc(fp);
}
else if(ch[0] == '&')
{
buffer = fgetc(fp);
if(buffer != '&')
{
printf("(%s ,5)\n",ch);
id = 5;
}
}
else if(ch[0] == '{' || ch[0] == '}' || ch[0] == '(' || ch[0] == ')')
{
printf("(%s ,5)\n",ch);
buffer = fgetc(fp);
id = 5;
}
else if(ch[0] == '*'|| ch[0] == '/')
{
printf("(%s ,4)\n",ch);
id = 4;
}
else if(ch[0] == '=' || ch[0] == '!' || ch[0] == '<' || ch[0] == '>')
{
buffer = fgetc(fp);
printf("(%s ,4)\n",ch);
id = 4;
}
else if(ch[0] == '+' || ch[0] == '-')
{
if(id == 4) /* 如果'+','-'前ID为4的字符则可能为正负数或'++','--',否则为加减号 */
{
for(i = 1; i < 10; i++)
{
buffer = fgetc(fp);
if(buffer == '+')
{
ch[1] = '+'; break; /* 跳出for循环体 */
}
else if(buffer == '-')
{
ch[1] = '-'; break; /* 跳出for循环体 */
}
ch[i+1] = '\0';
}
printf("(%s ,3)\n",ch);
id = 3;
return(buffer);
}
printf("(%s ,4)\n",ch);
buffer = fgetc(fp);
id = 4;
}
return 'f';
} /* otherprocess()函
数结束 */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -