⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 该程序是用c实现的词法语法分析器,使用方式参见程序说明.
💻 C
📖 第 1 页 / 共 3 页
字号:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>


// STACK max value
#define MAXLENGTH  100

//FILE* fpDet = NULL;
int k = 1;

/*char inToken[100][100] = {"id","(",")",
                          "{","int","id",";","int","id",";","int","id",";",
                          "id","=","num",";","id","=","num",";","id","=","num",";",
                          "while","(","id","relop","id",")",
                          "{","id","=","id","addop","id",";","id","=","id","addop","num",";","}",
                          "if","(","id","relop","num",")",
                          "{","id","=","num",";","}",
                          "else","{","id","=","num",";","}","}","$"
                          };*/
                          
char expression1[30][20]  = {"Program","->","id","(",")","{","Slist","}"};
char expression2[30][20]  = {"Slist","->","Dlist","Olist"};
char expression3[30][20]  = {"Slist","->","Olist"};
char expression4[30][20]  = {"Slist","->","&"};
char expression5[30][20]  = {"Dlist","->","D","A'"};
char expression6[30][20]  = {"A'","->","D","A'"};
char expression7[30][20]  = {"A'","->","&"};
char expression8[30][20]  = {"D","->","Type","id",";"};
char expression9[30][20]  = {"Olist","->","O","B'"};
char expression10[30][20] = {"B'","->","O","B'"};
char expression11[30][20] = {"B'","->","&"};
char expression12[30][20] = {"O","->","id","=","Expression",";"};
char expression13[30][20] = {"O","->","while","(","Expression",")","{","Olist","}"};
char expression14[30][20] = {"O","->","if","(","Expression",")","{","Olist","}","E'"};
char expression15[30][20] = {"E'","->","else","{","Olist","}"};
char expression16[30][20] = {"E'","->","&"};
char expression17[30][20] = {"Expression","->","Simple_expression","F'"};
char expression18[30][20] = {"F'","->","relop","Simple_expression"};
char expression19[30][20] = {"F'","->","&"};
char expression20[30][20] = {"Simple_expression","->","Term","C'"};
char expression21[30][20] = {"C'","->","addop","Term","C'"};
char expression22[30][20] = {"C'","->","&"};
char expression23[30][20] = {"Term","->","Factor","D'"};
char expression24[30][20] = {"D'","->","mulop","Factor","D'"};
char expression25[30][20] = {"D'","->","&"};
char expression26[30][20] = {"Factor","->","id"};
char expression27[30][20] = {"Factor","->","num"};
char expression28[30][20] = {"Factor","->","(","Expression",")"};
char expression29[30][20] = {"Factor","->","!","Factor"};
char expression30[30][20] = {"Type","->","int"};

