㈠ 编译原理怎么判断是否为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)文法.