编译原理实验源代码

这是一个C语言实现的编译原理实验,包括词法分析和LL(1)、LR(1)分析法,以及逆波兰式转换。代码实现了对特定字符集的分析,如关键字、运算符、括号等,并提供了错误处理。实验还涉及了预测分析表和ACTION、GOTO表格的构建。
摘要由CSDN通过智能技术生成

1、词法分析

/*cifa fenxi chengxu*/

#include <stdio.h>

#include <ctype.h>

#include <alloc.h>

#include <stdlib.h>

#include <string.h>

#define NULL 0

 

FILE *fp;

char cbuffer;

char *key[8]={"if","else","for","while","do","return","break","continue"};

char *border[6]={",",";","{","}","(",")"};

char *arithmetic[4]={"+","-","*","/"};

char *relation[6]={"<","<=","=",">",">=","<>"};

char *consts[20];

char *label[20];

int constnum=0,labelnum=0;

 

int search(char searchchar[],int wordtype)

{

     int i=0;

     switch (wordtype) {

       case 1:for (i=0;i<=7;i++)

                {

                  if (strcmp(key[i],searchchar)==0)

                    return(i+1);

                }

       case 2:{for (i=0;i<=5;i++)

                {

                  if (strcmp(border[i],searchchar)==0)

                     return(i+1);

                }            return(0);

              }

 

       case 3:{for (i=0;i<=3;i++)

                {

                  if (strcmp(arithmetic[i],searchchar)==0)

                     {

                      return(i+1);

                     }

                }

              return(0);

              }

 

       case 4:{for (i=0;i<=5;i++)

                {

                  if (strcmp(relation[i],searchchar)==0)

                     {

                      return(i+1);

                     }

                }

               return(0);

              }

 

       case 5:{for (i=0;i<=constnum;i++)

                {

                  if (strcmp(consts[i],searchchar)==0)

                      {

                       return(i+1);

                      }

                }

              consts[i-1]=(char *)malloc(sizeof(searchchar));

              strcpy(consts[i-1],searchchar);

              constnum++;

              return(i);

              }

 

       case 6:{for (i=0;i<=labelnum;i++)

                {

                    if (strcmp(label[i],searchchar)==0)

                      {

                       return(i+1);

                      }

                }

              label[i-1]=(char *)malloc(sizeof(searchchar));

              strcpy(label[i-1],searchchar);

              labelnum++;

              return(i);

              }

 

      }

 

 

}

 

 

char alphaprocess(char buffer)

{

      int atype;

      int i=-1;

      char alphatp[20];

      while ((isalpha(buffer))||(isdigit(buffer)))

            {

            alphatp[++i]=buffer;

            buffer=fgetc(fp);

            }

      alphatp[i+1]='"0';

      if (atype=search(alphatp,1))

         printf("%s (1,%d)"n",alphatp,atype-1);

      else

         {

         atype=search(alphatp,6);

         printf("%s (6,%d)"n",alphatp,atype-1);

         }

      return(buffer);

}

 

char digitprocess(char buffer)

{

      int i=-1;

      char digittp[20];

      int dtype;

      while ((isdigit(buffer)))

            {

            digittp[++i]=buffer;

            buffer=fgetc(fp);

            }

      digittp[i+1]='"0';

      dtype=search(digittp,5);

      printf("%s (5,%d)"n",digittp,dtype-1);

      return(buffer);

}

 

char otherprocess(char buffer)

{

 

      int i=-1;

      char othertp[20];

      int otype,otypetp;

      othertp[0]=buffer;

      othertp[1]='"0';

      if (otype=search(othertp,3))

         {

         printf("%s (3,%d)"n",othertp,otype-1);

         buffer=fgetc(fp);

         goto out;

         }

 

      if (otype=search(othertp,4))

              {

              buffer=fgetc(fp);

              othertp[1]=buffer;

              othertp[2]='"0';

              if (otypetp=search(othertp,4))

                {

                printf("%s (4,%d)"n",othertp,otypetp-1);

                goto out;

                }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值