?? 詞法分析程序.txt
字號:
這是編譯課程設計時做的一個小小的語法分析程序,程序有些冗余.實現的功能還不全,只能通過輸入文法的分析表才能給出分析過程.對于求任意文法的first集和follow集還沒實現.
/*
* 文件名稱: 語法分析.h
* 摘 要: 對任意輸入LL(1)文法的分析表及字符串,本程序能自動判斷所給字符串是
* 否為該文法的句子,并能給出分析過程。
*/
#include
#include
#include
#include"ctype.h"
class string;
class stack
{
char stck[100];
int top;
public:
void init()
{top=0;}
void push(char ch);
char pop();
void showstck(); //顯示棧中元素
};
class string{
int length;
char *ptr;
public:
string();
~string()
{ }
string(char *s);
int getlength();
int getlength(char *s);
char &operator[](int);
string &operator=(const string &ob);
bool operator== (const string& pw);
friend ostream& operator<<(ostream&,const string&);
friend istream& operator>>(istream&,string&);
};
void stack::push(char ch) //入棧
{
stck[top]=ch;
top++;
}
char stack::pop()
{
if(top==0)
{
cout<<"stack is empty!";
return 0;
}
top--;
return stck[top];
}
void stack::showstck()
{
int i;
for(i=0;i cout<}
string::string()
{ length=1;
ptr=new char[1];
*ptr='\0';
}
string::string(char *s)
{ ptr=new char[getlength(s)+1];
strcpy(ptr,s);
length=getlength(s)+1;
}
int string::getlength()
{
int len;
len=getlength(ptr);
return len;
}
int string::getlength(char *s)
{ int i=0;
while(s[i]!='\0')
{i++;
}
return i;
}
char &string::operator[](int j)
{
return ptr[j];
}
string &string::operator =(const string &ob) //重載‘=’運算符
{if(this==&ob)
return *this;
delete ptr;
ptr=new char[getlength(ob.ptr)+1];
length=getlength(ob.ptr)+1;
strcpy(ptr,ob.ptr);
return *this;
}
bool string::operator== (const string &pw)
{
if(*ptr==*pw.ptr)
return true;
else
return false;
}
ostream& operator<<(ostream&s,const string&ob)
{
s< return s;
}
istream& operator>>(istream&in,string&ob)
{
in>>ob.ptr ;
return in;
}
bool find(char c,char array[] ) //查找函數,返回布爾值
{
int i;
bool flag=false;
for(i=0;i<100;i++)
{
if(c==array[i])
flag=true;
}
return flag;
}
int location(char c,char array[]) //定位函數,指出字符所在位置
{
int i;
for(i=0;i<100;i++)
{
if(c==array[i])
return i;
}
}
void error()
{
cout<<" 出錯!"<}
void analyse(char Vn[],char Vt[],string M[100][100])
{
int i,j,m,p,q,length,t,h;
char w,X;
string str;
opt0:
cin>>str;
for(i=0;i {
if(!find(str[i],Vt))
{ cout<<"輸入字符串有誤!請重新輸入!"< goto opt0;
break;}
}
stack st;
st.init(); //初始化
st.push('#');
st.push(Vn[0]); //#與識別符號入棧
j=0;
h=1;
w=str[0];
cout<<"步驟 "<<"分析棧 "<<"剩余輸入串 "<<" 所用產生式"<opt1:
cout< j++;
w=str[j];
goto opt1;
}
else
error();
}
else
{
if(X=='#')
{
if(X==w)
{
cout<<" "<<"接受!"< }
else
error();
}
else
{
p=location(X,Vn);
q=location(w,Vt);
string S("NULL");
if(M[p][q]==S) //查找二維數組中的產生式
error();
else
{
string str0=M[p][q];
cout<<" "<"< if(str0=="$")
goto opt1;
else
{length=str0.getlength(); //逆序進棧
for(m=length-1;m>=0;m--)
{
st.push(str0[m]);
}
goto opt1;
}
}
}
}
}
main()
{
int i,k,n,r;
char Vn[100],Vt[100],select;
string M[100][100];
cout<<"* 文件名稱: 語法分析"< cout<<"* 摘 要: 對任意輸入LL(1)文法的分析表及字符串,本程序能自動判斷所給字符串是"< cout<<"* 否為該文法的句子,并能給出分析過程。"< cout<<"*--------------------------------------------------------------------*"< cout< opt2:
cout<<"請輸入非終結符個數:";
cin>>n;
cout<<"請輸入終結符(#號表示結束)Vt:";
for(i=0;i<100;i++)
{
cin>>Vt[i];
if(Vt[i]=='#')
{
r=i;
break;
}
}
for (i=0;i {
cout<<"請輸入非終結符Vn["< cin>>Vn[i];
cout<<"請輸入此非終結符對應各終結符的產生式右部,$表示空串:";
for(k=0;k<=r;k++)
{
cin>>M[i][k];
}
}
opt3:
cout<<"請輸入要分析的字符串,且以#結束:";
analyse(Vn, Vt, M);
cout<<" ************************請選擇***********************"< cout<<" 1: 輸入字符串" < cout<<" 2: 輸入新分析表" < cout<<" 0: 退 出" <opt4:
cin>>select;
switch(select)
{
case '1': {goto opt3;break;}
case '2': {goto opt2;}
case '0': {break;}
default: {cout<<"輸入錯誤!請重新選擇:"< goto opt4;
break;}
}
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -