#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);
}
}

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,都有文法錯誤。