Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的抄那个)。
Firstvt:
找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:
- A->a…,即以终结符开头,该终结符入Firstvt;
- A->B…,即以非终结符开头,该非终结符的Firstvt入A的Firstvt;
- A->Ba…,即先以非终结符开头,紧跟终结符,则终结符入Firstvt。
Lastvt:
找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:
- A->…a,即以终结符结尾,该终结符入Lastvt;
- A->…B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt;
- A->…aB,即先以非终结符结尾,前面是终结符,则终结符入Firstvt。
一、代码实现
#include "stdio.h"
#include "stdlib.h"
//全局变量定义
int num; //文法规则数
char st[10][30]; //文法规则
char string[20][10]; //转换后的文法规则
char data[20][20]; //比较优先符号
char lable[20]; //终结符数组
char first[10][10]; //FIRSTVT集数组
char last[10][10]; //LASTVT集数组
int fflag[10]= {
0}; //FIRSTVT标记
int lflag[10]= {
0}; //LASTVT标记
//函数定义
int finalsym(char c); //终结符判断
int subscript(char c); //下标判断
void firstvt(char c); //FIRSTVT集
void lastvt(char c); //LASTVT集
void table(); //算符优先表
void main()
{
int i,j,k=0;
printf("请输入文法规则数:");
scanf("%d",&num);
printf("请输入文法规则:\n");
for(i=0; i<num; i++)
{
scanf("%s",st[i]);
first[i][0]=0;
last[i][0]=0;
}
for(i=0; i<num; i++)
{
for(j=0; st[i][j]!='\0'; j++)
{
if(st[i][0]<'A'||st[i][0]>'Z')
{
printf("不是算符文法!\n");
exit(-1);
}
if(st[i][j]>='A'&&st[i][j]<='Z')
{
if(st[i][j+1]>='A'&&st[i][j+1]<='Z')
{
printf("不是算符文法!\n");
exit(-1);
}
}
}
}
for(i=0; i<num; i++)
{
for(j=0; st[i][j]!='\0'; j++)
{
if((st[i][j]<'A'||st[i][j]>'Z')&&st[i][j]!='-'&&st[i][j]!='>'&&st[i][j]!='|')
lable[k++]=st[i][j];
}