通過設計、開發乙個高階語言的遞迴下降語法分析程式,實現
對詞法分析程式所提供的單詞序列進行語法檢查和結構分析,加
深對相關課堂教學內容的理解,提高語法分析方法的實踐能力。
(1)理解語法分析在編譯程式中的作用,以及它與詞法分析程式的
關係;
(2)掌握遞迴下降語法分析方法的主要原理;
(3)理解遞迴下降分析法對文法的要求;
(4)熟練掌握select集合的求解方法;
(5)熟練掌握文法變換方法(消除左遞迴和提取公因子)。
遞迴下降分析法是語法分析中最易懂的一種方法,基本原理
是:對每個非終結符號(分別代表乙個語法單位)按其產生式結
構構造相應語法分析子程式,以完成該非終結符號所對應的語法
單位的分析和識別任務。其中終結符號產生匹配命令,而非終結
符號則產生過程呼叫命令。因為文法可以遞迴,相應子程式也是
遞迴的,所以稱這種方法為遞迴子程式下降法或遞迴下降法。其
中子程式的結構與產生式結構幾乎是一致的。
《編譯原理》實驗指導書
假設乙個文法中的非終結符號a 的全部產生式為
a��α1|α2|……|αn ,則必須滿足以下條件才能保證可以唯一的選
擇合適的產生式,才能採用遞迴下降分析法:
select(a��αi)∩select(a��αj)=φ,其中i≠j
假設文法中有如下的產生式a��β1|β2|…|βn,則應按如下方法
編寫語法分析子程式。
(1)根據s語言bnf形式的語法規則(見附件a),寫出s語言的上下
文無關文法;
(2)求每個產生式的select集:
procedure a( )
begin if token∈select(a��β1) then θ(β1) else
if token∈select(a��β2) then θ(β2) else
…… if token∈select(a��βn) then θ(βn) else
error()
end
其中 βi =x1x2…xn,θ(βi) =θ』(x1); θ』(x2);…; θ』(xn);如果
xi∈vn,θ』(xi)= xi;如果xi∈vt,θ』(xi)= match(xi);如果xi= ε,
θ』(xi) = skip(空語句)。
《編譯原理》實驗指導書
10 select(a��β)= first(β),當 ε∉first(β)
= (first(β)-)∪follow(a),當ε∈first(β)
(3)判斷是否滿足遞迴下降法分析條件,若不滿足用消除左遞迴和
提取公因子等文法等價變換操作對文法進行變換,使其滿足遞
歸下降法的要求;
(4)構造遞迴下降語法分析程式,對文法中的每個非終結符號按其
產生式結構產生相應的語法分析子程式,完成相應的識別任
務。其中終結符號產生匹配命令,非終結符號則產生呼叫命令。
實際的語法分析工作從呼叫主程式(開始符號s對應的程式)
開始,根據產生式遞迴呼叫各個分析子程式;
(5)撰寫實驗報告。
#include
#include
#include
using
namespace
std;
void print();
void scanner();
bool statement();
bool condition();
bool while_statement();
bool expression();
bool item_expression();
bool factor();
bool conditional_statements();
bool assignment_statement();
bool compound_statements();
int syn;//存放單詞的型別
int p;
char ch;
int sum;//用來儲存數字的值
char program[200],token[10];
char *rwtab[9]=;
int m;
bool isdigital(char ch)
bool isalpha(char ch)
void scanner()
m=0;
ch=program[p++];
while(ch==' '||ch=='\n'||ch=='\t')
if(isalpha(ch))while(isalpha(ch)||isdigital(ch));
p--;
syn=10;
token[m++]='\0';
for(int n=0;n<=8;n++)
}return;
}else
if(isdigital(ch))
p--;
syn=11;
if(isalpha(ch))
syn=-1;
return;
}else
else
if(ch=='=')
else
break;
case
'>':ch=program[p++];
if(ch=='=')
else
break;
case
'=':ch=program[p++];
if(ch=='=')
else
break;
case
'+':syn=12;break;
case
'-':syn=13;break;
case
'*':syn=14;break;
case
'/':syn=15;break;
case
';':syn=23;break;
case
'(':syn=24;break;
case
')':syn=25;break;
case
',':syn=26;break;
case
'#':syn=0;break;
default:syn=-1;break;
}return;
}}bool constan_defined()
return
false;
}return
false;
}return
false;
}bool constan_description()
else
if(syn==26)
cout
<<"常量說明錯誤"
return
false;
}bool variable_defined()
else
return
false;
}bool variable_description()
scanner();
if(syn==8)
else
if(syn==26)}}
} bool condition()
expression();
}bool expression()
}while(syn==12||syn==13);
return
true;
}bool item_expression()
} return
false;
}bool factor()
else
if(syn==11)
else
if(syn==24)
else
}else
return
false;
}bool assignment_statement()
else}}
if(syn==9)
else
if(syn==0)
else
}else
}else
}bool while_statement()
// else
// return false;
else
return
false;
}bool statement()
else
if(syn==5)
else
if(syn==1)
else
if(syn==2)
else
}int main()
while(ch!='#');
p=0;
cout
<<"程式開始"
cout
<<"程式結束"
<}
實驗二 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
實驗二 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...
實驗二 遞迴下降語法分析
一 實驗目的 利用c語言編制遞迴下降分析程式,並對簡單語言進行語法分析。編制乙個遞迴下降分析程式,實現對詞法分析程式所提供的單詞序列的語法檢查和結構分析。二 實驗原理 每個非終結符都對應乙個子程式。該子程式根據下乙個輸入符號 select集 來確定按照哪乙個產生式進行處理,再根據該產生式的右端 三 ...