int anaTable[18][18] = {{-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
                        {-1,1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1},
                        {-1,3,-1,-1,-1,-1,-1,-1,-1,4,-1,3,-1,3,-1,-1,2,-1},
                        {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,5,-1},
                        {-1,7,-1,-1,-1,-1,-1,-1,-1,-1,-1,7,-1,7,-1,-1,6,-1},
                        {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,8,-1},
                        {-1,9,-1,-1,-1,-1,-1,-1,-1,-1,-1,9,-1,9,-1,-1,-1,-1},
                        {-1,12,-1,-1,-1,-1,-1,-1,-1,-1,-1,14,-1,13,-1,-1,-1,-1},
                        {-1,10,-1,-1,-1,-1,-1,-1,-1,11,-1,10,-1,10,-1,-1,-1,-1},
                        {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,30,-1},
                        {-1,17,17,-1,-1,-1,17,-1,-1,-1,-1,-1,-1,-1,17,-1,-1,-1},
                        {-1,20,20,-1,-1,-1,20,-1,-1,-1,-1,-1,-1,-1,20,-1,-1,-1},
                        {-1,-1,-1,18,-1,-1,-1,19,-1,-1,19,-1,-1,-1,-1,-1,-1,-1},
                        {-1,23,23,-1,-1,-1,23,-1,-1,-1,-1,-1,-1,-1,23,-1,-1,-1},
                        {-1,-1,-1,22,21,-1,-1,22,-1,-1,22,-1,-1,-1,-1,-1,-1,-1},
                        {-1,26,27,-1,-1,-1,28,-1,-1,-1,-1,-1,-1,-1,29,-1,-1,-1},
                        {-1,-1,-1,25,25,24,-1,25,-1,-1,25,-1,-1,-1,-1,-1,-1,-1},
                        {-1,16,-1,-1,-1,-1,-1,-1,-1,16,-1,16,15,16,-1,-1,-1,-1}};

struct STACK{
       int top;
       char elements[MAXLENGTH][MAXLENGTH];   
    };

struct STACK st;

// Function declaration
void makeNull(struct STACK * s);
int top(struct STACK * s);
void pop(struct STACK * s);
void push(char * x,struct STACK * s);
int indenT(char * t);
void error(char *m);
void parse();






/*定义关键字 ,一共7个  */
char key[4][6]={"else", "if", "int","while"};
char fuhao[6]={'(',')','{','}','=',';'};
char str[10000];/*存放待查着的字符串 */
FILE *in, *out;/*输入输出文件指针  */
char inToken[1000][10];
int tokennumber=0;
char tack[1000][10];/*LL(1)文法中用到的栈结构*/
//int top=0;/*栈的顶端指针*/

struct Link
{
    char data[50];
    char type[50];
    int Isfirst;
};/*data用于存放字符,num用于指定源程序中的行数,type用于说明类型 分别为id,num,addop,mulop,relop*/

struct Link link[100];
int number=0;/*记录link数组中的当前位置*/
int line=0;/*用来记录当前所处理字符的行数*/







/*分析树的结点*/


struct tree 
{
       struct tree *father;
       struct tree *son;
       struct tree *brother;
       char name[10];
       char type[10];
       char value[10];
       int address;
};
struct tree *root;
struct code
{
       char op1[10];
       char op2[10];
       char op3[10];
};
struct code c[100];

struct link/*该链表在建立树的时候用*/
{
       struct tree * node;
       struct link *next;
       struct link *forword;
}
struct link *head,*last;
void move(struct tree *t);
void add(struct tree *t);
struct tree * get(char s[]);
void maketree(int i);
/*
判断str不是不全部由数字字符组成 
*/
int IsNumber()
{
    int i;
    for ( i = 0; i<strlen(str) ;i++)
    {
        if (str[i]<'0' || str[i]>'9')/*只要字符串里有一个不是数字字符,就不是数字了*/
        {
            return 0;
        }
    }
    return 1;
}

int IsFuhao(char s)
{
    if(s==';'||s=='('||s==')'||s=='{'||s=='}'||s==',') return 1;
    else return 0;
}
    
/*
判断字符串s是否在以识别的符号串中
*/
int IsInLink1(char s[])
{
    int i;
    for(i=0;i<number;i++)
    {
        if(strcmp(link[i].data, s)==0) return i;
    }
    return 0;
}
/*
判断字符s是否在以识别的符号中
*/
int IsInLink2(char s)
{
    int i;
    for(i=0;i<number;i++)
    {
        if(link[i].data[0]==s) return i;
    }
    return 0;
}

int IsKey(char str[])
{
    int i;
    for(i=0;i<4;i++)
    {
        if(strcmp(key[i], str)==0) return i;
    }
    return 0;    
}
/*一旦分析出了一个标识,就应该清空str串,为下一次做准备 */
void FindKey()
{
    int i,num;
    if (strlen(str)==0)/*没有待分析的内容*/
    {
        return;/*直接返回 */
    }
    
    /*先在关键字表里找,如果找到关键字则直接输出并加入到符号表中*/
    for (i = 0; i<4 ;i++)
    {
        if(strcmp(key[i], str)==0)/*找到了 */
        {
             if(IsInLink1(str))
             {
                  printf("%s ",str);
                  fprintf(out,"%s ",str);
                 strcpy(link[number].data,str);
                 strcpy(link[number].type,str);
                 link[number].Isfirst=0;
                 number++;
                 
             }
             else
             {
                 printf("%s ",str);
                 fprintf(out,"%s ",str);
                 strcpy(link[number].data,str);
                 strcpy(link[number].type,str);
                 link[number].Isfirst=1;
                 number++;
                 
             }
             strcpy(inToken[tokennumber],str);


             tokennumber++;
            strset(str, '\0');/*清空待处理字符串*/
            return;
        }
    }
    
    /*看看是不是自定义标识符 */
    if (str[0]>'A' && str[0]<'z')/*只要开头一个是字符,就是一个合法的自定义标识符  */
    {
            num=IsInLink1(str);
            if(num)
            {
                printf("id%d ",num);
                fprintf(out,"id%d ",num);
                strcpy(link[number].data,str);
                strcpy(link[number].type,"id");
                link[number].Isfirst=0;
                number++;
                
            }
            else
            {
                printf("id%d ",number);
                fprintf(out,"id%d ",number);
                strcpy(link[number].data,str);
                strcpy(link[number].type,"id");
                link[number].Isfirst=1;
                number++;
                
            }
            strcpy(inToken[tokennumber],"id");
            tokennumber++; 
        /*fprintf(out, "(%d,\"%s\")", 8, str);自定义标识号的种码为8*/
        strset(str, '\0');/*清空待处理字符串*/
        return;
    }

    /*看看是不是数字,条件是必须全部为数字  */
    if (IsNumber())
    {
            num=IsInLink1(str);
                printf("num%d ",number);
                fprintf(out,"num%d ",number);
                strcpy(link[number].data,str);
                strcpy(link[number].type,"num");
               
            if(num)
            {
                link[number].Isfirst=0;
            }
            else
            {

                link[number].Isfirst=1;
            }
             number++;
            strcpy(inToken[tokennumber],"num");
            tokennumber++; 
        strset(str, '\0');/*清空待处理字符串*/
    }
    else/*无法识别了*/
    {
            num=IsInLink1(str);
            if(num)
            {
                printf("unknown%d ",number);
                fprintf(out,"unknown%d ",number);
                strcpy(link[number].data,str);
                strcpy(link[number].type,"unknown");
                link[number].Isfirst=0;
                number++;
                
            }
            else
            {
                printf("unknown%d ",number);
                fprintf(out,"unknown%d ",number);
                strcpy(link[number].data,str);
                strcpy(link[number].type,"unknown");
                link[number].Isfirst=1;
                number++;
                
            }
            strcpy(inToken[tokennumber],"unknown");
            tokennumber++; 
        /*fprintf(out, "(%d,\"%s\")", 29, str);*//*无法识别的标识的种码为29 */
        strset(str, '\0');/*清空待处理字符串*/
    }
}


/*
默认从source.c中读取源文件,并把分词结果存入out.txt中
*/
    void hand_addop(char s)/*用于处理addop的函数*/
    {
          int num;
          num=IsInLink2(s);
          if(num)
          {
               printf("addop%d ",number);
               fprintf(out,"addop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"addop");
               link[number].Isfirst=0;
               number++;
               
          }
          else
          {
               printf("addop%d ",number);
               fprintf(out,"addop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"addop");
               link[number].Isfirst=1;
               number++;
               
          }
            strcpy(inToken[tokennumber],"addop");
            tokennumber++; 
    }

    void hand_mulop(char s)/*处理mulop的函数*/
    {
          int num;
          num=IsInLink2(s);
          if(num)
          {
               printf("mulop%d ",number);
               fprintf(out,"mulop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"mulop");
               link[number].Isfirst=0;
               number++;
               
          }
          else
          {
               printf("mulop%d ",number);
               fprintf(out,"mulop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"mulop");
               link[number].Isfirst=1;
               number++;
               
          }
            strcpy(inToken[tokennumber],"mulop");
            tokennumber++; 
    }


    void hand_relop(char s)/*处理relop的函数*/
    {
          int num;
          num=IsInLink2(s);
          if(num)
          {
               printf("relop%d ",number);
               fprintf(out,"relop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"relop");
               link[number].Isfirst=0;
               number++;
               
          }
          else
          {
               printf("relop%d ",number);
               fprintf(out,"relop%d ",number);
               link[number].data[0]=s;
               strcpy(link[number].type,"relop");
                link[number].Isfirst=1;
               number++;
              
          }
            strcpy(inToken[tokennumber],"relop");
            tokennumber++; 
    }

    void hand_fuhao(char s)/*处理fuhao的函数*/
    {
          int num;
          num=IsInLink2(s);
          if(num)
          {
          printf("%c ",s);
          fprintf(out,"%c ",s);
          link[number].data[0]=s;
          //strcpy(link[number].type,"fuhao");
          link[number].type[0]=s;
          link[number].Isfirst=0;
          number++;
               
          }
          else
          {
          printf("%c ",s);
          fprintf(out,"%c ",s);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -