LR(1)文法

该博客探讨了LR(1)文法的概念,包括如何利用广度优先搜索来构建LR(1)项目的集合,并按照字典序排列。文章以一个具体的文法示例为基础,介绍了输入输出格式,并提供了问题描述和解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LR(1)文法
Time Limit: 1000 ms Memory Limit: 65536 KiB

Problem Description
已知文法G[S]的表达式求文法的LR(1)的项目集和Go函数.要求使用广度优先搜索,同时按照字典序进行转换,以保证项目集的序号正确.

Input
单组输入,当输入一个@时输入结束.

注意: 在输入中以@代表空.

规定:文法S的拓广文法为$->S

Output
输出文法的项目集和Go函数,参考示例中的格式

Sample Input

S->rD
D->Dai
D->i
@

Sample Output

Package: 0
$->.S
S->.rD
Package: 1
$->S.
Package: 2
S->r.D
D->.Dai
D->.i
Package: 3
S->rD.
D->D.ai
Package: 4
D->i.
Package: 5
D->Da.i
Package: 6
D->Dai.
0 1 S
0 2 r
2 3 D
2 4 i
3 5 a
5 6 i
#include <cstdio>
#include <iostream>
#include <cstring>
#include <map>
#include <vector>
using namespace std;
struct node{
   
   
    char vn,s[10];
}g[100];
struct Node{
   
   
    node g;
    int k,kk[20];
};
struct Edge{
   
   
    int u,v,next;
    char w;
}edge[1000];
int g_num;
map<char, int> map1;
map<char, int> map2;
int map1len,map2len;
char vn[20],vt[20];
int first[20][20];
vector<Node> vec[100];
int vec_num;
int edge_num;
void addedge(int u,int v,char w){
   
   
    edge[edge_num].u=u;
    edge[edge_num].v=v;
    edge[edge_num++].w=w;
}
void dfs(char ch,int a[],int vis[],int val[]){
   
   
    int i,j,k,c=map1[ch];
    if(a[c]){
   
   
        for(i=1;i<=map2len;i++)
            val[i]=first[c][i];
        return;
    }
    int value[20];
    memset(value,0,sizeof(value));
    for(i=0;i<=g_num;i++){
   
   
        if(vis[i])
            continue;
        vis[i]=1;
        if(g[i].vn!=ch)
            continue;
        int len=strlen(g[i].s);
        for(j=0;j<len;j++){
   
   
            char sh=g[i].s[j];
            if(map1[sh]){
   
   
                dfs(sh,a,vis,value);
                for(k=2;k<=map2len;k++){
   
   
                    if(value[k])
                        val[k]=1;
                }
                if(value[1]==0)
                    break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值