#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int inf=0x7fffffff;
const int max_n=10000;
int num_of_a,num_of_a,num_of_s,totalnum;
//小寫字母個數、大寫字母個數、推導式個數、最終結點總數
char a[50];//字母
char s[50][50];//推導式
bool pushed[100];//訪問乙個結點的時候,再往外拓展時記錄非終結符是否已經被push過
int ans[100][100];
char analyse[50];//分析串
int stack1[50];
char stack2[50];
char stack3[50];
int l1,l2,l3;//三個棧的長度
mapm;
map::iterator m;
struct node;
queueq;//結點型佇列
node n[100];
int numn=0;
void outpu***(node k)
s[i][2]='.';}}
node pushback(char p,node f)
}q.push(aa);//把起始點放入佇列
n[numn++]=aa;//這個東西記錄已經存在過的node
while(!q.empty())}}
}if(newnode.id!=-1)
news[2]='.';
for(int j=0;j=0)cout<<"s"<=0;j--)
if(action<0&&action>-9999)
if(action==-9999)
return 0;
}void solve()
while(1)
l1-=ct;
l2-=ct;
stack2[l2++]=s[-1*action][0];
m=m.find(stack2[l2-1]);
goto=ans[stack1[l1-1]][m->second];
stack1[l1++]=goto;
cout<<" goto:"<}if(oprt==3)
else
break;}}
}}int main()
//測試資料/*4
abcd
3eab
7s_e
e_aa
e_bb
a_ca
a_db_cb
b_dbccd#
4abcd
3eab
7s_e
e_ab
e_ba
b_bb
a_aa
b_da_c
5abcde
3eab
8s_e
e_ab
e_bb
b_ca
b_cb
a_db
a_db_e
*/
編譯原理 LR分析(主要是LR(0)分析)
lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...
編譯原理 LR分析(主要是LR(0)分析)
lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...
LR 0 和SLR分析表的構造
上篇文章中,我已經說到了,lr 0 分析表是lr 0 分析器的重要組成部分,它是總控程式分析動作的依據,他是由lr 0 專案集規範族來進行 構造的。他的結構主要有兩個部分action 和goto 先看看指導原則,可以直接跳過,看例題的時候可以返回來對照參考。假設已構造出lr 0 專案集規範族為 c ...