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

📄 main.cpp

📁 此为C语言的词法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
char set[100000],str[100000],strtoken[30];
char sign[50][10],constant[50][10];
char ch;
int sr,to,id=0,st=0;

void writo()
{
    FILE *fp;
    if ((fp=fopen("analysis.txt","a"))==NULL)
    {
        printf("cannot write file. \n");
        getch();
        exit(0);
    }
    fputs(strtoken,fp);
    fputs("\n",fp);
    fclose(fp);
}

void buildfile()
{
    FILE *fp;
    if ((fp=fopen("analysis.txt","w"))==NULL)
    {
        printf("cannot create file. \n");
        getch();
        exit(0);
    }
    fclose(fp);
}

typedef struct keytable    /*放置关键字*/
{
    char name[20];
    int  kind;
}
KEYTABLE;

KEYTABLE keyword[]={      /*设置关键字*/
                       {"void",0},
                       {"int",1},
                       {"float",2},
                       {"char",3},
                       {"if",4},
                       {"else",5},
                       {"for",6},
                       {"while",7},
                       {"do",8},
                       {"switch",9},
                       {"case",10},
                       {"break",11},
                       {"default",12},
                       {"return",13},
                       {"continue",14},
                       {"double",15},
                       {"enum",16},
                       {"extern",17},
                       {"long",18},
                       {"sizeof",19},
                       {"struct",20},
                       {"typedef",21},
                       {"union",22},
                       {"short",23},
                       {"auto",24},
                       {"signed",25},
                       {"unsigned",26},
                       {"union",27},
                       {"static",28},
                       {"main",29},
                       {"printf",30},
                       {"scanf",31},
                   };

void openfile()
{
    FILE *fp;
    char a,filename[10];
    int n=0;
    printf("Input the filename:");
    gets(filename);
    if ((fp=fopen(filename,"r"))==NULL)
    {
        printf("cannot open file.\n");
        //getch();
        exit(0);
    }
    else
        while (!feof(fp))
        {
            a=getc(fp);
            set[n]=a;
            n++;
        }
    fclose(fp);
    set[n-1]='\0';
    printf("\n=======================源代码==========================\n");
    puts(set);
    printf("\n=======================================================\n");
}

void reflesh()  /*清空strtoken数组*/
{
    to=0;   /*全局变量to是strtoken的指示器*/
    strcpy(strtoken," ");
}

void prearrange1()  /*预处理程序1 注释*/
{
    int i,a,b,n=0;
    do
    {
        if (set[n]=='/' && set[n+1]=='*')
            {
                a=n;
                while (!(set[n]=='*' && set[n+1]=='/'))
                        n++;
                b=n+1;
                for (i=a;i<=b;i++)
                    set[i]=' ';   /*把注释的内容换成空格,等待第二步预处理*/
            }
        n++;
    }
    while (set[n]!='\0');
}

void prearrange2()   /*预处理程序2 连续空格换一个空格*/
{
    int j=0;
    sr=0;    /*全局变量sr是str[]的指示器*/
    do
    {
        if (set[j]==' ' || set[j]=='\n')
            {
                while (set[j]==' '|| set[j]=='\n')
                        j++;
                str[sr]=' ';
                sr++;

            }
        else
        {
            str[sr]=set[j];
            sr++;
            j++;
        }
    }
    while (set[j]!='\0');
    str[sr]='\0';
}

char getachar()    /*把字符读入全局变量ch中,指示器sr前移*/
{
    ch=str[sr];
    sr++;
    return(str[sr-1]);
}

void getbc()    /*开始读入符号*/
{
    while (ch==' ')
    {
        ch=getachar();
    }
}

void conacat()    /*把ch中的字符放入strtoken[]*/
{
    strtoken[to]=ch;
    to++;                 /*全局变量to是strtoken的指示器*/
    strtoken[to]='\0';

}

int isletter()       /*判断是否为字母*/
{
    if ((ch>=65 && ch<=90)||(ch>=97 && ch<=122))
        return(1);
    else return(0);
}

int isdigit()      /*判断是否为数字*/
{
    if (ch>=48 && ch<=57)
        return(1);
    else return(0);
}

int raserve()  /*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回-1*/
{
    int i,k=0;
    for (i=0;i<=31;i++)
    {
        if (strcmp(strtoken,keyword[i].name)==0)
        {
            k=1;
            return(keyword[i].kind);
        }
    }
    if (k!=1)
        return(-1);
}

void retur()
{
    sr--;
    ch=' ';
}


void analysis()
{
    int value;
    reflesh();              /*清空strtoken数组*/
    prearrange1();          /*预处理,使注释内容换成单个空格,放回set[]中*/
    prearrange2();          /*预处理,使set[]中连续的空格置换成单个空格,并把set[]的内容放到str[]中*/
    sr=0;
    getachar();
    getbc();            /*读取第一个字符*/
    while (ch!='\0')      /*当不等于结束符,继续执行*/
    {
        if (isletter() || ch=='_')
        {
            while (isletter() || isdigit() || ch=='_')  /*若第一个是字符,继续读取,直到出现空格*/
            {
                conacat();
                getachar();
            }
            if (ch=='.')
            {
                conacat();
                getachar();
                while (isletter() || isdigit())
                {
                    conacat();
                    getachar();
                }
            }
            retur();            /*指示器sr回调一个字符位置,把ch置为空*/
            value=raserve();      /*对strtoken中的字符串查找保留字表,若是则返回它的编码,否则返回-1*/
            if (value==-1)        /*如果返回值是-1,那就是变量,把它输出*/
            {

                writo();
                printf("\n'%s':id",strtoken);
                //getch();
            }
            else                            /*否则就是关键字,也输出*/
            {
                writo();
                printf("\n'%s' :key,%d",strtoken,value);
                //getch();
            }
            reflesh();
        }
        else if (isdigit())
        {
            while (isdigit())      /*否则,若第一个是数字,继续读取,知道出现空格*/
            {
                conacat();
                getachar();
            }
            if (ch=='.')
            {
                conacat();
                getachar();
                while (isdigit())
                {

⌨️ 快捷键说明

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