算符优先系列之(一)Firstvt和Lastvt集

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
typedef long long LL;
const int inf=0x3f3f3f3f;
const double pi= acos(-1.0);
const double esp=1e-6;
using namespace std;

const int Maxn=110;
const int maxn=20;
char str[maxn][Maxn];//输入文法
char st[maxn];//输入串
char stac[maxn];//模拟栈的数组
char nstr[maxn][maxn];//储存转化文法
char mstr[maxn][maxn];
char fin[maxn];//存储终结符
char firstvt[maxn][maxn],lastvt[maxn][maxn];
char cmp[maxn][maxn];//存储表中的比较符
int firstflag[maxn],lastflag[maxn];//非终结符的firstvt,lastvt是否求出
int fcnt[maxn],lcnt[maxn];//非终结符firsvt和lastvt的个数
int is_fin(char c) { //判断终结符
    for(int i=0; fin[i]!='\0'; i++) {
        if(fin[i]==c)
            return 1;
    }
    return 0;
}
int site(char c) { //求在表中的下标
    for(int i=0; fin[i]!='\0'; i++) {
        if(fin[i]==c)
            return i;
    }
}
void get_firstvt(char s,int t) { //求s非终结符的firstvt值
    int i,j,ii,jj,tt;
    for(i=0; i'Z')&&(str[i][j]!='-'&&str[i][j]!='>')&&str[i]

[j]!='|')
                fin[cnt++]=str[i][j];
        }
    }
    fin[cnt++]='#';
    fin[cnt]='\0';
    output_firstvt(T);
    output_lastvt(T);
    }
    return 0;
}

Problem Description

学过编译原理的菊苣们都知道算符优先文法,作为一个有点深度的分析方法,我们怎么能只止步于理论呢,实践才是王道哦。

已知文法G[S]的表达式,计算G[S]的Firstvt和Lastvt。因为某些特殊的原因,我们在这规定一下输入输出格式。

例如:

已知文法G[S]为:

S->a|@|(T)

T->T,S|S

首先先把各条件语句按照从左到右从上到下的方式分解和输出

S->a

S->@

S->(T)

T->T,S

T->S

对于输出首先输出FIRSTVT集然后输出LASTVT集,对于各自的集合的的输出按照非终结符从上向下的方式

Firstvt[S]:非终结符+空格的形式

Firstvt[T]:

Lastvt[S]:

Lastvt[T]:

Input

多组输入。第一行输入一个n,表示表达式的个数,接下来n行,每行一个表达式

Output

根据上述的格式,输出文法的Firstvt和Lastvt集合

Example Input

2S->a|@|(T)T->T,S|S

Example Output

Firstvt[S]:a @ ( Firstvt[T]:, a @ ( Lastvt[S]:a @ ) Lastvt[T]:, a @ )
 
 
 

你可能感兴趣的:(c++)