天天看點

1217 實驗四 遞歸下降文法分析程式設計

#include<stdio.h>  
#include<string>  
char str[10];  
int index=0;  
void E();           //E->TX;  
void X();           //X->+TX | e  
void T();           //T->FY  
void Y();           //Y->*FY | e  
void F();           //F->(E) | i  
int main()  
{  
    int len;  
        printf("請輸入表達式:");  
        scanf("%s",str);  
        len=strlen(str);  
        str[len]='#';  
        str[len+1]='\0';  
        E();  
        printf("是正确的表達式!\n");  
        strcpy(str,"");  
        index=0;  
    return 0;  
}  
void E()  
{  
    T();  
    X();  
}  
void X()  
{  
    if(str[index]=='+')  
    {  
        index++;  
        T();  
        X();  
    }   
}  
void T()  
{  
    F();  
    Y();  
}  
void Y()  
{  
    if(str[index]=='*')  
    {  
        index++;  
        F();  
        Y();  
    }  
}  
void F()  
{  
    if(str[index]=='i')  
    {  
        index++;  
    }  
    else if (str[index]=='(')  
    {      
        index++;  
        E();  
        if(str[index]==')')  
        {  
            index++;   
        }else{  
            printf("\n分析失敗!\n");  
            exit (0);  
        }  
    }   
    else{  
        printf("分析失敗!\n");   
        exit(0);  
    }  
 }        
1217 實驗四 遞歸下降文法分析程式設計

1.實驗目的

練習構造文法分析程式,熟悉上下文無關文法的使用,加深對遞歸下降分析算法的了解;提高文法分析方法的實踐能力。

 2.      實驗要求

在詞法分析程式的基礎上,進一步構造文法分析程式 。

 3.      實驗思想

  •   确定的自上而下分析法,要求文法是LL(1)文法
  •   詞法分析程式scaner( )一次識别一個單詞;
  •   錯誤處理函數error( )
  •   基本思想:對文法中的每個非終結符編寫一個函數,每個函數的功能是識别由該非終結符所表示的文法成分。
  •   每個函數名是相應的非終結符,函數體是根據右部符号串的結構編寫。
  •   當遇到終結符時,則編寫語句  if(目前讀入的符号==a)則讀入下一個符号
  •   當遇到非終結符A時,則編寫語句調用A( )
  •   當遇到規則A→ε時,則編寫語句調用  if(目前讀入的符号∉ FOLLOW(A))error( )

4.      實驗内容:

  •  對于給定的文法G[E] :

E→E+T|E-T|T

T→T*F| T/F|F

F→(E)|i

  •  消除左遞歸後的文法是:

......

  • 是否是LL(1)文法?

4.實驗結果

采用遞歸下降文法分析法編寫表達式的文法分析程式,該文法分析程式判斷輸入的表達式是否符合上述文法。

輸入一個表達式,能夠輸出相應的文法結果(“是正确的表達式”或 錯在哪裡)。

例如:輸入 5+3*a,就應該輸出 “是正确的表達式”;

         輸入5+5a,或者5*+3,都有文法錯誤。