设计算法求解FIRSTVT和LASTVT(c语言)

Firstvt和Lastvt是为了画算符优先关系表的(就是表里面填优先大于小于等于的抄那个)。

Firstvt:

找Firstvt的三条规则:如果要找A的Firstvt,A的候选式中出现:

  1. A->a…,即以终结符开头,该终结符入Firstvt;
  2. A->B…,即以非终结符开头,该非终结符的Firstvt入A的Firstvt;
  3. A->Ba…,即先以非终结符开头,紧跟终结符,则终结符入Firstvt。
Lastvt:

找Lastvt的三条规则:如果要找A的Lastvt,A的候选式中出现:

  1. A->…a,即以终结符结尾,该终结符入Lastvt;
  2. A->…B,即以非终结符结尾,该非终结符的Lastvt入A的Lastvt;
  3. 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];
        }
    
  • 14
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值