?? cpp1.cpp
字號(hào):
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
int code[100];
int sym,flag=1,m=0;//flag判斷錯(cuò)誤,1為真,0為假。sym當(dāng)前字符
bool isNum(char );
bool isWrd(char );
int isKeywrd(char s[]);
int isDoublewrd(char c);
/*==============語法分析函數(shù)======================*/
int program();
void proghead();
void block();
int consexpl();
void consdefi();
int conssuff();
int varexl();
void vandefi();
int idsuff();
int varssuff();
void typeil();
int procdefi();
void procedh();
int argument();
int procsuff();
int sentence();
void assipro();
int suffix();
void ifsent();
void whilsent();
void read();
void write();
int exprsuff();
void compsent();
int sentsuff();
void conditio();
void express();
int termsuff();
void term();
int factsuff();
void factor();
void addoper();
void muloper();
int respoper();
const char Key1[]={'p','r','o','g','r','a','m'};
const char Key2[]="const";
const char Key3[]="var";
const char Key4[]="integer";
const char Key5[]="long";
const char Key6[]="procedure";
const char Key7[]="if";
const char Key8[]="then";
const char Key9[]="while";
const char Key10[]="do";
const char Key11[]="read";
const char Key12[]="write";
const char Key13[]="begin";
const char Key14[]="end";
const char Key15[]="odd";
bool isNumch(char c)
{
return (c>='0' && c<='9');
}
bool isWrdch(char c)
{
return (c>='a' && c<='z');
}
int isKeywrd(char s[])
{
int i=0;
while(s[i]==Key1[i] && (s[i]!=0 && Key1[i]!=0)) i++;
if(s[i]==Key1[i]) return 1;
else
{
i=0;
while(s[i]==Key2[i] && (s[i]!=0 && Key2[i]!=0)) i++;
if(s[i]==Key2[i]) return 2;
else
{
i=0;
while(s[i]==Key3[i] && (s[i]!=0 && Key3[i]!=0)) i++;
if(s[i]==Key3[i]) return 3;
else
{
i=0;
while(s[i]==Key4[i] && (s[i]!=0 && Key4[i]!=0)) i++;
if(s[i]==Key4[i]) return 4;
else
{
i=0;
while(s[i]==Key5[i] && (s[i]!=0 && Key5[i]!=0)) i++;
if(s[i]==Key5[i]) return 5;
else
{
i=0;
while(s[i]==Key6[i] && (s[i]!=0 && Key6[i]!=0)) i++;
if(s[i]==Key6[i]) return 6;
else
{
i=0;
while(s[i]==Key7[i] && (s[i]!=0 && Key7[i]!=0)) i++;
if(s[i]==Key7[i]) return 7;
else
{
i=0;
while(s[i]==Key8[i] && (s[i]!=0 && Key8[i]!=0)) i++;
if(s[i]==Key8[i]) return 8;
else
{
i=0;
while(s[i]==Key9[i] && (s[i]!=0 && Key9[i]!=0)) i++;
if(s[i]==Key9[i]) return 9;
else
{
i=0;
while(s[i]==Key10[i] && (s[i]!=0 && Key10[i]!=0)) i++;
if(s[i]==Key10[i]) return 10;
else
{
while(s[i]==Key11[i] && (s[i]!=0 && Key11[i]!=0)) i++;
if(s[i]==Key11[i]) return 11;
else
{
while(s[i]==Key12[i] && (s[i]!=0 && Key12[i]!=0)) i++;
if(s[i]==Key12[i]) return 11;
else
{
while(s[i]==Key13[i] && (s[i]!=0 && Key13[i]!=0)) i++;
if(s[i]==Key13[i]) return 13;
else
{
while(s[i]==Key14[i] && (s[i]!=0 && Key14[i]!=0)) i++;
if(s[i]==Key14[i]) return 14;
else
{
while(s[i]==Key15[i] && (s[i]!=0 && Key15[i]!=0)) i++;
if(s[i]==Key15[i]) return 15;
else return 0;
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
int isDoublewrd(char c)
{
int x;
switch(c)
{
case '+': x=16;break;
case '-': x=17;break;
case '*': x=18;break;
case '/': x=19;break;
case '=': x=20;break;
case '<': x=22;break;
case '>': x=24;break;
case ',': x=26;break;
case '.': x=27;break;
case ';': x=28;break;
case ':': x=29;break;
case '(': x=31;break;
case ')': x=32;break;
case '#': x=35;break;
default: x=0;
}
return x;
}
int cifa()
{
ifstream fin("program.txt");
char ch;
char str[25]={0};
int n,i,val,k=0;
while(!fin.eof())
{
ch=fin.get();
if(ch==' ' || ch=='\n') continue;
else if(isWrdch(ch))
{
n=0;
while(isWrdch(ch) || isNumch(ch))
{
if(n<20)
{
str[n]=ch;
n=n+1;
ch=fin.get();
}
else ch=fin.get();
}
if(i=isKeywrd(str))
{
cout<<i<<endl;
code[k]=i;
k++;
}
else
{
cout<<"34"<<' '<<str<<endl;
code[k]=34;
k++;
}
if(i=isDoublewrd(ch))
{
cout<<i<<endl;
code[k]=i;
k++;
}
i=0;
while(str[i]!=0) {str[i]=0;i++;}
}
else if(isNumch(ch))
{
val=0;
while(isNumch(ch))
{
val=val*10+ch-'0';
ch=fin.get();
}
cout<<"33"<<' '<<val<<endl;
code[k]=33;
k++;
if(i=isDoublewrd(ch))
{
cout<<i<<endl;
code[k]=i;
k++;
}
i=0;
}
else if(isDoublewrd(ch))
{
cout<<isDoublewrd(ch)<<endl;
code[k]=isDoublewrd(ch);
k++;
}
}
return k;
}
void getword() //************讀取字符
{
sym=code[m];
m++;
}
void error() //******************判斷錯(cuò)誤位置
{
flag=0;
int t=m-1;
cout<<"位置:"<<t+1<<"代碼:"<<code[t]<<" "<<"出錯(cuò)"<<endl;
exit(0);
}
/*=========================================================*/
int program()
{
getword();
proghead();
block();
if(sym==27) return 0;
else error();
}
void proghead()
{
if(sym==1)
{
getword();
if(sym==34)
{
getword();
if(sym==28) getword();
else error();
}
else error();
}
else error();
}
void block()
{
consexpl();
varexl();
procdefi();
compsent();
}
int consexpl()
{
if(sym==2)
{
getword();
consdefi();
conssuff();
}
else return 0;
}
void consdefi()
{
if(sym==34)
{
getword();
if(sym==20)
{
getword();
if(sym==33) getword();
else error();
}
else error();
}
else error();
}
int conssuff()
{
if(sym==26)
{
getword();
consdefi();
conssuff();
}
else return 0;
}
int varexl()
{
if(sym==3)
{
getword();
vandefi();
varssuff();
}
else return 0;
}
void vandefi()
{
if(sym==34)
{
getword();
idsuff();
if(sym==29)
{
getword();
typeil();
if(sym==28) getword();
else error();
}
else error();
}
else error();
}
int idsuff()
{
if(sym==26)
{
getword();
if(sym==34) getword();
else flag=0;
idsuff();
}
else return 0;
}
int varssuff()
{
if(sym==34)
{
vandefi();
varssuff();
}
else return 0;
}
void typeil()
{
if(sym==4||sym==5) getword();
else error();
}
int procdefi()
{
if(sym==6)
{
procedh();
block();
if(sym==28)
{
getword();
procsuff();
}
else error();
}
else return 0;
}
void procedh()
{
if(sym==6)
{
getword();
if(sym==34)
{
getword();
argument();
if(sym==28) getword();
else error();
}
else error();
}
else error();
}
int argument()
{
if(sym==31)
{
getword();
if(sym==34)
{
getword();
if(sym==29)
{
getword();
typeil();
if(sym==32) getword();
else error();
}
else error();
}
else error();
}
else return 0;
}
int procsuff()
{
if(sym==6)
{
procedh();
block();
if(sym==28)
{
getword();
procsuff();
}
else error();
}
else return 0;
}
int sentence()
{
if(sym==34) assipro();
else if(sym==7) ifsent();
else if(sym==9) whilsent();
else if(sym==11) read();
else if(sym==12) write();
else if(sym==13) compsent();
else return 0;
}
void assipro()
{
if(sym==34)
{
getword();
suffix();
}
else error();
}
int suffix()
{
if(sym==29)
{
getword();
if(sym==20)
{
getword();
express();
}
else error();
}
else if(sym==31)
{
getword();
express();
if(sym==32) getword();
else error();
}
else return 0;
}
void ifsent()
{
if(sym==7)
{
getword();
conditio();
if(sym==8)
{
getword();
sentence();
}
else error();
}
else error();
}
void whilsent()
{
if(sym==9)
{
getword();
conditio();
if(sym==10)
{
getword();
sentence();
}
else error();
}
else error();
}
void read()
{
if(sym==11)
{
getword();
if(sym==31)
{
getword();
if(sym==34)
{
getword();
idsuff();
if(sym==32) getword();
else error();
}
else error();
}
else error();
}
else error();
}
void write()
{
if(sym==12)
{
getword();
if(sym==31)
{
getword();
express();
exprsuff();
if(sym==32) getword();
else error();
}
else error();
}
else error();
}
int exprsuff()
{
if(sym==26)
{
getword();
express();
exprsuff();
}
else return 0;
}
void compsent()
{
if(sym==13)
{
getword();
sentence();
sentsuff();
if(sym==14) getword();
else error();
}
else error();
}
int sentsuff()
{
if(sym==28)
{
getword();
sentence();
sentsuff();
}
else return 0;
}
void conditio()
{
if(sym==16||sym==17||sym==34||sym==33||sym==31)
{
express();
respoper();
express();
}
else if(sym==15)
{
getword();
express();
}
else error();
}
void express()
{
if(sym==16||sym==17)
{
getword();
term();
termsuff();
}
else if(sym==34||sym==33||sym==31)
{
term();
termsuff();
}
else error();
}
int termsuff()
{
if(sym==16||sym==17)
{
addoper();
term();
termsuff();
}
else return 0;
}
void term()
{
if(sym==34||sym==33||sym==31)
{
factor();
factsuff();
}
else error();
}
int factsuff()
{
if(sym==18||sym==19)
{
muloper();
factor();
factsuff();
}
else return 0;
}
void factor()
{
if(sym==34) getword();
else if(sym==33) getword();
else if(sym==31)
{
getword();
express();
if(sym==32) getword();
else error();
}
else error();
}
void addoper()
{
if(sym==16||sym==17) getword();
else error();
}
void muloper()
{
if(sym==18||sym==19) getword();
else error();
}
int respoper()
{
if(sym==20) getword();
else if(sym==22)
{
getword();
if(sym==20) getword();
else return 0;
}
else if(sym==24)
{
getword();
if(sym==20) getword();
else return 0;
}
else error();
}
/*====================================*/
void main()
{
int len=cifa();
cout<<"字符代碼為:"<<endl;
for(int i=0;i<len;i++)
{
cout<<code[i]<<" ";
if((i+1)%10==0) cout<<endl;
}
cout<<endl;
program();
if(flag==1) cout<<"語法分析正確"<<endl;
else cout<<"程序錯(cuò)誤"<<endl;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -