📄 lyy036.cpp
字号:
//////////////////////////////////////////////////////////////////////////////////////////////
/*.........................编译原理课程设计........................*/
/* (词法分析器) */
#include <iostream.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max 100
///////////////////////////////////////////////////////////////////////
/*..............本程序所要用到的函数说明(开始).......................*/
void Openlyy(); /* 打开文件 */
void Change(); /* 状态转换 */
void Getchar(char *p); /* 输入字符 */
int Isletter(char ch); /* 判断是否为字母 */
int Isdigit(char ch); /* 判断是否为数字 */
void Concat(char *p); /* 将字符连接到Lyy之后 */
bool Checkn(); /* 判断是否为关键字 */
void Display(); /* 结果显示在Dos界面上 */
void Error(); /* 出错处理 */
/*..............本程序所要用到的函数头说明(结束).....................*/
///////////////////////////////////////////////////////////////////////
//////////////////////////////////
struct Liyingyun //
{ //
char Char[100]; //
}Lyy; //
//////////////////////////////////
FILE *f1; /*.......读入文件........*/
int Pcount; /*...种别编码的识别编号....*/
/*............关键字库.............*/
char keyword[][20]={"begin", "end", "while","if", "then", "else", "integer","var", "do","add",
"sub", "div", "mod", "real","int", "char", "float", "Boolean", "void",
"const", "of", "file", "goto", "type", "with", "true", "false", "array",
"eof", "put", "input", "output", "and", "or","not","procedure",
"function", "program"};
/*..........主函数................*/
void main()
{
cout<<" !!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!"<<endl;
cout<<" 你已进入李应运词法分析器 !"<<endl;
cout<<" !!!!!~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~!!!!!\n"<<endl;
cout<<"对此词法分析器的几点说明: 1,结果写在Dos上. "<<endl;
cout<<" 2,种别编码如下:( 关键字 keyword )"<<endl;
cout<<" ( 标识符 1 )"<<endl;
cout<<" ( 符号 2 )"<<endl;
cout<<" ( 数组 3 )"<<endl;
cout<<" ( 整形数 4 )"<<endl;
cout<<" ( 浮点型数 5 )"<<endl;
cout<<" ( 错误输出 - )"<<endl;
cout<<"\n 请输入你的Pascal语言程序的路径:"<<endl;
Openlyy(); /*............要编译的Pascal文件............*/
Change(); /*...........调用状态转换..........*/
/*.....已分析完毕.......*/
printf("\n\n~~~~~~~你输入的Pascal语言程序已经分析完!~~~~~~~~\n");
printf("***************感觉还可以吧?*********************\n");
printf(" ^^^^^^^^^^^^^^^^^^^^^欢迎再次使用^^^^^^^^^^^^^^!\n");
}
/////////////////////////////////////////////////////////////////////////////////////////
/*......结果写在Dos上..........*/
/////////////////////////////////////////////////////////////////////////////////////////////
void Openlyy()
{
char Myfile[Max];
/*..........文件的路径..............*/
cin>>Myfile;
cout<<"\n"<<endl;
/* .......... 装入要编译的Pascal语言程序.............*/
if((f1 = fopen (Myfile, "r")) == NULL)
{
cout<<"你输入的路径不对!"<<endl;
exit(1);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*.......将下一个字符读到ch中,搜索指示器前移一字符位置.........*/
void Getchar(char *p)
{
*p=fgetc(f1);
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*........*判断ch中字符是否为字母........*/
int Isletter(char ch)
{
if(((ch>='a')&&(ch<='z'))||((ch>='A')&&(ch<='Z')))
return 1;
else
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*.....判断ch中字符是否为数字....*/
int Isdigit(char ch)
{
if((ch>='0')&&(ch<='9'))
return 1;
else
return 0;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*...将字符连接到Lyy之后...*/
void Concat(char *p)
{
char ch[2];
ch[0]=*p;
ch[1]='\0';
strcat(Lyy.Char,ch);
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*............判断是否为关键字............*/
bool Checkn() //判别是否为关键字
{
for(int i=0;i<22;i++)
if(!strcmp(Lyy.Char,keyword[i]))
return true;
return false;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*.........结果显示在Dos界面上....................*/
void Display()
{
if(Pcount == 1)
{
if(Checkn())
cout<<"<"<<Lyy.Char<<",keyword>"<<endl;
else cout<<"<"<<Lyy.Char<<","<<Pcount<<">"<<endl;
}
else cout<<"<"<<Lyy.Char<<","<<Pcount<<">"<<endl;
strcpy(Lyy.Char,"");
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
/*..........出错处理........*/
void Error()
{
cout<<"<Your program is Error,->"<<endl;
strcpy(Lyy.Char,"");
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////
void Change()
{
char ch;
Getchar(&ch);
while (ch != EOF)
{
/*.........若为"+",进入终态.......*/
if(ch == '+')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为"-",进入终态.......*/
else if(ch == '-')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为"*",进入终态.......*/
else if(ch == '*')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为"/",进入终态.......*/
else if(ch == '/')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为">",进入终态.......*/
else if(ch == '>')
{
Concat(&ch);
Getchar(&ch);
if(ch == '=')
{
Concat(&ch);
Pcount = 2;
Display();
Getchar(&ch);
}
else
{
Pcount = 2;
Display();
}
}
/*.........若为"<",进入终态.......*/
else if(ch == '<')
{
Concat(&ch);
Getchar(&ch);
if(ch == '>')
{
Concat(&ch);
Pcount = 2;
Display();
Getchar(&ch);
}
else if(ch == '=')
{
Concat(&ch);
Pcount = 2;
Display();
Getchar(&ch);
}
else
{
Pcount = 2;
Display();
}
}
/*.........若为"=",进入终态.......*/
else if(ch == '=')
{
Concat(&ch);
Pcount = 2;
Display();
Getchar(&ch);
}
/*.........若为"(",进入终态.......*/
else if(ch == '(')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为")",进入终态.......*/
else if(ch == ')')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为":=",进入终态.......*/
else if(ch == ':')
{
Concat(&ch);
Getchar(&ch);
if(ch == '=')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
else
{
Pcount= 2;
Display();
}
}
/*.........若为",",进入终态.......*/
else if(ch == ',')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为";",进入终态.......*/
else if(ch == ';')
{
Concat(&ch);
Pcount= 2;
Display();
Getchar(&ch);
}
/*.........若为字母,接着判断.......*/
else if(Isletter(ch))
{
Concat(&ch);
Getchar(&ch);
while(Isletter(ch) || Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
/*...........判断数组...............*/
if(ch == '[')
{
Concat(&ch);
Getchar(&ch);
if(Isletter(ch) || Isdigit(ch))
{
while(Isletter(ch) || Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
if(ch == ']')
{
Concat(&ch);
Pcount= 3;
Display();
Getchar(&ch);
}
else Error();
}
else Error();
}
/*.........判断名字.....*/
else
{
Pcount= 1;
Display();
}
}
/*.........若为数字,接着判断.......*/
else if(Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
while(Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
/*..........判断整数..........*/
if(ch == 'E')
{
Concat(&ch);
Getchar(&ch);
if(ch == '+' || ch == '-')
{
Concat(&ch);
Getchar(&ch);
if(Isdigit(ch))
{
while(Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
Pcount= 4;
Display();
}
else Error();
}
else Error();
}
/*............判断小数.......*/
else if(ch == '.')
{
Concat(&ch);
Getchar(&ch);
if(Isdigit(ch))
{
while(Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
if(ch == 'E')
{
Concat(&ch);
Getchar(&ch);
if(ch == '+' || ch == '-')
{
Concat(&ch);
Getchar(&ch);
if(Isdigit(ch))
{
while(Isdigit(ch))
{
Concat(&ch);
Getchar(&ch);
}
Pcount= 5;
Display();
}
else Error();
}
}
else if(ch==' ')
{
Pcount= 5;
Display();
Getchar(&ch);
}
else
{
Pcount= 5;
Display();
}
}
else Error();
}
else
{
Pcount= 4;
Display();
}
}
/*.........跳过空格和回车.........*/
else if(ch == ' '||ch =='\n')
{
Getchar(&ch);
}
/*......其它...............*/
else
{
Error();
Getchar(&ch);
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -