算符優先分析的設計與實現

2021-10-01 12:16:28 字數 2005 閱讀 5422

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.接上個作業...