一个基于LL(1)文法的语法分析程序

原创 2004年07月11日 19:59:00

这是编译课程设计时做的一个小小的语法分析程序,程序有些冗余.实现的功能还不全,只能通过输入文法的分析表才能给出分析过程.对于求任意文法的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;
}

C++:基于LL(1)方法的语法分析程序-3

前面两次我们完成了对于固定的文法进行分析和从txt文件中生成预测分析表。下面我们改动第一次文件中本来应该可变的部分。首先,我们修改关于分析表的一些函数,例如寻找产生式、寻找终结符的索引……然后我们进行...
  • hengbao4
  • hengbao4
  • 2015年12月05日 21:16
  • 1112

LL(1)文法判断

LL(1)文法判断 题型: 1.判断该文法是否是LL(1)文法? 2.若是,给出它的LL(1)分析表,否则说明理由。 概念: 对于产生式 A -> α | β 1.如果α、β均...
  • hit_rxz
  • hit_rxz
  • 2014年12月01日 20:23
  • 1865

如何判断文法是否是LL(1)文法

判断该文法是不是LL(1)文法,说明理由 S→ABc A→a|ε B→b|ε?      First集合求法就是:能由非终结符号推出的所有的开头符号或可能的ε,但要求这个开头符号是终结符号。如此题...
  • Hammer_DA
  • Hammer_DA
  • 2014年06月19日 19:19
  • 10107

C++:基于LL(1)方法的语法分析程序-2

我们做如下对于文法文件的规定: 第一行内容为终结符 第二行内容为 非终结符 第三行起,按照非终结符、终结符的声明顺序填入规则右部 我们用我们刚才的例子做一个TXT 下面我们用文件转换类来进行转换,思...
  • hengbao4
  • hengbao4
  • 2015年12月05日 21:06
  • 1361

判断是不是LL1文法

编最近上的编译原理课呢做实验,输入一个文法,然后判断是不是LL1文法,根据清华大学张素琴老师主编的《编译原理》第二版80页的算法,写了短程序: //compile.c #inclu...
  • u012458164
  • u012458164
  • 2014年03月28日 17:48
  • 1218

LL(1)文法

可以构造确定的(不带回溯)自上而下分析的文法条件: (1) 文法不含左递归 (2) 文法中每个非终结符A满足   A→α1 |α2 |…|αn     则:    FIRST(αi)∩FIRS...
  • liyun123gx
  • liyun123gx
  • 2014年02月26日 15:33
  • 1313

编译原理 LL1文法的判断和句子识别

编译原理 LL1文法的判断和句子识别 LL1文法概述 点击查看百度百科 对文法G的句子进行确定的自顶向下语法分析的充分必要条件是,G的任意两个具有相同左部的 产生式A—>α|β ...
  • Justin_bibo
  • Justin_bibo
  • 2017年02月23日 21:14
  • 2747

LL(1)文法分析器简单实现

文法: E->E+T | T T->T*F | F F->(E)|i 消除左递归: E->TH H->+TH|e(空,一普赛肋) ...
  • IT_DREAM_ER
  • IT_DREAM_ER
  • 2016年12月06日 12:11
  • 2049

一个SLR,LR,LALR语法分析器

这些天我编写了一些语法分析器,它能够分析符合SLR,LR,LALR规范的语句。所有的类都放在syntexparse包中。算法来自与龙书。下面是一些用法。Symbol类表示文法中的终结符和非终结符。构造...
  • prettyinsight
  • prettyinsight
  • 2010年03月24日 10:54
  • 11812

语法分析之LL(1)分析法

LL(K)分析方法是一种自顶向下的分析技术,这种分析方法是从左到右扫描源程序(输入串),同时从识别符号开始生成句子的最左推导,向前看K个符号,便能确定当前应选用怎样的规则。当K=1时,即是LL(1)分...
  • hackerain
  • hackerain
  • 2012年06月21日 14:16
  • 4778
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一个基于LL(1)文法的语法分析程序
举报原因:
原因补充:

(最多只允许输入30个字)