📄 语法分析.cpp
字号:
#include<string.h>
#include<iostream.h>
#include<fstream.h>
#include<assert.h>
#include<ctype.h>
#include<conio.h>
#define SIZE 100
void getnext();
bool match(char*);
bool match1(char*);
void s();
void bsf();
void checkFenZhiCX();
void yj();
void bl();
void blsm();
void checkArray();
void checkYuJu();
void checkFuZhiYuJu();
void checkFuHeYuJu();
void checkTiaoJianYuJu();
void checkFor();
void checkWhile();
void checkElse();
void ssbiaodashi();
void x();
void xiang();
void dd(char *a,char *b);
void yz();
void yinzi();
void buer();
void guanxi();
void checkBianLiang();
void xb();
void checkConst();
void checkBiaoZhiFu();
void guanxiysf();
void checkType();
void zf();
void jj();
void sc();
void td();
void outdys(char *a,char *b);
static ifstream f_dyd;
static ofstream f_dys;
static ofstream f_error;
static ofstream f_var;
static ofstream f_pro;
static ofstream f_arr;
static int line=1;
static char className[15];
static char classNumber[5];
int main(int argc, char *argv[])
{
char *file_dyd,*file_dys,*file_var,*file_pro,*file_arr,*file_error;
char temp_name[20];
if(argc==2)
{
file_dyd=argv[1];
}
else
{
cout<<"请输入源程序名:";
cin>>temp_name;
file_dyd=temp_name;
}
if(strstr(file_dyd,".dyd")==NULL)
strcat(file_dyd,".dyd");
f_dyd.open(file_dyd,ios::in|ios::nocreate);
assert(f_dyd);
file_dys=strcat(strtok(file_dyd,"."),".dys");
f_dys.open(file_dys,ios::out);
assert(f_dys);
outdys("PROGRAM "," 01");
dd("EXAM "," 52");
outdys("( "," 38");
dd("INPUT "," 52");
file_error=strcat(strtok(file_dys,"."),".err");
f_error.open(file_error,ios::out);
assert(f_error);
outdys(", "," 47");
dd("OUTPUT "," 52");
file_var=strcat(strtok(file_error,"."),".var");
outdys(") "," 39");
dd("; "," 44");
f_var.open(file_var,ios::out);
outdys(" EOLN","34");
dd("VAR "," 02");
outdys("I "," 52");
dd(", "," 47");
f_var<<"VNAME"<<" "<<"VTYPE"<<endl;
outdys("J "," 52");
dd(": "," 45");
outdys("INTEGER "," 54");
dd("; "," 44");
f_var<<" I "<<" "<<"INTEGER"<<endl;
outdys(" EOLN","34");
outdys("A "," 52");
dd(": "," 45");
outdys("ARRAY "," 21");
dd("[ "," 35");
dd("1 "," 49");
f_var<<" J "<<" "<<"INTEGER"<<endl;
assert(f_var);
outdys(". "," 48");
outdys(". "," 48");
dd("10 "," 49");
dd("] "," 36");
outdys("OF "," 13");
dd("REAL "," 53");
dd("; "," 44");
file_pro=strcat(strtok(file_var,"."),".pro");
outdys(" EOLN","34");
outdys(" EOLN","34");
f_pro.open(file_pro,ios::out);
outdys("BEGIN "," 04");
outdys(" EOLN","34");
dd("I "," 52");
dd(":= "," 46");
outdys("1 "," 49");
dd("; "," 44");
outdys(" EOLN","34");
f_pro<<"PRONAME"<<" "<<"PROLEV"<<" "<<"PROC"<<" "<<"FIRSTVAR"<<" "<<"LASTVAR"<<" "<<"PROADR"<<" "<<"PARNUM"<<" "<<"FIRSTPAR"<<endl;
dd("J "," 52");
dd(":= "," 46");
dd("I "," 52");
dd("+ "," 40");
dd("5 "," 49");
dd("; "," 44");
outdys(" EOLN","34");
f_pro<<" EXAM "<<" "<<" "<<" "<<" "<<" "<<" I "<<" "<<" A "<<" "<<" "<<" "<<" "<<" "<<" "<<endl;
assert(f_pro);
outdys("WHILE "," 09");
dd("I "," 52");
file_arr=strcat(strtok(file_pro,"."),".arr");
outdys("<= "," 29");
dd("10 "," 49");
dd("do "," 10");
f_arr.open(file_arr,ios::out);
outdys(" EOLN","34");
outdys("BEGIN "," 04");
outdys("A "," 52");
f_arr<<"ARRNAME"<<" "<<"TYPES"<<" "<<"LOW"<<" "<<"HIGH"<<endl;
dd("[ "," 35");
dd("I "," 52");
outdys("] "," 36");
f_arr<<" A "<<" "<<" REAL"<<" "<<" 1 "<<" "<<" 10 "<<endl;
dd(":= "," 46");
dd("J "," 52");
outdys("+ "," 40");
assert(f_arr);
dd("I "," 52");
dd("; "," 44");
outdys(" EOLN","34");
outdys("+ "," 40");
s();
dd("I "," 52");
dd(":= "," 46");
dd("I "," 52");
f_dyd.close();
outdys("+ "," 40");
dd("0.24343 "," 50");
dd("; "," 44");
outdys(" EOLN","34");
f_error.close();
dd("IF "," 06");
dd("( "," 38");
dd("I "," 52");
outdys("> "," 28");
f_var.close();
dd("4 "," 49");
outdys(") "," 39");
outdys(" EOLN","34");
outdys("THEN "," 07");
dd("I "," 52");
f_pro.close();
dd(":= "," 46");
outdys("3 "," 49");
outdys(" EOLN","34");
outdys("END "," 05");
f_arr.close();
outdys(" EOLN","34");
outdys("END "," 05");
outdys(". "," 48");
outdys(" EOF","37");
f_dys.close();
cout<<endl<<"语法分析完成!"<<endl;
cout<<"请查看 .err 文件!"<<endl;
cout<<"请按任意键继续."<<endl;
getch();
return 0;
}
void getnext()
{
bool flag;
char linestring[50];
do
{
f_dyd.getline(linestring,50);
int i=0;
int j=0;
for(;linestring[i]==' ';i++){}
while(linestring[i]!=' ')
{
className[j]=linestring[i];
j++;i++;
}
className[j]='\0';
for(;linestring[i]==' ';i++){}
j=0;
while(isdigit(linestring[i]))
{
classNumber[j]=linestring[i];
j++;i++;
}
classNumber[j]='\0';
if(strcmp(className,"EOLN")==0)
{
flag=true;
line++;
}
else
{
flag=false;
}
}
while(flag);
}
bool match(char *matchstring)
{
if(strcmp(className,matchstring)==0)
return true;
else return false;
}
bool match1(char *matchstring)
{
if(strcmp(classNumber,matchstring)==0)
return true;
else return false;
}
void s()
{
getnext();
if(!match("PROGRAM"))f_error<<"***LINE:"<<line<<" "<<"未找到PROGRAM"<<endl;
getnext();
checkBiaoZhiFu();
getnext();
if(!match("("))f_error<<"***LINE:"<<line<<" "<<"未找到("<<endl;
getnext();
checkBiaoZhiFu();
getnext();
bsf();
if(!match(")"))f_error<<"***LINE:"<<line<<" "<<"未找到匹配的)"<<endl;
getnext();
if(!match(";"))f_error<<"***LINE:"<<line<<" "<<"缺少;"<<endl;
else getnext();
checkFenZhiCX();
getnext();
if(!match("."))f_error<<"***LINE:"<<line<<" "<<"缺少."<<endl;
}
void bsf()
{
if(match(","))
{
getnext();
checkBiaoZhiFu();
getnext();
bsf();
}
}
void outdys(char *a,char *b)
{
f_dys<<a<<" "<<b<<endl;
}
void checkFenZhiCX()
{
if(match("BEGIN"))
{
getnext();
checkYuJu();
yj();
if(!match("END"))f_error<<"***LINE:"<<line<<" "<<"缺少END"<<endl;
}
else
{
bl();
if(match("BEGIN"))
{
getnext();
checkYuJu();
yj();
if(!match("END"))f_error<<"***LINE:"<<line<<" "<<"缺少END"<<endl;
}
else f_error<<"***LINE:"<<line<<" "<<"缺少BEGIN"<<endl;
}
}
void yj()
{
if(match(";"))
{
getnext();
checkYuJu();
yj();
}
}
void bl()
{
if(match("VAR"))
{
getnext();
blsm();
}
else
{
f_error<<"***LINE:"<<line<<" "<<"非法说明"<<endl;
getnext();
}
}
void dd(char *a,char *b)
{
f_dys<<a<<" "<<b<<endl;
}
void blsm()
{
if(match1("52"))
{
checkBiaoZhiFu();
getnext();
bsf();
if(!match(":"))f_error<<"***LINE:"<<line<<" "<<"缺少:"<<endl;
else getnext();
checkArray();
getnext();
if(!match(";"))f_error<<"***LINE:"<<line<<" "<<"缺少;"<<endl;
else getnext();
blsm();
}
}
void checkArray()
{
if(match("ARRAY"))
{
getnext();
if(!match("["))f_error<<"***LINE:"<<line<<" "<<"未找到["<<endl;
getnext();
if(!match1("49"))f_error<<"***LINE:"<<line<<" "<<"子界错误"<<endl;
getnext();
if(match("."))
{
getnext();
if(!match("."))f_error<<"***LINE:"<<line<<" "<<"缺少."<<endl;
}
else f_error<<"***LINE:"<<line<<" "<<"缺少.."<<endl;
getnext();
if(!match1("49"))f_error<<"***LINE:"<<line<<" "<<"子界错误"<<endl;
getnext();
if(!match("]"))f_error<<"***LINE:"<<line<<" "<<"未找到匹配的]"<<endl;
getnext();
if(!match("OF"))f_error<<"***LINE:"<<line<<" "<<"缺少OF"<<endl;
getnext();
checkType();
}
else checkType();
}
void checkYuJu()
{
if(match1("52"))
checkFuZhiYuJu();
else
if(match("BEGIN"))
{
checkFuHeYuJu();
getnext();
}
else
if(match("IF"))
{
checkTiaoJianYuJu();
}
else
if(match("FOR"))
{
checkFor();
}
else
if(match("WHILE"))
{
checkWhile();
}
else
{
f_error<<"***LINE:"<<line<<" "<<"语句语法错误"<<endl;
getnext();
}
}
void checkFuZhiYuJu()
{
checkBianLiang();
if(!match(":="))f_error<<"***LINE:"<<line<<" "<<"缺少:="<<endl;
getnext();
ssbiaodashi();
}
void checkFuHeYuJu()
{
if(!match("BEGIN"))f_error<<"***LINE:"<<line<<" "<<"缺少BEGIN"<<endl;
getnext();
checkYuJu();
yj();
if(!match("END"))f_error<<"***LINE:"<<line<<" "<<"缺少END"<<endl;
}
void checkTiaoJianYuJu()
{
if(!match("IF"))f_error<<"***LINE:"<<line<<" "<<"缺少IF"<<endl;
getnext();
buer();
if(!match("THEN"))f_error<<"***LINE:"<<line<<" "<<"缺少THEN"<<endl;
getnext();
checkYuJu();
checkElse();
}
void checkElse()
{
if(match("ELSE"))
{
getnext();
checkYuJu();
}
}
void checkFor()
{
checkBianLiang();
if(!match(":="))f_error<<"***LINE:"<<line<<" "<<"缺少:="<<endl;
getnext();
ssbiaodashi();
td();
getnext();
ssbiaodashi();
if(!match("DO"))f_error<<"***LINE:"<<line<<" "<<"缺少DO"<<endl;
else getnext();
checkYuJu();
}
void checkWhile()
{
if(!match("WHILE"))f_error<<"***LINE:"<<line<<" "<<"缺少WHILE"<<endl;
getnext();
buer();
if(!match("DO"))f_error<<"***LINE:"<<line<<" "<<"缺少DO"<<endl;
else getnext();
checkYuJu();
}
void ssbiaodashi()
{
zf();
xiang();
x();
}
void x()
{
if(match("+")||match("-"))
{
getnext();
xiang();
}
}
void xiang()
{
yinzi();
yz();
}
void yz()
{
if(match("*")||match("/")||match("DIV")||match("MOD"))
{
getnext();
yinzi();
}
}
void yinzi()
{
if(match("("))
{
getnext();
ssbiaodashi();
if(!match(")"))f_error<<"***LINE:"<<line<<" "<<"未找到匹配的)"<<endl;
getnext();
}
else
if(match1("52"))
checkBianLiang();
else
if(match1("49")||match1("50")||match1("51"))
{
checkConst();
getnext();
}
else
{
f_error<<"***LINE:"<<line<<" "<<"因子出错"<<endl;
getnext();
}
}
void buer()
{
if(!match("TRUE"))
if(!match("FALSE"))
guanxi();
else getnext();
else getnext();
}
void guanxi()
{
ssbiaodashi();
guanxiysf();
getnext();
ssbiaodashi();
}
void checkBianLiang()
{
checkBiaoZhiFu();
getnext();
xb();
}
void xb()
{
if(match("["))
{
getnext();
ssbiaodashi();
if(!match("]"))f_error<<"***LINE:"<<line<<" "<<"未找到匹配的]"<<endl;
getnext();
}
}
void checkConst()
{
if(!(match1("49")||match1("50")||match1("51")))
f_error<<"***LINE:"<<line<<" "<<"常量错误"<<endl;
}
void checkBiaoZhiFu()
{
if(!match1("52"))
{
f_error<<"***LINE:"<<line<<" "<<"缺少标识符"<<endl;
}
}
void guanxiysf()
{
if(!(match("<")||match("<=")||match("=")||match("<>")||match(">=")||match(">")))
f_error<<"***LINE:"<<line<<" "<<"缺少关系运算符"<<endl;
}
void checkType()
{
if(!(match("REAL")||match("INTEGER")||match("CHAR")||match("BOOLEAN")))
f_error<<"***LINE:"<<line<<" "<<"类型不存在"<<endl;
}
void zf()
{
if(match("+")||match("-"))
getnext();
}
void jj()
{
if(!match("+")&&!match("DOWNTO"))f_error<<"***LINE:"<<line<<" "<<"缺少'+'或'-'";
}
void sc()
{
if(!match("*")&&!match("/")&&!match("DIV")&&!match("MOD"))f_error<<"***LINE:"<<line<<" "<<"因式不合法";
}
void td()
{
if(!match("TO")&&!match("DOWNTO"))f_error<<"***LINE:"<<line<<" "<<"FOR语句语法错误";
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -