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