编译原理习题—LL文法构造预测分析器递归下降分析LRSLRLR分析—陈意云张昱第三版第三章
Posted 之墨_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译原理习题—LL文法构造预测分析器递归下降分析LRSLRLR分析—陈意云张昱第三版第三章相关的知识,希望对你有一定的参考价值。
编译原理第三章习题
Homework 4
3.1
3.1
3.1文法:
S
→
(
L
)
∣
a
L
→
L
,
S
∣
S
F
o
l
l
o
w
(
S
)
=
,
,
)
,
$
F
o
l
l
o
w
(
L
)
=
,
,
)
S→(L)|a\\\\ L→L,S|S\\\\ Follow(S)=\\,,),\\$\\\\\\Follow(L)=\\,,)\\
S→(L)∣aL→L,S∣SFollow(S)=,,),$Follow(L)=,,)
1
( 1 ) (1) (1)习题 3.8 3.8 3.8,其中 ( b ) (b) (b)给出递归下降语法分析程序。
3.8
:
3.8:
3.8:
(
a
)
(a)
(a)消除习题
3.1
3.1
3.1文法的左递归
消除左递归得到
S
→
(
L
)
∣
a
L
→
S
L
′
L
′
→
,
S
L
′
∣
ϵ
S→(L)|a\\\\L→SL'\\\\L'→,SL'|\\epsilon
S→(L)∣aL→SL′L′→,SL′∣ϵ
(
b
)
(b)
(b)为
(
a
)
(a)
(a)的文法构造预测分析器
F i r s t ( S ) = ( , a F i r s t ( L ) = F i r s t ( S ) = ( , a F i r s t ( L ′ ) = , , ϵ F o l l o w ( L ) = ) F o l l o w ( L ′ ) = F o l l o w ( L ) + $ = ) , $ F o l l o w ( S ) = F i r s t ( L ′ ) − ϵ + F o l l o w ( L ) + F o l l o w ( L ′ ) + $ = , , ) , $ \\beginaligned First(S)&=\\(,a\\\\\\ First(L)&=First(S)=\\(,a\\\\\\ First(L')&=\\,,\\epsilon\\\\\\ Follow(L)&=\\)\\\\\\ Follow(L')&=Follow(L)+\\\\$\\=\\),\\$\\\\\\ Follow(S)&=First(L')-\\\\epsilon\\+Follow(L)+Follow(L')+\\\\$\\=\\,,),\\$\\\\\\ \\endaligned First(S)First(L)First(L′)Follow(L)Follow(L′)Follow(S)=(,a=First(S)=(,a=,,ϵ=)=Follow(L)+$=),$=First(L′)−ϵ+Follow(L)+Follow(L′)+$=,,),$
( ( ( | ) ) ) | , , , | a a a | $ $ $ | |
---|---|---|---|---|---|
S S S | S → ( L ) S→(L) S→(L) | S → a S→a S→a | |||
L L L | L → S L ′ L→SL' L→SL′ | L → S L ′ L→SL' L→SL′ | |||
L ′ L' L′ | L ′ → ϵ L'→\\epsilon L′→ϵ | L ′ → , S L ′ L'→,SL' L′→,SL′ | L ′ → ϵ L'→\\epsilon L′→ϵ |
递归下降程序:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
const int N = 1e3;
char str[N];
int ind = 0;
void S();// S->(L)|a;
void L();// L->SX
void X();// X-> ,SX|ε
int main()
int len;
int m;
printf("请输入要分析的串:");
scanf("%s", str);
len = strlen(str);
str[len] = '#';
str[len + 1] = '\\0';
S();
if (str[ind] == '#')
printf("正确语句!\\n");
else
printf("分析失败!\\n");
return 0;
void L() // L->SX
S();
X();
void X() // X-> ,SX|ε
if (str[ind] == ',')
ind++;
S();
X();
void S() // S->(L)|a;
if (str[ind] == 'a')
ind++;
else if (str[ind] == '(')
ind++;
L();
if (str[ind] == ')')
ind++;
else
printf("分析失败!\\n");
exit(0);
else
printf("分析失败!\\n");
exit(0);
2
(
2
)
(2)
(2)习题
3.11
3.11
3.11,并描述该文法产生的语言。
3.11
3.11
3.11:
构造下面文法的
L
L
(
1
)
LL(1)
LL(1)分析表
S
→
a
B
S
∣
b
A
S
∣
ϵ
A
→
b
A
A
∣
a
B
→
a
B
B
∣
b
F
i
r
s
t
(
S
)
=
a
,
b
,
ϵ
F
i
r
s
t
(
A
)
=
a
,
b
F
i
r
s
t
(
B
)
=
a
,
b
F
o
l
l
o
w
(
S
)
=
$
F
o
l
l
o
w
(
A
)
=
a
,
b
,
$
F
o
l
l
o
w
(
B
)
=
a
,
b
,
$
S→aBS|bAS|\\epsilon\\\\ A→bAA|a\\\\ B→aBB|b\\\\ \\ \\\\ \\ \\\\ \\beginaligned First(S)&=\\a,b,\\epsilon\\\\\\ First(A)&=\\a,b\\\\\\ First(B)&=\\a,b\\\\\\ Follow(S)&=\\\\$\\\\\\ Follow(A)&=\\a,b,\\$\\\\\\ Follow(B)&=\\a,b,\\$\\\\\\ \\endaligned
S→aBS∣bAS∣ϵA→bAA∣aB→aBB∣b 以上是关于编译原理习题—LL文法构造预测分析器递归下降分析LRSLRLR分析—陈意云张昱第三版第三章的主要内容,如果未能解决你的问题,请参考以下文章