📄 新建 文本文档.txt
字号:
/***********词法分析程序***********/
# include<iostream.h>
# include<fstream.h>
# include<math.h>
int cc=0;
char line[20],n[10];
ifstream input("s1.cpp");/* 源程序 */
ofstream output("s2.cpp");/****目标程序*****/
int empt() //从缓冲区读字符
{
int c=0;
for(int i=0;i<20;i++)
{
if(line[i]==' ')
c++;
}
if(c==20)
return 1;
else
return 0;
}
char getch() //取字符过程
{
char h;
int x=empt();
if(x==1)
{
cc=0;
input>>line;
h=line[cc];
line[cc]=' ';
cc++;
return h;
}
else
{
h=line[cc];
line[cc]=' ';
cc++;
return h;
}
}
int lnum(char x[],int y)/****返回数组个数***/
{
int j=0;
for(int i=0;i<y;i++)
{
if(x[i]!=' ')
j++;
else
return j;
}
}
int cmp(char x[],char y[],int a,int b,int c)/*比较是否与保留字相等*/
{ /*如果不等则是标识符*/
int count=0;
for(int i=0;i<c;i++)
if(x[i]==y[i])
count++;
if(count==c)
return 1;
else
return 0;
}
void fnum(char x)/*区分数字与常数*/
{
for(int i=0;x>='0'&&x<='9';i++)
{
output<<x;
n[i]=x;
x=getch();
}
}
int isakw(char m[],int n)/*与其保留字表进行识别*/
{
int num,t1,t2,t3,t4;
num=lnum(m,n);
char kw01[3]="if";
char kw02[3]="do";
char kw03[4]="var";
char kw04[4]="end";
char kw05[4]="odd";
char kw06[5]="call";
char kw07[5]="then";
char kw08[6]="const";
char kw09[6]="begin";
char kw10[6]="while";
char kw11[6]="write";
char kw12[5]="read";
char kw13[10]="procedure";
if(num==2)
{
t1=cmp(m,kw01,n,3,num);
t2=cmp(m,kw02,n,3,num);
if(t1==1||t2==1)
return 1;
else
return 0;
}
if(num==3)
{
t1=cmp(m,kw03,n,4,num);
t2=cmp(m,kw04,n,4,num);
t3=cmp(m,kw05,n,4,num);
if(t1==1||t2==1||t3==1)
return 1;
else
return 0;
}
if(num==4)
{
t1=cmp(m,kw06,n,5,num);
t2=cmp(m,kw07,n,5,num);
t3=cmp(m,kw12,n,5,num);
if(t1==1||t2==1||t3==1)
return 1;
else
return 0;
}
if(num==5)
{
t1=cmp(m,kw08,n,6,num);
t2=cmp(m,kw09,n,6,num);
t3=cmp(m,kw10,n,6,num);
t4=cmp(m,kw11,n,6,num);
if(t1==1||t2==1||t3==1||t4==1)
return 1;
else
return 0;
}
if(num==9)
{
t1=cmp(m,kw13,n,10,num);
if(t1==1)
return 1;
else
return 0;
}
}
int main()
{
int k,sym;
char a[10];
char*number;
for(int i=0;i<20;i++)
line[i]=' ';
for(int i=0;i<10;i++)
{
a[i]=' ';
n[i]=' ';
}
for(char ch=' ';ch!='.'; )
{
for(int i=0;i<10;i++)
a[i]=' ';
ch=getch();
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
for(k=0;((ch>='0'&&ch<='9')||(ch>='a'&&ch<='z')||
(ch>='A'&&ch<='Z'));k++)
{
if(k<10)
a[k]=ch;
ch=getch();
}
if(isakw(a,10)==1)
{
sym=3;
output<<"保留字 ";
for(int i=0;i<lnum(a,10);i++)
output<<a[i];
output<<" ("<<sym<<",'";
for(int i=0;i<lnum(a,10);i++)
output<<a[i];
output<<"')"<<endl;
}
else
{
sym=1;
output<<"标识符 ";
for(int i=0;i<lnum(a,10);i++)
output<<a[i];
output<<" ("<<sym<<",'";
for(int i=0;i<lnum(a,10);i++) output<<a[i];
output<<"')"<<endl;
}
}
else
{
if(ch>='0'&&ch<='9')
{
char l=ch;
sym=2;
output<<"常 数 ";
fnum(ch);
int k=lnum(n,10);
output<<" ("<<sym<<",'";
for(int i=0;i<k;i++)
output<<n[i];
output<<"')"<<endl;
}
else
{
if(ch==','||ch==';'||ch=='.'||ch=='('||ch==')')
{
sym=4;
output<<"界 符 "<<ch<<" ("<<sym
<<",'"<<ch<<"')"<<endl;
}
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='#')
{
sym=5;
output<<"运算符 "<<ch<<" ("<<sym
<<",'"<<ch<<"')"<<endl;
}
if(ch=='>'||ch=='<')
{
sym=5;
char l=ch;
ch=getch();
if(ch=='=')
output<<"运算符 "<<l<<ch<<" ("<<sym
<<",'"<<l<<ch<<"')"<<endl;
else
output<<"运算符 "<<l<<" ("<<sym
<<",'"<<l<<"')"<<endl;
}
if(ch==':')
{
sym=5;
ch=getch();
if(ch=='=')
output<<"运算符 "<<":="<<" ("<<sym
<<",'"<<":="<<"')"<<endl;
}
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -