📄 gramany.h
字号:
#include <iostream>
#include <string>
#include <fstream>
#include "Word.h"
#define $program 1
#define $const 2
#define $var 3
#define $procedure 4
#define $begin 5
#define $if 6
#define $while 7
#define $call 8
#define $read 9
#define $write 10
#define $end 11
#define $then 12
#define $else 13
#define $do 14
#define $odd 15
#define $lop 16 //<lop> → =|<>|<|<=|>|>=
#define $aop 17 //<aop> → +|-
#define $mop 18 //<mop> → *|/
#define $id 19 //<id> → l{l|d}
#define $integer 20 //<integer> → d{d}
#define $ 21 // ;
#define $equal 22 // :=
#define $and 23 // ,
#define $leftbrack 24 //(
#define $rightbrack 25 //)
using namespace std;
bool ProceBlock(int &i,word *Token);
bool ProceExp(int &i,word *Token);
bool ProceBody(int &i,word *Token);
int bx,ex,y,dx[MAX_LEV+1]; //单词坐标
bool ProceFactor(int &i,word *Token) //<factor>→<id>|<integer>|(<exp>)
{
if(Token[i].ReturnWType()==$id)
i++;
else if(Token[i].ReturnWType()==$integer)
i++;
else if(Token[i].ReturnWType()==$leftbrack)
{
i++;
if(!ProceExp(i,Token))
return false;
if(Token[i].ReturnWType()==$rightbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少常量或标识符:第"<<y<<"行"<<endl;
return false;
}
return true;
}
bool ProceTerm(int &i,word *Token) //<term> → <factor>{<mop><factor>}
{
if(!ProceFactor(i,Token))
return false;
while(Token[i].ReturnWType()==$mop)
{
i++;
if(!ProceFactor(i,Token))
return false;
}
return true;
}
bool ProceExp(int &i,word *Token) //<exp> → [+|-]<term>{<aop><term>}
{
if(!strcmp(Token[i].ReturnCont(),"+") || !strcmp(Token[i].ReturnCont(),"-"))
i++;
if(!ProceTerm(i,Token))
return false;
while(Token[i].ReturnWType()==$aop)
{
i++;
if(!ProceTerm(i,Token))
return false;
}
return true;
}
bool ProceLexp(int &i,word *Token) //<lexp> → <exp> <lop> <exp>|odd <exp>
{
if(Token[i].ReturnWType()==$odd)
{
i++;
if(!ProceExp(i,Token))
return false;
}
else if(ProceExp(i,Token))
{
if(Token[i].ReturnWType()==$lop)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少关系运算符:第"<<y<<"行"<<endl;
return false;
}
if(!ProceExp(i,Token))
return false;
}
else
return false;
return true;
}
bool ProceState(int &i,word *Token) //<statement> →
{
if(Token[i].ReturnWType()==$id) //<id> := <exp>
{
i++;
if(Token[i].ReturnWType()==$equal)
{
i++;
if(!ProceExp(i,Token))
return false;
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"应输入\":=\":第"<<y<<"行"<<endl;
return false;
}
}
else if(Token[i].ReturnWType()==$if) //if <lexp> then <statement>[else <statement>]
{
i++;
if(!ProceLexp(i,Token))
return false;
if(Token[i].ReturnWType()==$then)
i++;
else
return false;
if(!ProceState(i,Token))
return false;
if(Token[i].ReturnWType()==$else)
{
i++;
if(!ProceState(i,Token))
return false;
}
}
else if(Token[i].ReturnWType()==$while) //while <lexp> do <statement>
{
i++;
if(!ProceLexp(i,Token))
return false;
if(Token[i].ReturnWType()==$do)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少\"do\":第"<<y<<"行"<<endl;
return false;
}
if(!ProceState(i,Token))
return false;
}
else if(Token[i].ReturnWType()==$call) //call <id>[(<exp>{,<exp>})]
{
i++;
if(Token[i].ReturnWType()==$id)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少标识符:第"<<y<<"行"<<endl;
return false;
}
if(Token[i].ReturnWType()==$leftbrack)
{
i++;
if(!ProceExp(i,Token))
return false;
while(Token[i].ReturnWType()==$and)
{
i++;
if(!ProceExp(i,Token))
return false;
}
if(Token[i].ReturnWType()==$rightbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
return false;
}
}
}
else if(ProceBody(i,Token)); //<body>
else if(Token[i].ReturnWType()==$read) //read (<id>{,<id>})
{
i++;
if(Token[i].ReturnWType()==$leftbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少\"(\":第"<<y<<"行"<<endl;
return false;
}
if(Token[i].ReturnWType()==$id)
i++;
else
return false;
while(Token[i].ReturnWType()==$and)
{
i++;
if(Token[i].ReturnWType()==$id)
i++;
else
return false;
}
if(Token[i].ReturnWType()==$rightbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
return false;
}
}
else if(Token[i].ReturnWType()==$write) //write (<exp>{,<exp>})
{
i++;
if(Token[i].ReturnWType()==$leftbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少\"(\":第"<<y<<"行"<<endl;
return false;
}
if(!ProceExp(i,Token))
return false;
while(Token[i].ReturnWType()==$and)
{
i++;
if(!ProceExp(i,Token))
return false;
}
if(Token[i].ReturnWType()==$rightbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"错误的语句:第"<<y<<"行"<<endl;
return false;
}
return true;
}
bool ProceBody(int &i,word *Token) //<body> → begin <statement>{;<statement>}end
{
if(Token[i].ReturnWType()==$begin)
{
i++;
if(!ProceState(i,Token))
return false;
while(Token[i].ReturnWType()==$)
{
i++;
if(!ProceState(i,Token))
return false;
}
}
else
return false;
if(Token[i].ReturnWType()==$end)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"此处应输入\"end\":第"<<y<<"行"<<endl;
return false;
}
return true;
}
bool ProceConst(int &i,word *Token) //<const> → <id>:=<integer>
{
if(Token[i].ReturnWType()==$id)
{
i++;
if(Token[i].ReturnWType()==$equal)
{
i++;
if(Token[i].ReturnWType()==$integer)
{
i++;
return true;
}
}
}
return false;
}
bool ProceCondecl(int &i,word *Token) //<condecl> → const <const>{,<const>}
{
if(Token[i].ReturnWType()==$const)
{
i++;
if(!ProceConst(i,Token))
return false;
while(Token[i].ReturnWType()==$and)
{
i++;
if(!ProceConst(i,Token))
return false;
}
}
return true;
}
bool ProceVardecl(int &i,word *Token) //<vardecl> → var <id>{,<id>}
{
if(Token[i].ReturnWType()==$var)
{
i++;
if(Token[i].ReturnWType()==$id)
{
i++;
while(Token[i].ReturnWType()==$and)
{
i++;
if(Token[i].ReturnWType()==$id)
i++;
else
{
i++;
Token[i].ReturnXY(bx,ex,y);
cout<<"\",\"后应当输入变量名:第"<<y<<"行"<<endl;
return false;
}
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少标识符:第"<<y<<"行"<<endl;
return false;
}
}
return true;
}
bool ProceProc(int &i,word *Token) //<proc> → procedure <id>(<id>{,<id>});<block>{;<proc>}
{
int cx0,tx0;
if(Token[i].ReturnWType()==$procedure)
{
i++;
if(Token[i].ReturnWType()==$id)
{
i++;
if(Token[i].ReturnWType()==$leftbrack)
{
i++;
if(Token[i].ReturnWType()==$id)
{
i++;
while(Token[i].ReturnWType()==$and)
{
i++;
if(Token[i].ReturnWType()==$id)
i++;
else
{
i++;
cout<<"\",\"后应当输入变量名"<<endl;
return false;
}
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"应当输入变量名:第"<<y<<"行"<<endl;
return false;
}
if(Token[i].ReturnWType()==$rightbrack)
i++;
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"左右括号不匹配:第"<<y<<"行"<<endl;
return false;
}
if(Token[i].ReturnWType()==$)
{
i++;
if(!ProceBlock(i,Token))
return false;
while(Token[i].ReturnWType()==$)
{
i++;
if(!ProceProc(i,Token))
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少\";\":第"<<y<<"行"<<endl;
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少\"(\":第"<<y<<"行"<<endl;
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"缺少标识符:第"<<y<<"行"<<endl;
return false;
}
}
return true;
}
bool ProceBlock(int &i,word *Token) //<block> → [<condecl>][<vardecl>][<proc>]<body>
{
lev++;
if(!ProceCondecl(i,Token))
return false;
if(!ProceVardecl(i,Token))
return false;
if(!ProceProc(i,Token))
return false;
if(!ProceBody(i,Token))
return false;
return true;
}
bool ProceProg(int &i,word *Token) //<prog> → program <id>;<block>
{
if(Token[i].ReturnWType()==$program)
{
i++;
if(Token[i].ReturnWType()==$id)
{
i++;
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入标识符;"<<endl;
return false;
}
if(Token[i].ReturnWType()==$)
{
i++;
if(!ProceBlock(i,Token))
return false;
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入;"<<endl;
return false;
}
}
else
{
Token[i].ReturnXY(bx,ex,y);
cout<<"第"<<y<<"行第"<<bx<<"个字符处错误,应输入Program"<<endl;
return false;
}
return true;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -