LR語法分析 LR(0) SLR(1)

2021-04-27 13:55:41 字數 3090 閱讀 2338

概述:lr

分析法是一種自下而上進行規範歸約的語法分析法,

l指從左到右掃瞄輸入符號串,

r是指構造最右推導的逆過程。對大多數無二義性上下文無關文法描述的語言都可用它進行有效的分析。主要分析器有lr(

0),slr(1),

lr(1),

lalr(1

):lr(0

):在分析的每一步,只需根據當前棧頂狀態而不必向前檢視輸入符號就能確定應採取的分析動作。所能分析的lr(

0)文法要求文法的每乙個lr(

0)專案集中都不含衝突專案。

示例文法:

0s』 -> s

1s -> a

2s -> b3 a

-> aab

4 a-> c

5b -> abb

6b -> d

slr(

1):通過採用對含有衝突的專案集向前檢視乙個輸入符號的辦法來解決衝突的方法。

示例文法:

0e ->e

1e ->e + t

2e ->t

3t ->t*f

4t ->f5 f

->(e)

6f->id

一、lr

分析器由三個部分組成

(1)總控程式,也可以稱為驅動程式。對所有的

lr分析器總控程式都是相同的。

(2)分析表或分析函式,不同的文法分析表將不同,同乙個文法採用的

lr分析器不同時,分析表將不同,分析表又可以分為動作表(

action

)和狀態轉換(

goto

)表兩個部分,它們都可用二維陣列表示。

(3)分析棧,包括文法符號棧和相應的狀態棧,它們均是先進後出棧。分析器的動作就是由棧頂狀態和當前輸入符號所決定。

二、分析演算法及思路:

①、資料結構:

二維陣列action存放action表中的元素,二維陣列goto存放goto表中元素。字元陣列vt存放終結符,字元陣列vn存放非終結符。字元陣列lr存放產生式。陣列a實現狀態棧,陣列b實現符號棧。

②、演算法:

初始化,初始狀態s0在分析棧棧頂,輸入串w#的第乙個符號讀入a中。

while( action[s,a] != acc)

else if (action[s,a] == rj)

三、程式源**(slr(1))

對應文法:

0e ->e

1e ->e + t

2e ->t

3t ->t*f

4t ->f5 f

->(e)

6f->id

分析表:

狀態action

goto id

+ *( )

# et f

0 s5s41

2 31

s6

acc

2 r2 s7

r2 r2

3 r4 r4

r4 r4

4 s5

s4 8

2 3

5 r6

r6

r6 r6

6s5

s4

9 3 7

s5

s4

10 8 s6

s11

9r1

s7 r1

r1

10 r3 r3

r3 r3

11

r5 r5

r5 r5

#include

#include

char *action[12][6]=;

int goto1[12][3]=;

char vt[6]=;/*

存放終結符*/

char vn[3]=;/*

存放非終結符*/

char *lr[7]=;/*

存放產生式*/

int a[20];//

陣列a實現狀態棧

char b[20],c[20],c1;//

陣列b實現符號棧,陣列c存放輸入的字串

int top1,top2,top3,top,m,n;

void main()

while(c1!='#'); //

輸出分析結果

printf("

步驟/t狀態棧/t/t符號棧/t/t輸入串/t/taction/tgoto/n");do

printf("/t/t");

while(n<=top2)

printf("/t/t");

while(g<=top3)

printf("/t/t");

while(x!=vt[j]&&j<=5) //

獲取當前x對應j的值

j++;

if(j==5&&x!=vt[j])//

如果x不是終結符則報錯

if(action[y][j]==null)

else

strcpy(copy,action[y][j]);//

if(copy[0]=='s')

printf("/n"); }

if(copy[0]=='r')

h=copy[1]-'0';//

因為狀態從0開始

strcpy(copy1,lr[h]);

while(copy1[0]!=vn[k]) //

獲取當前k值

k++;

l=strlen(lr[h])-4;///

top1=top1-l+1;

top2=top2-l+1;

y=a[top1-1];

p=goto1[y][k];

a[top1]=p;

b[top2]=copy1[0];

z=p;

printf("/t");

printf("%d/n",p); }

}while(action[y][j]!="acc");

printf("acc/n"); }

LR 0 , SLR 1 到LR 1 語法分析詳解

今天講解lr 0 slr 1 lr 1 偽 rust實現lalr 1 我覺得實現lr 1 就夠了,lalr 1 反而是負擔 為啥要用lr語法分析器呢?ll不香嗎?幾乎所有的程式語言,只要能寫出改語言的上下文無關文法,就可以構造出相應的lr語法分析器.lr無回溯,很高效.算符優先 lr k 分析能力強...

LR 語法分析器

lr語法分析器算是基本完成了,只需要乙個文法定義檔案 syntax 就可以進行對應語言的語法分析,最後形成語法樹。詞法分析是固定的,採用c 的詞法定義。以後將加入動態的詞法分析。壓縮包中檔案的描述 lrtable.exe 是用文法定義檔案 syntax檔案 生成lr動作表檔案 action檔案 使用...

LR語法分析器程式設計

include include include include struct code val const char p const char tnt i etf lr分析表列的字元 const int m 9 0表示出錯,s4用4表示。acc用99表示 r2用 2表示 int col char 列...