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