• 大小: 9KB
    文件类型: .cpp
    金币: 2
    下载: 1 次
    发布日期: 2021-08-10
  • 语言: C/C++
  • 标签: 编译原理  

资源简介

假使给定任意文法G(E): E->E+T|T T->T*P|P P->(E)|i 1. 如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况; 2. 如果输入符号串不是正确句子,则指示出错位置。

资源截图

代码片段和文件信息

#include “stdio.h“
#include “stdlib.h“
#include “iostream.h“
char data[20][20];                    //算符优先关系
char s[100];                          //模拟符号栈s 
char lable[20];                       //文法终极符集
char input[100];                      //文法输入符号串
char string[20][10];                  //用于输入串的分析
int k;                                          
char a; 
int j;                                               
char q;                                              
int r;                                //文法规则个数
int r1;                               //转化后文法规则个数
char st[10][30];                      //用来存储文法规则
char first[10][10];                   //文法非终结符FIRSTVT集
char last[10][10];                    //文法非终结符LASTVT集
int fflag[10]={0};                    //标志第i个非终结符的FIRSTVT集是否已求出
int lflag[10]={0};                   //标志第i个非终结符的LASTVT集是否已求出
int deal();                          //对输入串的分析
int zhongjie(char c);                //判断字符c是否是终极符
int xiabiao(char c);                 //求字符c在算符优先关系表中的下标
void out(int jint kchar *s);       //打印s栈
void firstvt(char c);                //求非终结符c的FIRSTVT集
void lastvt(char c);                 //求非终结符c的LASTVT集
void table();                        //创建文法优先关系表
int main()
{
int ijk=0;
    printf(“请输入文法规则数:“);
scanf(“%d“&r);
printf(“请输入文法规则:\n“);
for(i=0;i{
   scanf(“%s“st[i]);    //存储文法规则,初始化FIRSTVT集和LASTVT集*/        
   first[i][0]=0;            /*first[i][0]和last[i][0]分别表示st[i][0]非终极
符的FIRSTVT集和LASTVT集中元素的个数*/
   last[i][0]=0;
}
for(i=0;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{
   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];
   }
}
lable[k]=‘#‘;
lable[k+1]=‘\0‘; 
table();
printf(“每个非终结符的FIRSTVT集为:\n“);    //输出每个非终结符的FIRSTVT集
for(i=0;i{
   printf(“%c: “st[i][0]);
   for(j=0;j   {
    printf(“%c “first[i][j+1]);
   }
   printf(“\n“);
}
printf(“每个非终结符的LASTVT集为:\n“);    //输出每个非终结符的LASTVT集
for(i=0;i{
   printf(“%c: “st[i][0]);
   for(j=0;j   {
    printf(“%c “last[i][j+1]);
   }
   printf(“\n“);
}
printf(“算符优先分析表如下:\n“);
for(i=0;lable[i]!=‘\0‘;i++)                     
   printf(“\t%c“lable[i]);
printf(“\n“);                                   
for(i=0;i{
   printf(“%c\t“lable[i]);
   for(j=0;j   {
    printf(“%c\t“data[i][j]);
   }
   printf(“\n“);
}
printf(“请输入文法输入符号串以#结束:“);
scanf(“%s“input);                                          

deal();
}
void table()
{
char text[20][10];
int ijktlx=0y=0;
int mn;
x=0;
for(i

评论

共有 条评论