• 简单的词法分析程序


     词法分析程序完成的是编译第一阶段的工作,它的主要任务是从左至右逐个字符地对源程序进行扫描,产生一个个单词序列,用于语法分析。

    我写的简单代码实现如下:

    #include<stdio.h>
    #include<string.h>
    #define N 80
    char word[6][10]={"begin","if","then","while","do","end"};
    void Analyse(char a[]);
    main()
    {
    int i;
    char a[N];
    printf("请输入源程序:(以$结束)\n");
    for(i=0;i<N;i++)
    {
    scanf("%c",&a[i]);
    if(a[i]=='$')
    break;
    }
    a[i+1]='\0';
    i=0;
    printf("词法分析结果为:\n");
    Analyse(a);
    }
    void Analyse(char a[])
    {
    int i=0,j=0,n=0,m=0,temp=0;
    char b[N];
    while(a[i]!='$')
    {
    if(a[i]>=65&&a[i]<=122)
    {
    j=0;
    while((a[i]>=65&&a[i]<=122)||(a[i]>='0'&&a[i]<='9')||a[i]=='_')
    {
    b[j]=a[i];
    j++;
    i++;
    }
    i--;
    b[j]='\0';
    for(n=0;n<6;n++)
    {
    if(strcmp(b,word[n])==0)
    {
    printf("<关键字,%d,",n+1);
    while(word[n][m]!='\0')
    {
    printf("%c",word[n][m]);
    m++;
    }
    printf(">\n");
    temp=1;
    }
    }
    if(temp==0)
    printf("<标识符,10,%s>\n",b);

    }
    else
    {
    switch(a[i])
    {
    case '#': printf("<0,$>\n");
    case '+': printf("<运算符,13,+>\n");break;
    case '-': printf("<运算符,14,->\n");break;
    case '*': printf("<运算符,15,*>\n");break;
    case '/': printf("<运算符,16,/>\n");break;
    case ':':if(a[i+1]=='=')
    {
    printf("<运算符,18,:=>\n");
    i++;
    }
    else printf("<界符,17,:>\n");
    break;
    case '<': if(a[i+1]=='=')
    {
    printf("<运算符,21,<=>\n");
    i++;
    }
    else if(a[i+1]=='>')
    {
    printf("<运算符,22,<>>\n");
    i++;
    }
    else printf("<界符,20,<>\n");
    break;
    case '>': if(a[i+1]=='=')
    {
    printf("<运算符,24,>=>\n");
    i++;
    }
    else printf("<界符,23,>>\n");
    break;
    case '=': printf("<25,=>\n");break;
    case ';': printf("<界符,26,;>\n");break;
    case '(': printf("<界符,27,(>\n");break;
    case ')': printf("<界符,28,)>\n");break;
    case' ': break;
    case'\n': break;
    default:
    if(a[i]>='0'&&a[i]<='9')
    printf("<数字,%c>\n",a[i]);
    else
    printf("'%c'输入错误!\n",a[i]);
    break;
    }
    }
    i++;
    }

    }

    运行结果如下:

  • 相关阅读:
    成为高级Java工程师,你必须要看的技术书籍
    MYSQL存储引擎介绍--应用场景
    RocketMq的安装使用
    调用第三方物流公司API即时查询物流信息
    移动终端处理器构成和基带芯片概述
    数据库水平切分(拆库拆表)的实现原理
    使用TortoiseGit操作分支的创建与合并
    mysql安装教程
    初步认识dubbo--小案例
    【算法】混合流体模拟demo
  • 原文地址:https://www.cnblogs.com/ffde/p/5924968.html
Copyright © 2020-2023  润新知