资源简介

需要创建一个名字叫project.txt的文件来存储要识别的文法

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

string M[2000][2000];     //任务分析表
stack  cc;          //分析栈
queue  qq;          //输入串
set  ww[200];       //first集
set  T;             //终结符集
set  N;             //非终结符集合
set  vv[200];       //中间过程记录集
set  ff[200];       //fllow集合
set  select[200];   //select集合

int step = 0;             //步骤统计变量
int error_flag=0;         //错误标志位
int nullflag[1000];       //是否推空标志
int nullselect[1000];     //集合是否推空标志
int ll=0;                 //文法行数
int T_flag[1000];         //右侧是否含有终结符
int length_char[1000];    //每行文法的字符个数
char line[100][1024];     //文法记录表

//判断是否是非终结符
bool isN(char v)
{
  if(v>=‘A‘&&v<=‘Z‘)
  {
      return true;
  }
  return false;
}
//判断是否是终结符
bool isT(char v)
{
    if(isN(v)==0&&v!=‘|‘&&v!=‘-‘&&v!=‘>‘)
    {
        return true;
    }
    return false;
}
//输出符号栈里的值
void showCC()
{
    stack  cc2=cc;
    stack  cc3;
    while(!cc2.empty())
    {
        cc3.push(cc2.top());
        cc2.pop();
    }
    while(!cc3.empty())
    {
        cout<        cc3.pop();
    }
    cout<<“\t“;
}
//输出匹配字符串剩余部分
void showPP()
{
    queue  pp2;
    pp2=qq;
    while(!pp2.empty())
    {
        cout<        pp2.pop();
    }
    cout<<“\t“;
}

//判断集合记录是否为空,也即是否处理完所有过程
bool isEmpty()
{
    for(set::iterator ite1 = N.begin();ite1!=N.end();ite1++)
    {
       if(!vv[int(*ite1)].empty())
        return false;
    }
    return true;
}

//求和,用于是否完成空字符判断
int sum()
{
    int suum=0;
    for(set::iterator ite1 = N.begin();ite1!=N.end();ite1++)
    {
        suum+=nullflag[int(*ite1)];
    }
    return suum;
}
//判断是否有推空非终结符
void _null()
{
    int cha=999;
    int yuan=sum();
    while(cha!=0)
    {
        //0代表不能推出空,1代表可以
        for(int i=0;i        {
            if(T_flag[i]==0)
            {
                int t=1;
                for(int j=3;j                {
                    t=t&&nullflag[int(line[i][j])];
                }
                nullflag[int(line[i][0])]=t;
            }
        }
        cha=yuan-sum();
        yuan=sum();
    }
}
//判断select集合时,右侧是否可以推空
void _null2()
{
    for(int i=0;i    {
        for(set::iterator ite2 = select[i].begin();ite2!=select[i].end();ite2++)
        {
            if(*ite2==‘^‘)
            {
                nullselect[i]=1;
                break;
            }
        }
    }
}

void raedFromFile()
{
    fstream infile(“project.txt“ios::in);
    while(infile.getline(line[ll]sizeof(line[ll])))
    {
        for(int i=0;i<100;i++)
        {
            if(int(line[ll][i])==0)
                {
                    length_char[ll]=i;
                    break;
                }
    

评论

共有 条评论