編譯原理之算術表達式的詞法分析算法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;

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章