编译原理之算术表达式的词法分析算法c实现

   程序编译过程由词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成六个阶段,在对程序进行编译之前,首先要做的就是词法分析,将程序中可能出现的各种单词归类、编码,以便于将各类语句拆分,判断是否符合规范,下面就以一个例子来说明算法过程:

要点:对于给定的词法分析表设计词法分析器

给定词法分析表:

序号

单词类别

序号

单词类别

1

整数

5

2

标识符

6

3

+

7

 \n(回车)

4

*

8

ERROR

词法分析器如下:

/*表达式词法分析器*/

#include<stdio.h>

void IdentifierStack(char *expression,int&index);//标识符辨识器

void IntegerStack(char *expression,int&index);//整数辨识器

void WordAnalysis(char *expression,int&index);//标识符词法分析器主函数

int main(){

      char expression[1000]; //表达式字符数组

      int index=0;

      printf("**************************\n");

      printf("+++++表达式词法分析器+++++\n");

      printf("**************************\n");

      printf("The expression is...\n\n");

      scanf("%s",expression);

      printf("\n++++++++++++++++++++\n");

      printf("TABLEINDEX CONTEXT\n");

      WordAnalysis(expression,index);

      printf("    7        '\\n'(换行符)\n");

      printf("++++++++++++++++++++\n");

      printf("**************************\n");

      return 0;

}

voidIntegerStack(char *expression,int&index){

      //整数辨识器

      intascii,i=index;

      ascii=expression[index+1];

      while((48<=ascii)&&(ascii<=57)){

             index++;

             ascii=expression[index+1];

      }

      if(ascii==95||65<=ascii&&ascii<=90||97<=ascii&&ascii<=122){

             printf("    8       ERROR\n");

             while(ascii==95||65<=ascii&&ascii<=90||97<=ascii&&ascii<=122){

                    index++;

                    ascii=expression[index+1];

             }

      }

      else{

             printf("    1        '");

             for(;i<=index;i++){

                    printf("%c",expression[i]);    

             }

             printf("'\n");

      }     

      return;

}

voidIdentifierStack(char *expression,int&index){

      //标识符辨识器

      intascii,i=index;

      ascii=expression[index+1];

      while((48<=ascii&&ascii<=57)||((65<=ascii&&ascii<=90)||(97<=ascii&&ascii<=122)||(ascii==95))){

             index++;

             ascii=expression[index+1];

      }

      printf("    2        '");

      for(;i<=index;i++){

             printf("%c",expression[i]);

      }

      printf("'\n");

      return ;

}

voidWordAnalysis(char *expression,int&index){

      //标识符词法分析器主函数

      intascii;

      for(int index=0;expression[index];index++){ //词法分析开始

             ascii=expression[index];

             if(ascii==43)

                    printf("    3        '+'\n");

             else if(48<=ascii&&ascii<=57){

                    IntegerStack(expression,index);

                    continue;

             }

             else if((65<=ascii&&ascii<=90)||(97<=ascii&&ascii<=122)||(ascii==95)){

                    IdentifierStack(expression,index);

                    continue;

             }

             else if(ascii==42)

                    printf("    4        '*'\n");

             else if(ascii==40)

                    printf("    5        '('\n");

             else if(ascii==41)

                    printf("    6        ')'\n");

             else if(ascii==10)

                    printf("    7        '\\n'\n");

             else

                    printf("    8       ERROR\n");

      }

      return;

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值