yufafenxiqi.cpp
来自「编译原理实验中一个简单的语法分析器,用C++语言编写.」· C++ 代码 · 共 276 行
CPP
276 行
#include <string.h>
#include <malloc.h>
#include <stdio.h>
#include <iostream.h>
char progstring[1024];
char token[32];
char ch;
char *kws[6]={"begin","if","then","while","do","end"};
int syn,p,m,sum,kk;
void Irpareser();
void expression();
void scaner();
void factor();
void term();
void statement();
void yucu();
int IsAlpha(char ch)
{
if((ch>='a' && ch<='z') || (ch>='A' && ch<='Z'))
return 1;
return 0;
}
int IsDigit(char ch)
{
if(ch>='0' && ch<='9')
return 1;
return 0;
}
int IsAlnum(char ch)
{
if(IsDigit(ch) || IsAlpha(ch))
return 1;
return 0;
}
void yucu()
{
statement();
while(syn==26){
scaner();
statement();
}
return;
}
void parser()
{
if(syn==1){
scaner();
yucu();
if(syn==6){
scaner();
if(syn==0 && kk==0)
printf("success");
}
else{if(kk!=1) cout<<"缺少end"; kk=1;}
}
else {
cout<<"缺少begin";
kk=1;
}
return;
}
void scaner()
{
char n;
memset(token,0,32);
ch=progstring[p++];
m=0;
kk=0;
while(ch==' ')
ch=progstring[p++];
if(IsAlpha(ch))
{
while(IsAlnum(ch))
{
token[m++]=ch;
ch=progstring[p++];
}
token[m++]='\0';
p--;
syn=10;
for(n=0;n<6;n++)
if(strcmp(token,kws[n])==0)
{
syn=n+1;
break;
}
}
else if(IsDigit(ch))
{
sum=0;
while(IsDigit(ch))
{
sum=sum*10+ch-'0';
ch=progstring[p++];
}
p--;
syn=11;
}
else
switch(ch)
{
case '<':
m=0;
token[m++]=ch;
ch=progstring[p++];
if(ch=='>')
{
syn=21;
token[m++]=ch;
}
else if(ch=='=')
{
syn=22;
token[m++]=ch;
}
else
{
syn=20;
p--;
}
break;
case '>':
token[m++]=ch;
ch=progstring[p++];
if(ch=='=')
{
syn=24;
token[m++]=ch;
}
else
{
syn=23;
p--;
}
break;
case ':':
token[m++]=ch;
ch=progstring[p++];
if(ch=='=')
{
syn=18;
token[m++]=ch;
}
else
{
syn=17;
p--;
}
break;
case '+':
syn=13;
token[0]=ch;
break;
case '-':
syn=14;
token[0]=ch;
break;
case '*':
syn=15;
token[0]=ch;
break;
case '/':
syn=16;
token[0]=ch;
break;
case '#':
syn=0;
token[0]=ch;
return;
case '=':
syn=25;
token[0]=ch;
break;
case ';':
syn=26;
token[0]=ch;
break;
case '(':
syn=27;
token[0]=ch;
break;
case ')':
syn=28;
token[0]=ch;
break;
case 32:
break;
default:
syn=-1;
break;
}
}
void factor()
{
if(syn==10 || syn==11)
scaner();
else if(syn==27){
scaner();
expression();
if(syn==28)
scaner();
else {cout<<"括号不配对";kk=1;}
}
else {cout<<"表达式错误";kk=1;}
return;
}
void term()
{
factor();
while(syn==15 || syn==16)
{
scaner();
factor();
}
return;
}
void expression()
{
term();
while(syn==13 || syn==14)
{
scaner();
term();
}
return;
}
void statement()
{
if(syn==10)
{
scaner();
if(syn==18)
{
scaner();
expression();
}
else {cout<<"赋值号错误";kk=1;}
}
else {kk=1;}
return;
}
int main()
{
int i;
char cc;
memset(progstring,0,1024);
printf("please input:\n");
i=0;
while(1) {
cc=getchar();
progstring[i++]=cc;
if(cc=='#')
break;
}
p=0;
scaner();
parser();
cout<<endl;
getchar();
return 1;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?