LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明

C/C++ > LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明

LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第1张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第2张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第3张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第4张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第5张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第6张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第7张图片
这里附上
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第8张图片
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第9张图片

LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第10张图片
因为我们老师教的和上面这张图的不太一样。这里我写一下我的。

LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第11张图片

整个代码600行如下(如果不想去下载的话)



// ConsoleApplication14.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
set N_;
set T_;
set ALL_;

stack s;
struct pragram
{
	string left;
	string right;
}pragram[200];
struct all
{
    string left;
    vector right;
}all[20];
int n,count1=1;
int showVet(vector a)
{
    for(int i=0;i> n;
	for (int i = 0; i < n; i++)
	{
		string left;
		cin >> left;
		char c;
		int t=-1;
		while (1)
		{
			scanf("%c",&c);
            if(t==-1) {t++;continue;}
			if (c == '#') break;
			if(c=='|')
            {
                count1++;
                t=0;
                pragram[count1].left = left;
                continue;
            }
			pragram[count1].left = left;
			pragram[count1].right = pragram[count1].right+c;
			t++;
		}
		count1++;
	}
	cout<";
		cout<::iterator it;
    for(it=N_.begin();it!=N_.end();it++)
    {
        cout<<*it<::iterator it,it_N,it1;
    for(it=ALL_.begin();it!=ALL_.end();)
    {

        int check=0;
        string a=*it;
        int t=a.find(" ");          //空格拆分
        if(t!=-1)
        {
            b=a.substr(0,t);
            c=a.substr(t+1,a.length());
            check=1;
        }

        if(check==1)
        {
            ALL_.erase(it);
            ALL_.insert(b);
            ALL_.insert(c);
            it=ALL_.begin();

        }
        else
        {
            ++it;
        }

    }
}
int T()     //挑选终极符号
{
    set::iterator it,it_N,it1;
    for(it=T_.begin();it!=T_.end();)
    {
        int check=0;
        string a=*it;                                //拿到字符
        for(it_N=N_.begin();it_N!=N_.end();it_N++)
        {
            string b=*it_N;
            if(a==b)
            {   check=1;
                break;
            }
        }
        if(check==1)
        {
            T_.erase(it++);
        }
        else{
            it++;
        }
    }
    cout<<"终极符号"<::iterator it,it_N,it1;
    for(it=ALL_.begin();it!=ALL_.end();it++)
     {
         string a=*it;
         T_.insert(a);
     }
}
vector split(string &str)
{
    char ch=' ';
	//存储分割以后的结果
	vector res;
	//加入一个分割字符,方便操作
	str += ch;
	//分割的起始位置
	int start = 0;
	//分割的终止位置
	int last = str.find(ch);
	//找到最后一个分隔符,终止条件
	while (last < str.size())
	{
		//如果字符串不为空,则添加到结果中
		if (start != last)
			res.push_back(str.substr(start, last - start));
		//起始位置更新
		start = last + 1;
		//终止位置更新
		last = str.find(ch, start);
	}
	//ShowVec(res);
	return res;
}
int change_to_vector()   //将右设置为vector 利于控制
{
    for(int i=0;i::iterator it_N;
    for(it_N=N_.begin();it_N!=N_.end();it_N++)
    {
        if(*it_N==a)
        {
            return 1;
        }
    }
    return 4000;
}
bool in_right_N(vector temp,string temp_string)  //判断是否字符串在里面 //如果在 返回1 //不在 返回0
{
    vector ::iterator it;
    for(it=temp.begin();it!=temp.end();it++)
    {
        if(*it==temp_string)
        {
            return 1;       //如果在 返回1
        }
    }
    return 0;               //不在 返回0
}
//首先是生成I0
struct temp_DFA
{
    int now_point=0;
    string left;
    vector right;
}a[20],temp_DFA,test;
struct DFA
{
    struct temp_DFA a[20];
    int a_size=0;
    struct b        //接下来的节点
    {
        string change_word;
        int num=-1;    //接下来的孩子节点编号
    }b[20];
    int b_size=0;

}DFA[20];
int creat_LR0_auto_I0()
{
    string now_left=all[0].left;        //拿到第一条产生式
    vector right_N;             //有0个终极符号
    right_N.push_back(now_left);        //压入一个
    vector::iterator it;
    for(it=right_N.begin();it!=right_N.end();)
    {
        string left=*it;
        for(int i=0;i";
        showVet(DFA[0].a[i].right);
    }
}


int create_node(int pos,int new_node_num, struct temp_DFA temp[],int temp_a,int son_num)
{

    cout<<"new_node_num"<";
            showVet(DFA[new_node_num].a[0].right);

                for(int j=0;j";
        showVet(DFA[new_node_num].a[t].right);

        DFA[new_node_num].a_size++;
        t++;
       if(  is_N(temp[i].right[temp[i].now_point] )  ) //是非终极符号的话
        {

            string N_temp=temp[i].right[temp[i].now_point];

            for(int j=0;j";
                    showVet(DFA[new_node_num].a[t].right);
                    DFA[new_node_num].a_size++;
                    t++;
                }
            }
        }
   }

   for(int j=0;j";
            showVet(temp[a].right);
            a++;
        }
    }
    create_node(pos,new_node_num,temp,a,son_num);
}

int create_next(int pos)    //生成子节点
{
    cout<<"当前处理节点"< change_string;
    for(int i=0;i ::iterator it;
    int tt=0;
    for(it=ALL_.begin();it!=ALL_.end();it++)
    {
        string b=*it;
        if(b==a)
            return tt;
        else
            tt++;
    }
}
int find_exprision(string left,vector temp)
{
    for(int i=0;i ::iterator it;
    ALL_.insert("$");
    cout< a)
{
    stack temp_a; //倒叙输出 才符合人类思维
    while(  a.size() )
    {
        temp_a.push(a.top());
        a.pop();
    }


    while(  temp_a.size()  )
    {
        cout< input_stack;
    vector input_string=split(input_string_a);
    for(int i=input_string.size()-1;i>=0;i--)
    {
        cout<=200&&temp_<300)   //规约
        {
            cout<<"进入规约"<";
            showVet(DFA[i].a[j].right);
        }
        cout<

创建一个input.txt文件 像下面那样写入就好了
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第12张图片
4
S a A c B e#
A b#
A A b#
B d#

输入判别的字符串在这里改 576行
LR(0)完整的语法分析方法(拓广文法、识别活前缀状态机、LR0表、识别字符串)内有word详细说明_第13张图片
源代码+详解zip

有疑惑可以联系 我们一起学习。(要复习了呀哈哈哈)
还有LL1分析表的
在这里插入图片描述

你可能感兴趣的:(编译原理,LR0,活前缀自动机,计算机技术,课内学习)