📄 词法分析1.txt
字号:
#include<iostream.h>
#include<string.h>
#include<stdio.h>
#include<process.h>
static int i(0),j(0),t;
struct letter //供输入字符串的结构体
{
char str[15];
int sign; //编码::标识符保留字1 常数2 其他字符 3
}STR[100];
void main()
{
FILE *fp;
void kwordanalyse(char str[]); //关键字和标识符分析程序
void numanalyse(char []); //常数分析程序
void othword(char []); //其他单词分析程序
void key(char [],char *st[],int i);
void num(char [],int i);
void oth(char [],char *st[],int i);
char *Keyword[50]={"int","char","float","void","const","if","else","then","repeat",
"until","read","write","end","\n","+","-","*","/","%","?",":",">","<",
"=",">=","<=","==","(",")","[","]","{","}",",",";","\'","\"","++","--"};
char str[500]={0},ch,ch1;
int tem;
char s[20];
cout<<"\t\t\t 词法分析小程序\n"<<endl;
cout<<" 是否采用读文件的方式读入代码?(y/n):";
cin>>ch1;
if(ch1!='n')
{
cout<<"输入文件名:";
cin>>s;
if((fp=fopen(s,"r"))==NULL)
{
cout<<"未找到文件!";
getchar();
exit(0);
}
for(int n=0;(ch=fgetc(fp))!=EOF;n++)
{
str[n]=ch;
putchar(str[i]);
}
fclose(fp);
system("cls");
cout<<"\t\t\t 词法分析小程序\n"<<endl;
cout<<"\t文件"<<s<<"的内容为:"<<endl;
cout<<str<<endl;
}
else
{
cout<<"请输入您的字符串代码:"<<endl;
gets(str);
system("cls");
cout<<"\t\t\t 词法分析小程序\n"<<endl;
cout<<"\t您的输入为:"<<str<<endl;
}
cout<<"\t输出的二元组如下:"<<endl;
while(i<(int)strlen(str)) //通过循环分析输入的程序代码
{
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<'Z'))
{
STR[j].sign=1;
t=0;
kwordanalyse(str);
}
else
if(str[i]>='0'&&str[i]<='9')
{
STR[j].sign=2;
t=0;
numanalyse(str);
}
else
if(str[i]!=' ')
{
STR[j].sign=3;
t=0;
othword(str);
}
else i++;
}
for(tem=0;tem<j;tem++)
{
switch(STR[tem].sign)
{
case 1:key(str,Keyword,tem);break;
case 2:num(str,tem);break;
case 3:oth(str,Keyword,tem);break;
default: cout<<"没有您预定的类型!"<<endl;break;
}
}
getchar();//供查看输出结果
}
void kwordanalyse(char str[])//将输入代码分类: 关键字和标识符
{
STR[j].str[t++]=str[i++];
if((str[i]>='a'&&str[i]<='z')||(str[i]<'A'&&str[i]>'Z'))
kwordanalyse(str);
else j++;
}
void numanalyse(char str[])//代码分类:不同类型的常数
{
STR[j].str[t++]=str[i++];
if((str[i]>='0'&&str[i]<='9')||(str[i]=='.'))
numanalyse(str);
else j++;
}
void othword(char str[]) //代码分类:其他特殊符号
{
STR[j].str[t]=str[i];
if((str[i]=='+'||str[i]=='-'||str[i]=='*'||str[i]=='/')&&(str[i+1]=='='||str[i+1]==str[i]))
STR[j].str[t+1]=str[i+1];
else
j++;
i++;
}
void key(char str[],char *st[],int tem) //判断保留字和标志符函数并输出
{
int t,b(0);
for(t=0;t<13;t++)
if(strcmp(STR[tem].str,st[t])==0)
{
b=1;
cout<<"<"<<STR[tem].str<<","<<t+1<<">"<<endl;
}
if(!b)
cout<<"<id,指向"<<STR[tem].str<<"的符号表项的指针,40>"<<endl;
}
void num(char str[],int tem) //判断整型数并输出
{
int k1,k2(0);
for(k1=0;k1<(int)strlen(STR[tem].str);k1++)
if(STR[tem].str[k1]=='.')
k2=1;
if(k2)
cout<<"<"<<STR[tem].str<<",浮点型常数>"<<endl;
else
cout<<"<"<<STR[tem].str<<","<<"整型常数>"<<endl;
}
void oth(char str[],char *st[],int tem) //判断特殊符号
{
int m,b(0);
for(m=13;m<39;m++)
if(strcmp(STR[tem].str,st[m])==0)
// {
// b=1;
cout<<"<"<<STR[tem].str<<","<<m+1<<">"<<endl;
// }
// if(!b)
// cout<<"<"<<STR[tem].str<<",此类型未定义>"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -