一、實驗目的及要求 根據某一文法編制調試遞歸下降分析程序,以便對任意輸入的符號串進行分析。本次實驗的目的主要是加深對遞歸下降分析法的理解。 二、實驗設備(環境)及要求 PC機及vc6.0軟件及環境 三、實驗內容與步驟 1.實驗內容: 對下列文法,用遞歸下降分析法對任意輸入的符號串進行分析: (1)E->TG (2)G->+TG|-TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F-> (E) (8)F->i 編寫相應的程序,實現上述功能。 2.實驗步驟: (1)根據文法編寫相應的函數,如E(),G()等函數,並且每個函數都用全局變量temp的相應值表示其在文法中的位置。 (2)編寫error()函數,當與文法不匹配時,打印出錯誤信息,並用exit(0)退出。 (3)編寫output()函數:根據定義的全局變量temp值得出當前分析的串的所處的文法位置,並將其打印出來,接着將分析串、分析字符、剩餘串打印出來。 (4)編寫main():用word來存儲要分析的串(以“#”結束),用循環對每個字符進行分析。 四、實驗結果與數據處理 1.串:i+i*i# 結果:
2.串:i*i++i# 結果:出現錯誤。
五、代碼清單 #include<stdio.h> #include<string.h> void E(); void G(); void T(); void S(); void F(); void error(); void output(int count);
char word[50]; int i = 0; int temp = 0; char analysisw[50]; int main() { printf("請輸入字符串(長度<50,以#號結束):\n"); scanf("%s",word); printf("%-10s %-20s %-10s %-10s\n","文法","分析串","分析字符","剩餘串"); while(word[i] != '#') { E(); }
return 0; }
void E() { temp = 1; output(i); T(); G(); }
void G() { temp = 2; if(word[i] == '+') { analysisw[i] = word[i]; output(i+1); i++; T(); G(); } else if(word[i] == '-') { analysisw[i] = word[i]; output(i+1); i++; T(); G(); } else { temp = 3; output(i); } }
void T() { temp = 4; output(i); F(); S(); }
void S() { temp = 5; if(word[i] == '*') { analysisw[i] = word[i]; output(i+1); i++; F(); S(); } else if(word[i] == '/') { analysisw[i] = word[i]; output(i+1); i++; F(); S(); } else { temp = 6; output(i); } }
void F() { if(word[i] == '(') { analysisw[i] = word[i]; temp = 7; output(i+1); i++; E(); if(word[i] == ')') { analysisw[i] = word[i]; temp = 7; output(i+1); i++; } else { error(); } } else if(word[i] == 'i') { analysisw[i] = word[i]; temp = 8; output(i+1); i++; } else { error(); }
}
void error() { strcpy(analysisw, "analysis error"); output(i); exit(0); }
void output(int count) { switch(temp) { case 1: printf("%-10s","E->TG"); break; case 2: printf("%-10s","G->+TG|-TG"); break; case 3: printf("%-10s","G->ε"); break; case 4: printf("%-10s","T->FS"); break; case 5: printf("%-10s","S->*FS|/FS"); break; case 6: printf("%-10s","S->ε"); break; case 7: printf("%-10s","F-> (E)"); break; case 8: printf("%-10s","F->i"); break; } printf(" %-20s %-10c ",analysisw,word[i]); for(;word[count] != '\0';count++) { printf("%c",word[count]); } printf("\n"); } |
遞歸下降分析法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.