c语言做编译原理词法分析

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

int count=0;

struct WK
{
    int kind;//单词种别编码:1自定义标识符2字符3字符串4常数5关键字6界符
    char name;//单词属性
}WK_list[200];

//关键字、自定义标识符识别
void gjzbsf(char c,FILE *fp1)
{
    int i=0;
    int n;
    char word[200]="";
    char *key[32]={"auto","break","case","char","const","continue","default","do","double","else","enum","extern","float","for","goto","if","int","long","register","return","short","signed","sizeof","static","struct","switch","typedef","union","unsigned","void","volatile","while"};//关键字保留
    while(c=='_'||(c>='a'&&c<='z')||(c>='A'&&c<='Z')||(c>='0'&&c<='9')&&((c=fgetc(fp1))!=EOF))
    {
        word[i++]=c;
        c=fgetc(fp1);
    }
    if(c==' '||c=='\t'||c=='\n'||c=='+'||c=='-'||c=='*'||c=='/'||c=='>'||c=='<'||c==','||c=='.'||c==';'||c==':'||c=='!'||c=='('||c==')'||c=='['||c==']'||c=='{'||c=='}')
    {
        word[i]='\0';
        for(n=0;n<32;n++)
        {
            if(strcmp(word,key[n])==0)
            {
                WK_list[count].kind=5;
                WK_list[count].name=word;
                count++;
                break;
            }//存储关键字
        }
        if(n==32)
        {
            WK_list[count].kind=1;
            WK_list[count].name=word;
            count++;
        }//存储自定义标识符
    }
    return 0;
}

//字符识别
void zf(char c,FILE *fp1)
{
    int i=0;
    char word[200]="";
    word[i++]=c;
    c=fgetc(fp1);
    while(c!='\''&&((c=fgetc(fp1))!=EOF))
    {
        word[i++]=c;
        c=fgetc(fp1);
    }
    word[i++]=c;
    c=fgetc(fp1);
    WK_list[count].kind=2;
    WK_list[count].name=word;
    count++;
}

//字符串识别
void zfc(char c,FILE *fp1)
{
    int i=0;
    char word[200]="";
    word[i++]=c;
    c=fgetc(fp1);
    while(c!='\"'&&((c=fgetc(fp1))!=EOF))
    {
        word[i++]=c;
        c=fgetc(fp1);
    }
    word[i++]=c;
    c=fgetc(fp1);
    WK_list[count].kind=3;
    WK_list[count].name=word;
    count++;
}

//常数识别
void cs(char c,FILE *fp1)
{
    int i=0;
    char word[200]="";
    int state=0;
    bool flag=false;
    while (state!=7)
    {
        switch(state)
        {
        case 0:
            if((c>='0'&&c<='9')||c=='-')
            {
                state=1;
                word[i++]=c;
                c=fgetc(fp1);
            }
            break;
        case 1:
            if(c>='0'&&c<='9')
            {
                state=1;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else if(c=='e'||c=='E')
            {
                state=4;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else if(c=='.')
            {
                state=2;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else
            {
                state=7;
                flag=true;
            }
            break;
        case 2:
            if(c>='0'&&c<='9')
            {
                state=3;
                word[i++]=c;
                c=fgetc(fp1);
            }
            break;
        case 3:
            if(c=='e'||c=='E')
            {
                state=4;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else if(c>='0'&&c<='9')
            {
                state=3;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else flag=true;
            break;
        case 4:
            if(c=='+'||c=='-')
            {
                state=5;
                word[i++]=c;
                c=fgetc(fp1);
            }
            else if(c>='0'&&c<='9')
            {
                state=6;
                word[i++]=c;
                c=fgetc(fp1);
            }
            break;
        case 5:
            if(c>='0'&&c<='9')
            {
                state=6;
                word[i++]=c;
                c=fgetc(fp1);
            }
            break;
        case 6:
            if(c>='0'&&c<='9')
            {
                state=6;
                word[i++]=c;
                c=fgetc(fp1);
            }
            if(c<'0'&&c>'9')
            {
                state=7;
            }
            break;
        case 7:
            flag=true;
            break;
        }
        if(flag) break;
    }
    word[i]='\0';
    WK_list[count].kind=4;
    WK_list[count].name=word;
    count++;
}

//界符识别
void jf(char c,FILE *fp1)
{
    int i=0;
    char word[200]="";
    if((c<'a'&&c>'z')&&(c<'A'&&c>'Z')&&(c<'0'&&c>'9'))
    {
        word[i++]=c;
        c=fgetc(fp1);
    }
    if(c=='=')
    {
        word[i++]=c;
        c=fgetc(fp1);
    }
    WK_list[count].kind=6;
    WK_list[count].name=word;
    count++;
}

int main()
{
    int num;
    char c;
    char word[200];
    FILE *fp1,*fp2;
	fp1=fopen("E:\\资料\\词法测试用例\\1.3词法分析\\测试用例\\1\\input.txt","rt");
	fp2=fopen("E:\\资料\\词法测试用例\\1.3词法分析\\测试用例\\1\\output1.txt","wt+");
	while((c=fgetc(fp1))!=EOF)
    {
        while(c==' '||c=='\t'||c=='\n') c=fgetc(fp1);//消耗空格制表换行符
        if(c=='_'||(c>='a'&&c<='z')||(c>='A'&&c<='Z'))//关键字标识符
        {
            gjzbsf(c,fp1);
            printf("关键字标识符识别\n");
            continue;
        }
        else if((c>='0'&&c<='9')||c=='-')//常数
        {
            cs(c,fp1);
            printf("常数识别\n");
            continue;
        }
        else if(c=='\'')//字符
        {
            zf(c,fp1);
            printf("字符识别\n");
            continue;
        }
        else if(c=='\"')//字符串
        {
            zfc(c,fp1);
            printf("字符串识别\n");
            continue;
        }
        else//界符
        {
            jf(c,fp1);
            printf("界符识别\n");
            continue;
        }
    }
    for(num=0;num<=count;num++)
    {
        fprintf(fp2,"%d %s\n",WK_list[num].kind,WK_list[num].name);
    }
    fclose(fp1);
    fclose(fp2);
    printf("词法分析结束");
    return 0;
}

 如图所示,代码执行后并未将结构体输出到文本文件中,萌新不知道是哪个环节出了问题,有无大佬指点一二

编译原理一般要用上堆栈吧,计算机的编译原理都是利用堆栈来实现的

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632