深入淺出編譯原理-5-一個簡單文法分析器的C語言實現

來源:互聯網
上載者:User

引言

前面已經介紹了編譯器的預先處理,詞法分析,詞法分析器的實現,也在其中說到了文法分析的任務和過程。

文法分析的輸入是詞法單元序列,然後根據語言的文法表示(展開式),利用有限狀態機器理論,產生抽象文法樹,然後遍曆得到中間代碼,即,三地址碼。本節就以一個實驗的方式,來看一下,文法分析器的內在實現機制。

 

5.1實驗描述

編製一個遞迴下降剖析器,實現對詞法剖析器所提供的單詞序列的語法檢查和結構分析。

利用C語言編製遞迴下降剖析器,並對簡單語言進行文法分析。

5.1.1 待分析的簡單語言的文法

用擴充的BNF表示如下:

⑴<程式>::=begin<語句串>end

⑵<語句串>::=<語句>{;<語句>}

⑶<語句>::=<指派陳述式>

⑷<指派陳述式>::=ID:=<運算式>

⑸<運算式>::=<項>{+<項> | -<項>}

⑹<項>::=<因子>{*<因子> | /<因子>

⑺<因子>::=ID | NUM | (<運算式>)

5.1..2 實驗要求說明

輸入單詞串,以“#”結束,如果是文法正確的句子,則輸出成功資訊,列印“success”,否則輸出“error”。

例如:

    輸入  begin a:=9; x:=2*3; b:=a+x end #

    輸出  success。

    輸入  x:=a+b*c end #

    輸出  error

 

5.2 C語言代碼實現

核心思想就是,從開始狀態開始,按照文法展開式,逐級進行狀態分析,直到分析完畢,如果在此期間出現狀態不匹配,即語法錯誤,停止分析。當然在實際的文法分析器要有錯誤恢複機制,以發現其他的語法錯誤。即,一次報告多個語法錯誤。這裡需要說明的是,要想實現文法分析,必須先有詞法分析,所以,這段程式碼封裝含了上一節的內容,詞法分析部分。

#include "stdio.h"#include "string.h"char prog[100],token[8],ch;char *rwtab[6]={"begin","if","then","while","do","end"};int syn,p,m,n,sum;int kk;void factor(void);void expression(void);void yucu(void);void term(void);void statement(void);void lrparser(void);void scaner(void);int main(void){p=kk=0;printf("\nplease input a string (end with '#'): \n");do{scanf("%c",&ch);prog[p++]=ch;}while(ch!='#');p=0;scaner();lrparser();//getch();}void lrparser(void){if(syn==1){ scaner();       /*讀下一個單詞符號*/yucu();     /*調用yucu()函數;*/if(syn==6){scaner();if((syn==0)&&(kk==0))printf("success!\n");}else{if(kk!=1) printf("the string haven't got a 'end'!\n");kk=1;}}else{ printf("haven't got a 'begin'!\n");kk=1;}return;}void yucu(void){ statement();         /*調用函數statement();*/while(syn==26){scaner();          /*讀下一個單詞符號*/if(syn!=6) statement();         /*調用函數statement();*/} return;}void statement(void){if(syn==10){scaner();        /*讀下一個單詞符號*/if(syn==18){scaner();      /*讀下一個單詞符號*/expression();      /*調用函數statement();*/}else{printf("the sing ':=' is wrong!\n");kk=1;}}else{ printf("wrong sentence!\n");kk=1;}return;}void expression(void){term();  while((syn==13)||(syn==14))    {    scaner();             /*讀下一個單詞符號*/      term();               /*調用函數term();*/    } return;}void term(void){ factor();  while((syn==15)||(syn==16))    {     scaner();             /*讀下一個單詞符號*/      factor();              /*調用函數factor(); */    }return;}void factor(void){ if((syn==10)||(syn==11)){scaner();}  else if(syn==27)    {     scaner();           /*讀下一個單詞符號*/     expression();        /*調用函數statement();*/if(syn==28){scaner();          /*讀下一個單詞符號*/}      else   {  printf("the error on '('\n");      kk=1;     }    }  else{ printf("the expression error!\n");  kk=1;    }  return;}void scaner(void){sum=0;for(m=0;m<8;m++)token[m++]=NULL;m=0;ch=prog[p++];while(ch==' ')ch=prog[p++];if(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))){ while(((ch<='z')&&(ch>='a'))||((ch<='Z')&&(ch>='A'))||((ch>='0')&&(ch<='9'))){token[m++]=ch;ch=prog[p++];}p--;syn=10;token[m++]='\0';for(n=0;n<6;n++)if(strcmp(token,rwtab[n])==0){syn=n+1;break;}}else if((ch>='0')&&(ch<='9')){while((ch>='0')&&(ch<='9')){ sum=sum*10+ch-'0';ch=prog[p++];}p--;syn=11;}elseswitch(ch){case '<':m=0;ch=prog[p++];if(ch=='>'){ syn=21;}else if(ch=='='){ syn=22;}else{ syn=20;p--;}break;case '>':m=0;ch=prog[p++];if(ch=='='){ syn=24;}else{syn=23;p--;}break;case ':':m=0;ch=prog[p++];if(ch=='='){syn=18;}else{syn=17;p--;}break;case '+':syn=13;break;case '-': syn=14;break;case '*':syn=15;break;case '/': syn=16;break;case '(': syn=27;break;case ')': syn=28;break;case '=':syn=25;break;case ';': syn=26;break;case '#':syn=0;break;default:syn=-1;break;}}


5.3小結

文法分析的核心工作就是:從開始狀態開始,利用有限狀態機器理論,根據語言的文法展開式,進行狀態分析,得到文法樹。然後進而產生中間代碼(三地址碼),為後面的彙編做好準備。本小節的內容只是進行狀態分析。但對理解文法分析器有很大協助。代碼的具體流程圖,讀者可自己畫一下,其中味道,可意不可言......

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.