實驗三.遞歸下降語法分析程序
專業 商業軟件工程 姓名 陳廣鵬 學號201506110167
一、 實驗目的
通過設計、編制、調試遞歸下降語法分析程序,對輸入的符號串進行分析匹
配,觀察輸入符號串是否為給定文法的句子。
二、 實驗內容和要求
遞歸下降分析法是一種自頂向下的分析方法,文法的每個非終結符對應一個遞歸過程(函數)。分析過程就是從文法開始符出發執行一組遞歸過程(函數),
這樣向下推導直到推出句子;或者說從根節點出發,自頂向下為輸入串尋找一個最左匹配序列,建立一棵語法樹。
在不含左遞歸和每個非終結符的所有候選終結首字符集都兩兩不相交條件下,我們就可能構造出一個不帶回溯的自頂向下的分析程序,這個分析程序是由
一組遞歸過程(或函數)組成的,每個過程(或函數)對應文法的而一個非終結
符。這樣的一個分析程序稱為遞歸下降分析器。
(1)輸入一以#結束的符號串(包括+—*/()i#):在此位置輸入符號串例如:i+i*i#
(2)輸出結果:i+i*i#為合法符號串
(3)輸入一符號串如i+i*#,要求輸出為“非法的符號串”。
。
三、 實驗方法、步驟及結果測試
- 1. 源程序名:digui.cpp
- 2. 原理分析及流程圖
遞歸下降分析程序實現思想簡單易懂。程序結構和語法產生式有直接的對應關系。因為每個過程表示一個非終結符號的處理,添加語義加工工作比較方便。
遞歸下降分析程序的實現思想是:識別程序由一組子程序組成。每個子程序對應於一個非終結符號。
每一個子程序的功能是:選擇正確的右部,掃描完相應的字。在右部中有非終結符號時,調用該非終結符號對應的子程序來完成。
自上向下分析過程中,如果帶回溯,則分析過程是窮舉所有可能的推導,看是否能推導出待檢查的符號串。分析速度慢。而無回溯的自上向下分析技術,當選擇某非終結符的產生時,可根據輸入串的當前符號以及各產生式右部首符號而進行,效率高,且不易出錯。
無回溯的自上向下分析技術可用的先決條件是:無左遞歸和無回溯。
無左遞歸:既沒有直接左遞歸,也沒有間接左遞歸。
無回溯:對於任一非終結符號U的產生式右部x1|x2|…|xn,其對應的字的首終結符號兩兩不相交。
如果一個文法不含回路(形如P⇒+ P的推導),也不含以ε為右部的產生式,那么可以通過執行消除文法左遞歸的算法消除文法的一切左遞歸(改寫后的文法可能含有以ε為右部的產生式)。
- 3. 主要程序段及其解釋:
#include<stdio.h> #include<string> char str[50]; 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; int m; printf("請輸入要測試的次數:"); scanf("%d",&m); while(m--) { printf("請輸入字符串(長度<50>):\n"); scanf("%s",str); len=strlen(str); //str[len]='#'; str[len+1]='\0'; E(); printf("%s為合法符號串!\n",str); 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); } }
- 4. 運行結果及分析
四、 實驗總結
通過本次實驗對遞歸下降詞法分析器的結構,過程有了更進一步的了解,通過學習書本和試驗原理書上的內容,對它的工作原理,具體實行步驟有了進一步的掌握,由於本次試驗是測試性試驗,所以要求輸出的結果是成功與否,輸入一個句型,進過分析,判斷它是否合法,主要內容在於其判斷過程中。本次試驗不光提高了自己的編程能力,同時提高了對遞歸下降的了解。