LR(0)文法的分析

2021-08-20 22:40:16 字數 1802 閱讀 5150

#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 ...