📄 syntax.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include"scanner.h"
int flag=1;
extern int lineno;
int BLK(ifstream&,int);
int constant(ifstream&,int);
int vary(ifstream&,int);
int funcpro(ifstream&,int);
int CS(ifstream&,int);
int IDT(ifstream&,int);
int sentence(ifstream&,int);
int ET(ifstream&,int);
int CE(ifstream&,int);
int E(ifstream&,int);
int T(ifstream&,int);
int F(ifstream&,int);
void error(int);
void main( )
{
int a;
ifstream sf("c:\\file.txt");
if(sf.fail())
{
cerr<<"error opening file EL.txt\n";
return;
}
a=scanner(sf);
if(a==13) a=scanner(sf);//program 程序的第一句
if(a==21) a=scanner(sf);//自己定义的变量
if(a!=24) //;
error(13);
else
a=scanner(sf);//进入分程序
a=BLK(sf,a);
if(a!=26)
error(14);
cout<<"this syntax has been completed!"<<endl;
if(flag)
cout<<"this grammar of source program is regular."<<endl;
else
cout<<"this grammar of source program is wrong!"<<endl;
sf.close();
}
void error(int err)
{
cout<<lineno<<" line! :";
switch(err)
{
case 0: cout<<" expected'('"<<endl; break;
case 1: cout<<" expected'因子'"<<endl; break;
case 2: cout<<" expected':='"<<endl; break;
case 3: cout<<" expected'then'"<<endl; break;
case 4: cout<<" expected'do'"<<endl; break;
case 5: cout<<" expected')'"<<endl; break;
case 6: cout<<" expected'begin'"<<endl; break;
case 7: cout<<" expected'end'"<<endl; break;
case 8: cout<<" expected'标识符'"<<endl;break;
case 9: cout<<" expected'常量'"<<endl; break;
case 10: cout<<" expected'='"<<endl; break;
case 11: cout<<" expected':'"<<endl; break;
case 12: cout<<" 缺interger说明"<<endl; break;
case 13: cout<<" expected';'"<<endl; break;
case 14: cout<<" expected'.'"<<endl; break;
case 15: cout<<" 不认识字符"<<endl; break;
case 16: cout<<" 标识符重定义"<<endl; break;
case 17: cout<<" 整数越界"<<endl; break;
case 18: cout<<" 标识符未定义"<<endl; break;
default: cout<<" ..."<<endl; break;
}
flag=0;
}
int BLK(ifstream& sf,int a)
{
if(a==27) //(
{
a=scanner(sf);
//缺处理形参
if(a!=28) //存在形参的处理
{
a=IDT(sf,a);
if(a!=25) //缺:
error(11);
else
a=scanner(sf);
if(a!=9) //缺interger
error(12);
else
a=scanner(sf);
}
if(a!=28) //缺 )
error(5);
else
a=scanner(sf);
if(a!=25) //缺:
error(11);
else
a=scanner(sf);
if(a!=9) //缺interger
error(12);
else
a=scanner(sf);
if(a!=24) //缺;
error(13);
else
a=scanner(sf);
}
if(a==2) //常量定义
{
a=scanner(sf);
a=constant(sf,a);
}
if(a==18) //变量说明
{
a=scanner(sf);
a=vary(sf,a);
}
if(a==7) //函数说明
{
a=scanner(sf);
a=funcpro(sf,a);
}
while(a==7)
{
a=scanner(sf);
a=funcpro(sf,a);
}
if(a!=1) //复合语句
error(6);
else
{
a=scanner(sf);
a=CS(sf,a);
}
if(a!=24&&a!=26) //缺';'或者'.'
{
error(13);
}
return a;
}
int constant(ifstream& sf,int a)
{
if(a==21) a=scanner(sf);
if(a==38) a=scanner(sf);
if(a==22) a=scanner(sf); //此处需查表赋值
while(a==23)
{
a=scanner(sf);
if(a==21) a=scanner(sf);
if(a==38) a=scanner(sf);
if(a==22) a=scanner(sf); //此处需查表赋值
}
if(a==24)
a=scanner(sf);
else
error(13);
return a;
}
int vary(ifstream& sf,int a) //此<变量定义>将书上的Backus表示法作了修改,更类似于<常量定义>的表示法
{
a=IDT(sf,a);
if(a==25) a=scanner(sf);//:
if(a==9) a=scanner(sf);//integer 此处需填表
while(a==23)//,
{
a=scanner(sf);
a=IDT(sf,a);
if(a==25) a=scanner(sf);
if(a==9) a=scanner(sf); //此处需填表
}
if(a==24)
a=scanner(sf);
else
error(13);
return a;
}
int funcpro(ifstream& sf,int a)
{
if(a==21) a=scanner(sf);//标志符
a=BLK(sf,a);
if(a!=24)
error(13);
else
a=scanner(sf);
return a;
}
int CS(ifstream& sf,int a)
{
a=sentence(sf,a);
while(a==24)
{
a=scanner(sf);
a=sentence(sf,a);
}
if(a!=6)
error(7);
else
a=scanner(sf);
return a;
}
int IDT(ifstream& sf,int a)//是否为标志符
{
if(a==21) a=scanner(sf);
while(a==23)//,
{
a=scanner(sf);
if(a==21)
a=scanner(sf);
}
return a;
}
int sentence(ifstream& sf,int a)
{
switch(a)
{
case 21: a=scanner(sf);
if(a==44) a=scanner(sf); //赋值语句
a=E(sf,a);
break;
case 1: a=scanner(sf);
a=CS(sf,a); //复合语句
break;
case 8: a=scanner(sf);
a=CE(sf,a); //if语句
if(a!=16)
error(3);
else
a=scanner(sf);
a=sentence(sf,a);
if(a==5)
{
a=scanner(sf);
a=sentence(sf,a);
}
break;
case 19: a=scanner(sf);
a=CE(sf,a); //while语句
if(a==4)
a=scanner(sf);
else
error(4);
a=sentence(sf,a);
break;
case 14: a=scanner(sf);
if(a==27) //read语句
a=scanner(sf);
else
error(0);
a=IDT(sf,a);
if(a==28)
a=scanner(sf);
else
error(5);
break;
case 20: a=scanner(sf);
if(a==27) //write语句
a=scanner(sf);
else
error(0);
a=ET(sf,a);
if(a==28)
a=scanner(sf);
else
error(5);
break;
default: break;
}
return a;
}
int ET(ifstream& sf,int a)
{
a=E(sf,a);
while(a==23)
{
a=scanner(sf);
a=E(sf,a);
}
return a;
}
int CE(ifstream& sf,int a)
{
a=E(sf,a);
while(a>=38&&a<=43)
{
a=scanner(sf);
a=E(sf,a);
}
return a;
}
int E(ifstream& sf,int a) //没有处理单目运算符
{
a=T(sf,a);
while(a==34||a==35)
{
a=scanner(sf);
a=T(sf,a);
}
return a;
}
int T(ifstream& sf,int a)
{
a=F(sf,a);
while(a==3||a==36||a==37)
{
a=scanner(sf);
a=F(sf,a);
}
return a;
}
int F(ifstream& sf,int a) //因子文法没有改写
{
switch(a)
{
case 21: a=scanner(sf);
if(a==27)
{
a=scanner(sf);
a=ET(sf,a);
if(a!=28)
error(5);
else
a=scanner(sf);
break;
}else
break;
case 27: a=scanner(sf);
a=E(sf,a);
if(a!=28)
error(5);
else
a=scanner(sf);
break;
case 22: a=scanner(sf);
break;
}
return a;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -