LR(0)文法的分析

该博客介绍了一个LR(0)文法分析器的实现,包括数据结构、算法逻辑和具体代码实现。通过读取终结符、非终结符和推导式,使用宽度优先搜索构建分析表,并进行分析字符串的解析。代码中包含了输入处理、队列操作、状态节点管理等功能。
摘要由CSDN通过智能技术生成
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <stack>
using namespace std;
typedef long long LL;
const int INF=0x7fffffff;
const int MAX_N=10000;


int num_of_a,num_of_A,num_of_S,totalnum;
//小写字母个数、大写字母个数、推导式个数、最终结点总数
char a[50];//字母
char S[50][50];//推导式
bool pushed[100];//访问一个结点的时候,再往外拓展时记录非终结符是否已经被push过
int ans[100][100];
char analyse[50];//分析串
int stack1[50];
char stack2[50];
char stack3[50];
int L1,L2,L3;//三个栈的长度
map<char,int>M;
map<char,int>::iterator m;


struct node{//结点
    int id;//编号
    int num;//包含的推导式个数
    char s[20][50];
};
queue<node>q;//结点型队列
node N[100];
int numN=0;


void outputnd(node k){//输出一个结点的s
    for(int i=0;i<k.num;i++){
        cout<<k.s[i]<<endl;
    }
}


void outputlb(){//输出一个数组的s
    cout<<"链表"<<endl;
    for(int i=0;i<numN;i++){
        outputnd(N[i]);
        cout<<endl;
    }
}


bool samenode(node x,node y){//比较两个node是否一样
     if(x.num!=y.num)return 0;//如果两个node包含的s数量不同直接输出不同
     for(int i=0;i<x.num;i++){//暴力比较
        int flag=0;
        for(int j=0;j<y.num;j++){
            if(strcmp(x.s[i],y.s[j])==0){
                flag=1;
                break;
            }
        }
        if(flag==0)return 0;
     }
     return 1;
}


void init(){//初始化
    totalnum=0;//结点数量
    while(!q.empty())q.pop();//情况队列
    memset(S,0,sizeof(S));
    for(int i=0;i<100;i++){
        for(int j=0;j<100;j++){
            ans[i][j]=-10000;
        }
    }
    M.clear();//清空映射
}


void input(){//顾名思义,输入数据
    printf("请输入终结符的个数:");
    scanf("%d",&num_of_a);
    printf("请输入%d个终结符(小写字母):",num_of_a);
    for(int i=0;i<num_of_a;i++){
        scanf(" %c",&a[i]);
        M.insert(make_pair(a[i],i));//建立映射
    }
    a[num_of_a]='#';
    M.insert(make_pair(a[num_of_a],num_of_a));
    printf("请输入非终结符
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值