资源简介

语法分析 编译原理作业 自己做的呵呵

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
//定义全局变量
FILE *fp*fp1;//指向有进行语法分析的文件
char sym[20]={0};//类别
char s[20]={0};//在涵数中做临时变量数组
char id[20]={0};//若为标志符,存放自身值
int num;//若为整数,存放自身值
int lineno;//行号
int err;//标记何种错误的数字
int count=0;//记录错误出现的次数
int l=0;//记录调用的层次lev
int iftrue=1;

//空格
void nul(int n)
{
int i=0;
for(i=0;i<=n;i++)
printf(“  “);
}

void fengexian(int n)//修饰DOS界面的分隔线
{
int i;
nul(l-1);
//printf(“||“);
for(i=0;i<=n;i++)
printf(“-“);
//printf(“||“);
printf(“\n“);
}

void show()//界面的初始部分

fengexian(50);
printf(“           编译原理语法分析实验!\n“);
printf(“                       作者姓名\n“);
fengexian(50);
}

FILE *openfile(char *mode)
{
   char tmpfile[20];
   FILE *reval=NULL;
   while(iftrue)
       {
          
          //gets(tmpfile);
      scanf(“%s“tmpfile);
  getchar();
          reval=fopen(tmpfilemode);
          if(reval!=NULL) break;

          printf(“不能打开文件\“%s\“,请重新输入:“tmpfile);
          iftrue=1;
        }
return reval;
}

void get()//取文件中的一个单词
{
     char ch;
     char str[10];
     int i=0;
     ch=fgetc(fp);
     while(ch==‘ ‘||ch==‘\n‘)
         {
           ch=fgetc(fp);
         }
          str[i]=ch;
          i++;
          ch=fgetc(fp);
          while(ch!=‘ ‘&&ch!=‘\n‘)
       {
                 str[i]=ch;
                 i++;
                 ch=fgetc(fp);
        }
          str[i]=‘\0‘;
          i=0;
          strcpy(sstr);
}

void getsym()//取文件中的一组单词
{
        get();
        lineno=atoi(s);
        //printf(“%d\n“lineno);
        get();

        if(strcmp(s“ident“)==0)
          {
          strcpy(syms);
          //printf(“%s\n“sym);
          get();
          strcpy(ids);
          //printf(“%s\n“id);
          }
        else if(strcmp(s“number“)==0)
           {
             strcpy(syms);
             //printf(“%s\n“sym);
             get();

             num=atoi(s);
             //printf(“%d\n“num);
            }
        else
            {
            strcpy(syms);
            //printf(“%s\n“sym);
            }
}



//错误处理
void error(int err)
{
count++;
nul(l);printf(“ %d次错误:“count);
switch(err)
{
case 1:printf(“%d行 1!-常量说明中\“=\“写成\“:=\“.\n“lineno);break;
case 2:printf(“%d行 2!-常量说明中的\“=\“后应是数字.\n“lineno);break;
case 3:printf(“%d行 3!-常量说明中的标识符后应是\“=\“.\n“lineno);break;
case 4:printf(“%d行 4!-constvarprocedure后应为标识符.\n“lineno);break;
case 5:printf(“%d行 5!-漏掉了‘‘或‘;‘.\n“lineno);break;
    case 6:printf(“%d行 6!-过程说明后的符号不正确(应是语句开始符或过程定义符).\n“lineno);break;
    case 7:printf(“%d行 7!-应是语句开始符.\n“lineno);break;
    case 8:printf(“%d行 8!-程序体内语句部分的后跟符不正确.\n“lineno);break;
    case 9:printf(“%d行 9!-程序结尾丢了句号‘.‘.\n“lineno); break;  
case 10:printf(“%d行 10!-语句之间漏了‘;‘.\n“lineno);break;   
case 11:printf(“%d行 11!-标识符未说明.\n“lineno); break;  
case 12:printf(“%d行 12!-赋值语句中赋值号左部标识符属性应是变量.\n“lineno);

评论

共有 条评论