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