📄 yufa.cpp
字号:
// M:程序,S:语句串,S1:语句,Z:赋值语句,E:表达式,T:项,F:因子
// P ::= begin S end
// S ::= S{;S1}
// S1 ::= Z
// Z ::= ID:=E
// E ::= T{+T|-T}
// T ::= F{*F|/F}
// F ::= ID|NUM|(E)
#include <iostream>
using namespace std;
#include <iomanip>
#include <string.h>
using std::cout;
using std::cin;
using std::endl;
using std::string;
char prog[80],token[8];//prog存放原程序字符串,token存放单词自身字符串
char ch;
int a,syn,p,m,n,sum;//syn单词种别码,p是缓冲区prog的指针,m是token的指针
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();//扫描子程序
int i=0; //用于控制当前要判断的字符
bool judge=0;//用于判断输出合法或不合法
void M();
void S();
void S1();
void Z();
void E();
void T();
void F();
void match(int &k);//此程序对k执行加1操作
void scaner();
int main()
{
cout<<"输入一个待判断的符号串(以#结尾):\n";
do{
cin>>ch;
prog[i++]=ch;
}while(ch!='#');//输入串存入数组A
p=0;
M();
if(judge==0)
cout<<"\n此输入串合法\n\n";
else
cout<<"\n此输入串不合法\n\n";
return 0;
}
void M()
{
scaner();
if(syn==1)
match(i);
else
judge=1;
S();
scaner();
if(syn==6)
{
match(i);
scaner();
if(syn!=0)
judge=1;
}
else
judge=1;
}
void S()
{
S1();
a=p;
loop:
scaner();
if(syn==26)
{
match(i);
S1();
a=p;
}
else
{
p=a;
return;
}
goto loop;
}
void S1()
{
Z();
}
void Z()
{
scaner();
if(syn==10)
{
match(i);
scaner();
if(syn==18)
{
match(i);
E();
}
else
judge=1;
}
else judge=1;
}
void E()
{
T();
a=p;
loop:
scaner();
if(syn==13||syn==14)
{
match(i);
T();
a=p;
}
else
{
p=a;
return;
}
goto loop;
}
void T()
{
F();
a=p;
loop:
scaner();
if(syn==15||syn==16)
{
match(i);
F();
a=p;
}
else {
p=a;
return;
}
goto loop;
}
void F()
{
scaner();
if(syn==10)
match(i);
else if(syn==11)
match(i);
else if(syn==27)
{
match(i);
E();
scaner();
if(syn==28)
match(i);
else judge=1;
}
else judge=1;
}
void scaner()
{
for(n=0;n<8;n++)
token[n]=0;//每次调用都把 token清零
m=0;
sum=0;
ch=prog[p++]; //读入一个字符
while(ch=='_')
ch=prog[p++]; //若ch是空格则向后移动
if(isalpha(ch))//ch为字母字符
{
while(isalnum(ch))//ch为字母或数字字符;
{
token[m++]=ch;
ch=prog[p++];//读下一个字符;
}
token[m++]='\0';
p=p-1;//回退一个字符;
for(n=0;n<6;n++)
{
if(strcmp(token,rwtab[n])==0)//判断token是否为关键字
{
syn=n+1;//设置关键字的syn分别为:1 2 3 4 5 6
break;
}
else
syn=10;//设置标识符syn
}
}
else if(isdigit(ch))//ch是数字字符
{
while(isdigit(ch))//ch为数字字符
{
sum=sum*10+ch-'0';
ch=prog[p++];//读下一个字符
}
p=p-1;//回退一个字符;
syn=11;
}
else if(ch=='<')
{
token[m++]=ch;
ch=prog[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p=p-1;//回退一个字符;
}
}
else if(ch=='>')
{ token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p=p-1;//回退一个字符
}
}
else if(ch==':')
{
token[m++]=ch;
ch=prog[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p=p-1;
}
}
else if(ch=='=') { syn=25;token[0]=ch; }
else if(ch=='+') { syn=13;token[0]=ch; }
else if(ch=='-') { syn=14;token[0]=ch; }
else if(ch=='*') { syn=15;token[0]=ch; }
else if(ch=='/') { syn=16;token[0]=ch; }
else if(ch==';') { syn=26;token[0]=ch; }
else if(ch=='(') { syn=27;token[0]=ch; }
else if(ch==')') { syn=28;token[0]=ch; }
else if(ch=='#') { syn=0;token[0]=ch; }
else syn=-1;
}
void match(int &k)
{
k++;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -