算符优先分析

算符优先分析.h

#include <iostream>
#include 
<list> 
using namespace std;

//创建一个list容器的实例LISTCHAR 
typedef list<char> LISTCHAR; 

//优先关系比较数组,其中'<','>'和'='表示优先关系,1,2....6表示6种类型的错误,而7则是规约完成的标志
char Table[7][7]={
        
{'>','<','<','<','<','>','>'},
        
{'>','>','<','<','<','>','>'},  
    
{'>','>','<','<','<','>','>'},  
    
{'>','>','>','1','2','>','>'},
        
{'<','<','<','<','<','=','3'},
        
{'>','>','>','4','5','>','>'},
        
{'<','<','<','<','<','6','7'},
}
;

//该函数将比较的终结符转换为优先关系比较数组的下标值
int Change(char ch)
{
    
int t;
    
switch(ch)
    
{
    
case '+':t=0;break;
    
case '*':t=1;break;
    
case '^':t=2;break;
    
case 'i':t=3;break;
    
case '(':t=4;break;
    
case ')':t=5;break;
    
case '#':t=6;break;
    }

    
return t;
}


//该函数对优先关系比较数组Table[7][7]中的6种错误进行处理
int Error(char a,char b)
{        
    
int error=0;
    
char x;
    x
=Table[Change(a)][Change(b)];
    
switch(x)
    
{    
    
case '1':                   
        
{    
            cout
<<"'i'与'i'之间应有运算符"<<endl;
            error
++;
            
break;
        }

    
case '2':                   
        
{
            cout
<<"'i'与'('之间应有运算符"<<endl;
            error
++;
            
break;
        }

    
case '3':                   
        
{    
            cout
<<"'('后应包括内容"<<endl;
            error
++;
            
break;
        }

    
case '4':                   
        
{    
            cout
<<"')'后应是运算符"<<endl;
            error
++;
            
break;
        }

    
case '5':                   
        
{    
            cout
<<"')'与'('间要有运算符"<<endl;
            error
++;
            
break;
        }

    
case '6':                   
        
{     
            cout
<<"error six";
            error
++;
            
break;
        }

    }

    
return error;
}


//该函数获得符号栈list1的栈定终结符
char GetListFinal(list<char> list1)         
{    
    
char ch1;
    list
<char>::iterator l1;
    
for(l1=list1.begin();l1!=list1.end();++l1)
    
{    
        
if(*l1<'A'|| *l1>'Z')
        
{    
            ch1
=*l1;
            
break;    
        }

    }

    
return ch1;
}


//该函数为规约和移进的中间过程的打印
void Print(int i,list<char> list1,list<char> list2)
{    
    list
<char>::iterator l1;
    list1.reverse();
    cout
<<i<<' ';
    
for(l1=list1.begin();l1!=list1.end();++l1)
        cout
<<*l1;
    cout
<<" ";
    
for(l1=list2.begin();l1!=list2.end();++l1)
        cout
<<*l1;
    cout
<<" ";
}


算符优先分析.cpp

#include "算符优先分析.h"

void main()
{    
    cout
<<"**************************算符优先分析的文法************************"<<endl;
    cout
<<"**            E->E+T|T                  **"<<endl;
    cout
<<"***            T->T*F|F                 ***"<<endl;
    cout
<<"****            F->P^F|P                ****"<<endl;
    cout
<<"***            P->(E)|i                 ***"<<endl;
    cout
<<"**                ----2008年5月12日          **"<<endl;
    cout
<<"********************************************************************"<<endl;
    
    
int i=0,j,k,error=0;
    
char ch,ch1,ch2;
    
    LISTCHAR  list1;                
//list1存放符号栈的内容
    LISTCHAR  list2;                //list2存放输入串的内容
    LISTCHAR::iterator l;           //定义list容器的迭代子
    list1.push_back('#');           //给符号栈中预置'#'
    cout<<"输入要分析的字符串,以#结束:"<<endl;
        cout
<<"        ==>:";
    
    
do{                //将输入串存入list1中    
        ch=cin.get();
        list2.push_back(ch); 
        
    }
while(ch!='#');
    cout
<<endl;
    
    cout
<<"步骤"<<' '<<"符号栈"<<" "<<"输入串"<<" "<<"动作"<<endl;
    Print(i,list1,list2);
    cout
<<"初始化"<<endl;
    
    
do{        
        ch1
=GetListFinal(list1);                    //取得list1的首个终结符        
        ch2=list2.front();                              //取得list2的首个字符
        
        error
=Error(ch1,ch2);                           //检查输入串有无错误
        if(error==0)                                    //error=0表示输入串无错误
        {    
            j
=Change(ch1);                          //将要比较的两个终结符转换为优先关系比较数组Table的下标
            k=Change(ch2);
            
            
if(Table[j][k]=='<' || Table[j][k]=='=')   //进行移进操作处理
            {    
                list1.push_front(ch2);
                list2.pop_front();
                i
++;
                Print(i,list1,list2);
                cout
<<"移进"<<endl;    
                
            }

            
            
else if(Table[j][k]=='>')            //进行规约操作处理
            {    
                
switch(ch1)
                
{
                
case 'i':                //规约的终结符为'i'
                    {    
                        list1.pop_front();
                        list1.push_front(
'E');
                        i
++;
                        Print(i,list1,list2);
                        cout
<<"归约,E->i"<<endl;                        
                        
break;
                    }

                
case '+':                //规约的终结符为'+'
                    {
                        list1.pop_front();
                        list1.pop_front();
                        list1.pop_front();
                        list1.push_front(
'E');
                        i
++;
                        Print(i,list1,list2);
                        cout
<<"归约,E->E+T"<<endl;    
                        
break;
                    }

                                
case '*':                 //规约的终结符为'*'
                    {
                        list1.pop_front();
                        list1.pop_front();
                        list1.pop_front();
                        list1.push_front(
'T');
                        i
++;
                        Print(i,list1,list2);
                        cout
<<"归约,T->T*F"<<endl;
                        
break;
                    }

                
case '^':                //规约的终结符为'^'
                    {
                        list1.pop_front();
                        list1.pop_front();
                        list1.pop_front();
                        list1.push_front(
'F');
                        i
++;
                        Print(i,list1,list2);
                        cout
<<"归约,F->P^F"<<endl;            
                        
break;
                    }

                                
case ')':                //规约的终结符为')'
                    {
                        list1.pop_front();
                        list1.pop_front();
                        list1.pop_front();
                        list1.push_front(
'P');
                        i
++;
                        Print(i,list1,list2);
                        cout
<<"归约,P->(E)"<<endl;    
                        
break;
                    }

                    
                }
    
            }

            
            
if(Table[j][k]=='7')                //'#'配对,规约完成
            {    
                cout
<<"归约完毕!"<<endl;
                
break;
            }

        }

        
else break;
    }
while(1);
    
}

算符优先分析法 C++ 编译原理 运行环境:Visual Studio 2005 #include "SStack.h" #include <iostream> #include <string> using namespace std; class Functor { private : char ** table; string ** production; string prog;//待分析字符串 int p;//字符指针 int num;//终结符个数 int num1;//产生式个数 SStack <char> stack; public: Functor(int m,int n,char ** T,string **prod,string pr) { num=m; num1=n; table=T; production=prod; prog=pr; p=0; stack.push('$'); } void traversal() { while(p<(prog.length())) { stack.display(); cout<<prog.substr(p)<<" "; char ch; if(Getnum(stack.gettop())) { ch=stack.gettop(); } else { ch=stack.getsecond(); } switch(compare(ch,prog[p])) { case 1: case 2:stack.push(prog[p]);p++;cout<<"移入"<<endl;break; case 3:reduct();cout<<"归约"<<endl;break; } } cout<<"分析成功!"<<endl; } int Getnum(char ch) { for(int i=1;i<num;i++) { if(ch==table[i][0]) { return i; } } return 0; } int compare(char col,char row) { int c=Getnum(col); int r=Getnum(row); switch( table[c][r]) { case '>': return 3;break; case '<': return 2;break; case '=': return 1;break; default:cout<<endl<<"输入串有误,程序将终止!"<<endl;system("pause");exit(0);break; } } void reduct() { //待定 string token=""; int temp; string str=""; if(!Getnum(stack.gettop())) { token+=stack.gettop(); stack.pop(); } char ch=stack.gettop(); str+=ch; temp=Haven(str); if(temp!=-1) { token+=production[temp][0]; } else { token+=ch; } stack.pop(); bool Nover=true; while(Nover) { if(Getnum(stack.gettop())) { if(compare(stack.gettop(),ch)==2) { Nover=false; } else { ch=stack.gettop(); str=""; str+=ch; temp=Haven(str); if(temp!=-1) { token+=production[temp][0]; } else { token+=ch; } stack.pop(); } } else { token+=stack.gettop(); stack.pop(); } } string token2=""; //cout<<token<<" "; for(int i=token.length()-1;i>=0;i--) { token2+=token[i]; } //cout<<token2<<endl; if(Haven(token2)!= -1) { stack.push(production[Haven(token2)][0][0]); } else { cout<<"输入串有误!分析终止!"<<endl; system("pause"); exit(0); } } int Haven(string temp) { for(int i=0;i<num1;i++) { int j=1; while(production[i][j]!="") { if(temp==production[i][j]) { return i; } j++; } } return -1; } public: ~Functor(void) { } };
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值