91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

第三次上機—語法分析1 目的:熟練掌握自上而下的語法分析方法,并能用C++程序實現。 要求: 1. 使用的文法如下: E ? TE ¢ E ¢ ? + TE ¢ | e T ? FT ¢ T ¢ ? * FT ¢ | e F ? (E) | id 2. 對于任意給定的輸入串(詞法記號流)進行語法分析,遞歸下降方法和非遞歸預測分析方法可以任選其一來實現。 3. 要有一定的錯誤處理功能。即對錯誤能提示,并且能在一定程度上忽略盡量少的記號來進行接下來的分析。可以參考書上介紹的同步記號集合來處理。 可能的出錯情況:idid*id, id**id, (id+id, +id*+id …… 4. 輸入串以#結尾,輸出推導過程中使用到的產生式。例如: 輸入:id+id*id# 輸出:E ? TE ¢ T ? FT ¢ F ? id E ¢ ? + TE ¢ T ? FT ¢ …… 如果輸入串有錯誤,則在輸出中要體現是跳過輸入串的某些記號了,還是彈棧,彈出某個非終結符或者是終結符了,同時給出相應的出錯提示信息。比如: idid*id對應的出錯信息是:“輸入串跳過記號id,用戶多輸入了一個id”; id**id對應的出錯信息是:“彈棧,彈出非終結符F,用戶少輸入了一個id” (id+id對應的出錯信息是:“彈棧,彈出終結符 ) ,用戶少輸入了一個右括號(或者說,括號不匹配)” 有余力的同學可進一步考慮如下擴展: 1. 將遞歸下降方法和非遞歸預測分析方法都實現 2. 在語法分析的過程中調用第二次上機的結果,即利用詞法分析器來返回一個記號給語法分析器。 3. 編寫First和Follow函數,實現其求解過程。 測試文法: A->BCDE B->aBA|ε C->F|ε D->b|c|ε E->e|ε F->d|ε

資源截圖

代碼片段和文件信息

#include?
using?namespace?std;
char?st[20];???//存儲輸入句子
int?i=0;??????//數組下標
void?E();??????
void?R();//E‘
void?T();
void?H();//T‘
void?F();
//***********************************
//檢錯部分
int?comp(char?s1string?s2);
int?error_check(int?n);
string?firfol[5]={“(i““)+e““(i““+*)e““(i“};
string?synch[5]={“)““““+)““““+*)“};
char?s[5]={‘E‘‘R‘‘T‘‘H‘‘F‘};
int?error_check(int?n){
?if(comp(st[i]synch[n])==1){
?cout<<“彈出非終結符“<?return?0;
?}
?else?while(comp(st[i]firfol[n])==0&&comp(st[i]synch[n])==0&&st[i]!=‘#‘){
?cout<<“輸入串跳過記號“<?i++;
?}
?return?1;
}
int?comp(char?s1string?s2){
?for(int?j=0;j?if(s1==s2[j])
?return?1;
?}
?return?0;
}
//*****************************
void?main(){
?cout<<“使用的文法為:\nE->TE‘\nE‘->+TE‘|e\nT->FT‘\nT‘->*FT‘|e\nF->(E)|id\n“;
?cout<<“-------------------“<?cout<<“輸入待檢測串(以?#?結束):“<?cin>>st;
?cout<<“-------------------“<?cout<????E();
?if(st[i]!=‘#‘){
?cout<<“輸入串跳過記號?“<?i++;
?E();
?}system(“pause“);
}


void?E(){
?if(error_check(0)==0||st[i]==‘#‘);
?else{
?cout<<“E->TE‘“<????????T();
????????R();
?}
}


void?R(){
?if(error_check(1)==0);
?else{
?if(st[i]==‘+‘){
?cout<<“E‘->+TE‘“<????????????i++;
????????????T();
????????????R();
?}
?else?
?cout<<“T‘->e“<?}
}
void?T(){
?if(error_check(2)==0);
?else{
?cout<<“T->FT‘“<????????F();
????????H();
?}
}
void?H(){
?if(error_check(3)==0);
?else{
?if(st[i]==‘*‘){
?cout<<“T‘->*FT‘“<????????????i++;
????????????F();
????????????H();
?}
?else?
?cout<<“T‘->e“<?}
}


void?F(){
?if(error_check(4)==0);
?else{
?if(st[i]==‘i‘){
i++;
?if(st[i]==‘d‘)
?{
?cout<<“F->id“< ?i++;
?}
?}
?else
?if(st[i]==‘(‘){
?cout<<“F->(E)“<????????????????i++;
????????????????E();
?if(st[i]==‘)‘){
?i++;
?}
?else?if(st[i]!=‘)‘)
?cout<<“括號不匹配“<?}
?}
}

?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????目錄???????????0??2013-04-27?19:07??test\
?????文件????????2127??2013-05-27?18:47??test\digui.cpp
?????文件????????4562??2013-05-27?18:47??test\feidigui.cpp
?????文件???????32256??2013-04-22?21:35??test\第三次上機作業-語法分析1.doc

評論

共有 條評論