㈠ 編譯原理怎麼判斷是否為slr文法
LL(1)就是向前只搜索1個符號,即與FIRST()匹配,如果FIRST為空則還要考慮FELLOW.
LR需要構造一張LR分析表,此表用於當面臨輸入字元時,將它移進,規約(即自下而上分析思想),接受還是出錯.
LR(0)找出句柄前綴,構造分析表,然後根據輸入符號進行規約.
SLR(1)使用LR(0)時若有沖突,不知道規約,移進,活移進哪一個,所以需要向前搜索,則只把有問題的地方向前搜索一次.
LR(1)1.在每個項目中增加搜索符.2.舉個列子如有A->α.Bβ,則還需將B的規則也加入.
LALR(1)就是假如兩個產生式集相同則將它們合並為一個,幾合並同心集.
㈡ 設有下列文法S→aSb|bSa|ab,試說明上述文法是否為SLR(1)文法,若是,請構造SLR(1)分析表,若不是,請說明理由
1)首先該文法無左遞歸存在,沒有公共左因子。其次:對於S→AaAb|BbBa FIRST(AaAb)={a} FIRST(BbBa)={b}
FIRST(AaAb)∩FIRST(BbBa)=Φ
所以該文法是LL(1)文法。
(2)證明該文法不是SLR的。
文法的LR(0)項目集規范族為:
I0={S』→.S S→.AaAb S→.BbBa A→. B→.}
I1={ S』→ S. }
I2={ S→A.aAb }
I3={ S→B.bBa }
I4={ S→Aa.Ab A→. }
I5={ S→Bb.Ba B→. }
I6={ S→AaA.b }
I7={ S→BbB.a }
I8={ S→AaAb. }
I9={ S→BbBa. }
考察I0:
FOLLOW(A)={a,b} FOLLOW(B)={a,b} FOLLOW(A)∩FOLLOW(B)= {a,b}
產生規約-規約沖突。
所以該文法不是SLR(1)文法。
㈢ 要證明一個文法是SLR(1)文法,但不是LL(1)文法,是不是要分SLR和LL來分析說明呢
是。
例如證明下列文法是LL(1)文法但不是SLR(1)文法
S->AaAb|BbBa A->ᵋ(空值) B->ᵋ(空值)
(1)首先該文法無左遞歸存在,沒有公共左因子.
其次:對於S→AaAb|BbBa FIRST(AaAb)={a} FIRST(BbBa)={b}
FIRST(AaAb)∩FIRST(BbBa)=Φ
所以該文法是LL(1)文法.
(2)證明該文法不是SLR的.
文法的LR(0)項目集規范族為:
I0={S』→.S S→.AaAb S→.BbBa A→. B→.}
I1={ S』→ S. }
I2={ S→A.aAb }
I3={ S→B.bBa }
I4={ S→Aa.Ab A→. }
I5={ S→Bb.Ba B→. }
I6={ S→AaA.b }
I7={ S→BbB.a }
I8={ S→AaAb. }
I9={ S→BbBa. }
考察I0:
FOLLOW(A)={a,b} FOLLOW(B)={a,b} FOLLOW(A)∩FOLLOW(B)= {a,b}
產生規約-規約沖突.
所以該文法不是SLR(1)文法.
㈣ 編譯原理用C語言實現基於LR(1)或SLR(1)語法分析程序代碼,最好還有報告,急。。。
這個是精簡的語法分析程序,如果符合的話,hi我
給你實驗報告
#include <stdio.h>
#include<dos.h>
#include<stdlib.h>
#include<string.h>
char a[50] ,b[50];
char ch;
int n1,i1=0,n=5;
int E();int T();int E1();int T1();int F();
void main() /*遞歸分析*/
{
int f,j=0;
printf("請輸入字元串(長度<50,以#號結束)\n");
do{
scanf("%c",&ch);
a[j]=ch;
j++;
}while(ch!='#');
n1=j;
ch=b[0]=a[0];
f=E();
if (f==0) return;
if (ch=='#') printf("accept\n");
else printf("error\n");
}
int E() // E→TE'
{ int f,t;
f=T();
if (f==0) return(0);
t=E1();
if (t==0) return(0);
else return(1);
}
int T() // T→FT'
{ int f,t;
f=F();
if (f==0) return(0);
t=T1();
if (t==0) return(0);
else return(1);
}
int E1()/*E』*/ // E'→+TE'
{ int f;
if(ch=='+') {
b[i1]=ch;
ch=a[++i1];
f=T();
if (f==0) return(0);
E1();
return(1);
}
return(1);
}
int T1()/*T』*/ // T'→*FT'
{
int f,t;
if(ch=='*') {
b[i1]=ch;
ch=a[++i1];
f=F();
if (f==0) return(0);
t=T1();
if (t==0) return(0);
else return(1);}
a[i1]=ch;
return(1);
}
int F() // F→(E)
{ int f;
if(ch=='(') {
b[i1]=ch;
ch=a[++i1];
f=E();
if (f==0) return(0);
if(ch==')') {
b[i1]=ch;
ch=a[++i1];
}
else {
printf("error\n");
return(0);
}
}
else if(ch=='i') {
b[i1]=ch;
ch=a[++i1];
}
else {printf("error\n");return(0);}
return(1);
}
㈤ 編譯原理
4、文法G為:
A->aABe/Ba
B->dB/ε
構造LL(1)分析表並判斷adae是否是該文法的句子。
5、文法G為:
A->i:=E;
E->E+E
E->E*E
E->i
構造SLR分析表,並判斷i:=i*i是否是該文法的句子。
6、文法G為:
S->E
E->aB/bB
A->cA/d
B->Cb/d
構造該文法的LR(0)和SLR(1)分析表,並模擬分析句子bcd時分析棧和輸入串的變化。
7、文法G為:
E->E+T/T
T->T*F/F
F->P^F/P
P->(E)/i
判斷該文法是否為算符優先文法,若是,構造優先表。
㈥ 編譯原理LR分析法中的SLR(1)分析表和LR分析過程、語法樹怎麼求
第二題和第三題拿去,剛做的:
由B->cAa|c就可知該文法不是LR(0)文法了
㈦ 如何判斷一個文法是否為SLR(1)文法
是。
例如證明下列文法是ll(1)文法但不是slr(1)文法
s->aaab|bbba
a->ᵋ(空值)
b->ᵋ(空值)
(1)首先該文法無左遞歸存在,沒有公共左因子.
其次:對於s→aaab|bbba
first(aaab)={a}
first(bbba)={b}
first(aaab)∩first(bbba)=φ
所以該文法是ll(1)文法.
(2)證明該文法不是slr的.
文法的lr(0)項目集規范族為:
i0={s』→.s
s→.aaab
s→.bbba
a→.
b→.}
i1={
s』→
s.
}
i2={
s→a.aab
}
i3={
s→b.bba
}
i4={
s→aa.ab
a→.
}
i5={
s→bb.ba
b→.
}
i6={
s→aaa.b
}
i7={
s→bbb.a
}
i8={
s→aaab.
}
i9={
s→bbba.
}
考察i0:
follow(a)={a,b}
follow(b)={a,b}
follow(a)∩follow(b)=
{a,b}
產生規約-規約沖突.
所以該文法不是slr(1)文法.