編譯原理 基於LR分析表編寫語法分析器

2021-10-14 08:39:48 字數 4006 閱讀 4320

【問題描述】已知文法g[e]:

e → e + t | t

t → (e) | id | id[e]

設計lr分析表,並用c++語言編寫語法分析器。

【輸入形式】乙個句子

【輸出形式】句子語法結構正確,輸出「syntax analysis is right」反之輸出「error on syntax analysis」

【樣例輸入】a1+a2

【樣例輸出】syntax analysis is right

【樣例說明】

【評分標準】根據通過的測試資料個數評分

0x01 畫出lr(0)專案集規範族

i1,i4存在移入規約衝突

且對於i1:

∩ follow(s) = ∩ = $ \emptyset $

對於i4:

∩ follow(t) = ∩ follow(e) = ∩ = $ \emptyset $

所以,適用slr(1)文法

0x02 做出slr分析表

action

goto+(

)id#et0

s3s412

1s5acc2

r2r2

r2r23s3

s4624

r4r4

s7r4r45

s3s486

s5s97s3

s41028

r1r1

r1r19r3

r3r3

r310

s5s11

11r5

r5r5

r5對於產生式:

0、s -> e

1、e -> e+t

2、e ->t

3、t ->(e)

4、t ->id

5、t ->id[e]

進行**編寫模擬分析過程:

#include

#include

#include

#include

#include

#include

using

namespace std;

//action 表

vector action[12]

;void

initial_action_table()

} action[0]

[1]=

"s3"

;action[0]

[5]=

"s4"

; action[1]

[0]=

"s5"

;action[1]

[6]=

"acc"

; action[2]

[0]=

"r2"

;action[2]

[2]=

"r2"

;action[2]

[4]=

"r2"

;action[2]

[6]=

"r2"

; action[3]

[1]=

"s3"

;action[3]

[5]=

"s4"

; action[4]

[0]=

"r4"

;action[4]

[2]=

"r4"

;action[4]

[3]=

"s7"

;action[4]

[4]=

"s7"

;action[4]

[4]=

"r4"

;action[4]

[6]=

"r4"

; action[5]

[1]=

"s3"

;action[5]

[5]=

"s4"

; action[6]

[0]=

"s5"

;action[6]

[2]=

"s9"

; action[7]

[1]=

"s3"

;action[7]

[5]=

"s4"

; action[8]

[0]=

"r1"

;action[8]

[2]=

"r1"

;action[8]

[4]=

"r1"

;action[8]

[6]=

"r1"

; action[9]

[0]=

"r3"

;action[9]

[2]=

"r3"

;action[9]

[4]=

"r3"

;action[9]

[6]=

"r3"

; action[10]

[0]=

"s5"

;action[10]

[4]=

"s11"

; action[11]

[0]=

"r5"

;action[11]

[2]=

"r5"

;action[11]

[4]=

"r5"

;action[11]

[6]=

"r5";}

//goto表

int goto[12]

[2]=

;//vt、vn

vector<

char

> vn =

;vector<

char

> vt =;/*

我們需要表達用

1、表示式左部 進行歸約

2、表示式右部的長度用於出棧

對產生式進行編號:

0、s -> e

1、e -> e+t

2、e ->t

3、t ->(e)

4、t ->id

5、t ->id[e]

*/struct production

;production pro[6]

=,,,

,,};

//狀態棧

stack<

int> state;

//符號棧

queue<

char

> symbol;

void

initial_queue()

;while

((ch =

getchar()

)!=eof)

} symbol.

push

('#');

}int

main()

while(1

) state.

push

(nextstate)

; symbol.

pop();

}if(str[0]

=='r'

)int popnum = pro[pro_index]

.length;

char vt = pro[pro_index]

.vt;

//出棧

for(

int i =

0;i < popnum;i ++

)//goto 查出棧後的狀態的goto表

if(vt ==

'e')

else}if

(str[0]

=='a')if

(str[0]

=='n')}

}

編譯原理 語法分析3 LR分析器

語法分析,lr分析器 import pandas as pd data slr pd.dataframe data,index 0 1 2 3 4 5 6 7 8 9 10 11 slr分析表 grammer e e t e t t t f t f f e f id 文法的各個產生式 stk 0 用...

編譯原理 LR分析(主要是LR(0)分析)

lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...

編譯原理 LR分析(主要是LR(0)分析)

lr方法的基本思想就是,在規範歸約的過程中,一方面要記住已移進和歸約出的整個字串,也就是說要記住歷史 一方面能夠根據所用的產生式的推測未來可能碰到的輸入符號,也就是說能夠對未來進行展望。這樣,當一串貌似控制代碼的字串出現在分析棧的頂部時,我們希望能夠根據歷史和展望以及現實的輸入符號這三部分的材料,決...