1. 程式人生 > >用了半天時間做的一個簡單的遞迴下降分析器

用了半天時間做的一個簡單的遞迴下降分析器

用來分析簡單的表示式是否合法的一個程式:
以下是原始碼:
include<stdio.h>
#include<stdlib.h>
char ch=' ';//就算是一個讀數指標吧
char express[50];//用來儲存表示式的陣列
static int index=0;//迭代器
FILE *fp;//檔案指標
void get_express();//顧名思義是個得到字串的函式
int IsDigit();//判斷是不是數字
void read();//相當於那個遞迴下降分析器裡面的next
void expression();//表示式
void factor();//因子
void equation();//項

int main(){
    get_express();
    read();
    expression();
    if(ch=='#')printf("the expression analysis over");//分析完畢
    else 
     printf("the expression is invalid");//表示式不匹配
    getch();
    return 0;
    }

void get_express(){
     int i=0;
     if((fp=fopen("express.txt","r"))==NULL)printf("cannot not open the file");
     ch=fgetc(fp);
   while(ch!=EOF){
     express[i++]=ch;
     ch=fgetc(fp);
     }
   }
void read(){
     ch=express[index++];
     putchar(ch);
     }
    
int IsDigit(){
    if(ch>='0'&&ch<='9')return 1;
    else
    return 0;
    }

void  expression(){
     equation();
    
     while(ch=='+'||ch=='-'){
         read();
         equation();
         }
    
     }
        
void factor(){
   if(IsDigit(ch))read();
     else if(ch=='(')
        {read();expression();
      if(ch==')')read();
     else  {printf("error2"); }
     }   
     else {printf("error1"); } 
        
     }
            
 void equation(){
    factor();
   
    while(ch=='/'||ch=='*'){
         read();factor();
         }
   
   
     }
以下是表示式的正則表示式:

·算術表示式定義

<算術表示式> à <算術表示式> ω0 <> | <>

<> à <> ω1<因子> | <因子>

<因子> à <算術量> | ( <算術表示式> )

<算術量> à <識別符號> | <常數>

  :::ω0-/+
 :::
ω1//*
erro1 表示算符不匹配,erro2表示括號不匹配
本遞迴下降分析器只能分析單個數字組成簡單的表示式,因為沒有加詞法分析器,因為我的詞法分析器做的太爛了.,沒有加分析表和識別符號表,界符表和識別符號表..
但程式總體上還是很成功的..