1實驗目的
構造算符優先分析器,利用它進行語法分析,判斷給出的符號串是否為該文法識別的句子,了解算符優先分析方法是嚴格的從左向右掃瞄,和自底向上的語法分析方法。
2.實驗要求
輸入文法g的非終結符、終結符和產生式;
(0)判斷輸入的文法是否為算符文法;
(1)輸出文法g的所有非終結符的firstvt集;
(2)輸出文法g的所有非終結符的lastvt集;
(3)構造算符優先分析表;
(4)判斷是否為算符優先文法;
(5)對輸入符號串進行分析。
程式功能(流程圖參考):
(1)輸出文法g的firstvt集:
(2)輸出文法g的lastvt集:
3)構造算符優先分析表:
(4)對輸入符號串進行分析:
4.源程式如下:
//devc++實現
# include# include# include# includeusing namespace std;
typedef pairss;
const int noteminatenumbermax=20; //非終結符最大個數
string teminatetable; //終結符表
string noteminatetable;//非終結符表
setfirstvt[noteminatenumbermax];
setlastvt[noteminatenumbermax];
vectorproductiontable[noteminatenumbermax];
bool f[20][20];
stacksfirst;
stackslast;
int prioritytable[20][20]; //存放終結符之間的算符優先關係 1表示大於,-1表示小於,0表示無,2表示等於
vectoroperatestr;
//判斷非終結符
bool isnoteminate(char c)
}if((!isteminate(temp[k]))&&isteminate(temp[k+1]) )}}
}} }
void printprioritytable()
else if(prioritytable[i][j]==-1)
cout<
else if(prioritytable[i][j]==2)
cout<
else if(prioritytable[i][j]==0)
cout<
}cout<>tablestr2; }
//輸入產生式
void inputproductions(int n)
} } while(!sfirst.empty())
else if(temp.length()>1&&isteminate(temp[temp.length()-2]))
} } while(!slast.empty())
} } }
}//移進motion為1,歸約為0,接受-1
void printstackstr(vector&sta,char currentchar,string reststr,int motion )
算符優先分析
算符優先分析 time limit 1000 ms memory limit 65536 kib problem description 演算法優先分析法是一種不太規範的自下而上分析方法,分析速度快,特別適用於表示式的分析。為了便於大家理解和實踐算符優先分析法,本題目先給出乙個算符優先文法,請大家構...
算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸入串動作 i i i 移進 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 歸約 n i 移進 n i 歸約 n i 移進 n i 移進 n i 歸約 n...
算符優先分析
1.已知算符優先關係矩陣如下表 ii 寫出符號串 i i i 的算符優先分析過程。棧關係 輸出串動作 i i i 移進 i i i 歸約 n i i 移進 n i i 移進 n i i 歸約 n n i 移進 n n i 移進 n n i 歸約 n n n 歸約 n n 歸約 n 接受2.接上個作業...