编译原理----词法分析程序----C语言版

复制代码
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
char KeyWord[20][100]={
    "begin",
    "end",
    "if",
    "while",
    "var",
    "procedure",
    "else",
    "for",
    "do",
    "int",
    "read",
    "write"
};
char yunsuanfu[]="+-*/<>%=";
char fenjiefu[]=",;(){}:";
int main()
{
    char test[]="var a=10;\nvar b,c;\nprocedure p; \n\tbegin\n\t\tc=a+b\n\tend\n";
    int len_yunsuanfu=strlen(yunsuanfu);
    int len_fenjiefu=strlen(fenjiefu);
    puts(test);
    int length=strlen(test),i,j,k;
    for(i=0;i<length;i++)
    {
        if(test[i]==' '||test[i]=='\n'||test[i]=='\t')
            continue;
        int tag=0;
        for(j=0;j<len_fenjiefu;j++)
        {
            if(fenjiefu    [j]==test[i]){
                printf("分界符\t%c\n",test[i]);
                tag=1;
                break;
            }
        }
        if(tag==1)
            continue;
        tag=0;
        for(j=0;j<len_yunsuanfu;j++)
        {
            if(yunsuanfu[j]==test[i]){
                printf("运算符\t%c\n",test[i]);
                tag=1;
                break;
            }
        }
        if(tag==1)
            continue;
        if(test[i]>='0'&&test[i]<='9')
        {
            printf("数字\t");
            while(test[i]>='0'&&test[i]<='9')
            {
                printf("%c",test[i]);
                i++;
            }
            printf("\n");
            continue;
        }
        char temp[100];
        j=0;
        while(test[i]>='0'&&test[i]<='9'||test[i]>='a'&&test[i]<='z'||test[i]>='A'&&test[i]<='Z'||test[i]=='_')
        {
            temp[j++]=test[i];
            i++;
        }
        i--;
        temp[j++]='\0';
        tag=0;
        for(j=0;j<20;j++){
            if(strcmp(temp,KeyWord[j])==0)
            {
                tag=1;
                printf("关键字\t%s\n",temp);
                break;
            }
        }
        if(tag==0)
            printf("标识符\t%s\n",temp);
    }
}
复制代码

posted on   ma6174  阅读(3951)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架

导航

统计

点击右上角即可分享
微信分享提示