导航:首页 > 源码编译 > 编译原理输入串对应语法树怎么求

编译原理输入串对应语法树怎么求

发布时间:2023-03-27 12:24:46

‘壹’ 编译原理问题,高手进。

回答下列问题:(30分)
(6分)对于下面程序段
program test (input, output)
var i, j: integer;
procere CAL(x, y: integer);
begin
y:=y*y; x:=x-y; y:=y-x
end;
begin
i:=2; j:=3; CAL(i, j)
writeln(j)
end.
若参数传递的方法分别为(1)传值、(2)传地址,(3)传名,请写出程序执行的输出结果。
答: (1) 3 (2) 16 (3) 16 (每个值2分)

(6分)计算文法G(M)的每个非终结符的FIRST和FOLLOW集合,并判断该文法是否是LL(1)的,请说明理由。
G(M):
M → TB
T → Ba |
B → Db | eT |
D → d |

解答:
计算文法的FIRST和FOLLOW集合:(4分)
FIRST(M) = { a,b,e,d, } FIRST(T) = { a,b,e,d, }
FIRST(B) = {b,e,d, } FIRST(D) = {d,}
FOLLOW (M) = {#} FOLLOW (T) = { a,b,e,d,#}
FOLLOW (B) = {a,# } FOLLOW (D) = { b}

检查文法的所有产生式,我们可以得到:
1. 该文法不含左递归,
2. 该文法中每一个非终结符M,T,B,D的各个产生式的候选首符集两两不相交。
3. 该文法的非终结符T、B和D,它们都有候选式,而且
FIRST(T)∩FOLLOW(T)={ a,b,e,d }≠
所以该文法不是LL(1)文法。(2分)

(4分)考虑下面的属性文法
产 生 式 语 义 规 则
S→ABC

A→a
B→b
C→c B.u := S.u
A.u := B.v + C.v
S.v := A.v
A.v :=3*A.u
B.v := B.u
C.v := 1
画出字符串abc的语法树;
对于该语法树,假设S.u的初始值为5,属性计算完成后,S.v的值为多少。
答:(1) (2分)

(2) S.v的值为18 (2分)

(4分)运行时的DISPLAY表的内容是什么?它的作用是什么?
答:DISPLAY表是嵌套层次显示表。每当进入一个过程后,在建立它的活动记录区的同时建立一张嵌套层次显示表diaplay.假定现在进入的过程层次为i,则它的diaplay表含有i+1个单元,自顶向下每个单元依次存放着现行层、直接外层、…、直至最外层(主程序,0层)等每层过程的最新活动记录的起始地址。通过DISPLAY表可以访问其外层过程的变量。

(5分)对下列四元式序列生成目标代码:
A:=B*C
D:=E+A
G:=B+C
H:=G*D
其中,H在基本块出口之后是活跃变量, R0和R1是可用寄存器。
答: 目标代码序列
LD R0 B
MUL R0 C
LD R1 E
ADD R1 R0
LD R0 B
ADD R0 C
MUL R0 R1
ST R0 H

(5分)写出表达式a+b*(c-d)对应的逆波兰式、三元式序列和抽象语法树。
答:
逆波兰式:(abcd-*+) (1分)
三元式序列: (2分)
OP ARG1 ARG2
(1) - c d
(2) * b (1)
(3) + a (2)
抽象语法树:(2分)

(8分)构造一个DFA,它接受={a,b}上所有包含ab的字符串。
答:
(2分)构造相应的正规式:(a|b)*ab(a|b)*

(3分)
a a

a b
b b

(3分)确定化:
I
{0,1,2} {1,2,3} {1,2}
{1,2,3} {1,2,3} {1,2,4,5,6}
{1,2} {1,2,3} {1,2}
{1,2,4,5,6} {1,2,3,5,6} {1,2,5,6}
{1,2,3,5,6} {1,2,3,5,6} {1,2,4,5,6}
{1,2,5,6} {1,2,3,5,6} {1,2,5,6}
b b
b a
a a a a

a b b
b

最小化:
{0,1,2} {3,4,5}
{0, 2},1, {3,4,5}

(6分)写一个文法使其语言为L(G)={anbncm| m,n≥1,n为奇数,m为偶数}。
答:
文法G(S):

(8分)对于文法G(S):

1. 写出句型b(Ma)b的最右推导并画出语法树。
2. 写出上述句型的短语,直接短语和句柄。
答:
1. (4分)

2. (4分)
短语: Ma), (Ma), b(Ma)b
直接短语: Ma)
句柄: Ma)

(12分)对文法G(S):
S → a | ^ | (T)
T → T,S | S
(1) 构造各非终结符的FIRSTVT和LASTVT集合;
(2) 构造算符优先表;
(3) 是算符优先文法吗?
(4) 构造优先函数。
答:
(1) (4分)

(2) (4分)
a ^ ( ) ,
a > >
^ > >
( < < < = <
) > >
, < < < > >

(3) 是算符优先文法,因为任何两个终结符之间至多只有一种优先关系。 (1分)

(4) 优先函数(3分)
a ^ ( ) ,
F 4 4 2 4 4
G 5 5 5 2 3

(8分)设某语言的do-while语句的语法形式为
S do S(1) While E
其语义解释为:

针对自下而上的语法分析器,按如下要求构造该语句的翻译模式,将该语句翻译成四元式:
(1) 写出适合语法制导翻译的产生式;
(2) 写出每个产生式对应的语义动作。
答:(1). 适合语法制导翻译的文法(4分)
G(S):
R do
UR S(1) While
SU E
(2). (4分)
R do
{ R.QUAD:=NXQ }

UR S(1) While
{ U.QUAD:=R.QUAD;
BACKPATCH(S.CHAIN, NXQ) }

SU E
{ BACKPATCH(E.TC, U.QUAD);
S.CHAIN:=E.FC }

答案二:
(1) S do M1 S(1) While M2 E
M ε (4分)
(2) M ε { M.QUAD := NXQ } (4分)
S do M1 S(1) While M2 E
{
BACKPATCH(S(1).CHAIN, M2.QUAD);
BACKPATCH(E.TC, M1.QUAD);
S.CHAIN:=E. FC
}

(10分)将语句
while C>0 do if A B=0 then C:=C+D else C:=C*D
翻译成四元式。
答:
100 (j>, C, 0, 102)
101 (j, -, -, 112)
102 (jnz, A, -, 106)
103 (j, -, -, 104)
104 (j=, B, 0, 106)
105 (j, -, -, 109)
106 (+, C, D, T1)
107 (:=, T1, -, C)
108 (j, -, -, 100)
109 (*, C, D, T2)
110 (:=, T2, -, C)
111 (j, -, -, 100)
112

(10分)设有基本块如下:
T1:=3
T2:=A*B
T3:=9+T1
M:=A*B
T4:=C-D
L:=T3*T4
T2:=C+D
N:=T2
画出DAG图;
设L,M,N 是出基本块后的活跃变量,请给出优化后的四元式序列。
答:

1. (6分)
L

*
T2,M T4 T2,N

* - +

T1 T3
3 A B 12 C D

2. (4分)
M:=A*B
S1:=C-D
L:=12*S1
N:=C+D

(8分)文法G(S)及其LR分析表如下,请给出串baba#的分析过程。
(1) S → DbB (2) D → d (3) D → ε
(4) B → a (5) B → Bba (6) B → ε
LR分析表
ACTION GOTO
b D a # S B D
0 r3 s3 1 2
1 acc
2 s4
3 r2
4 r6 S5 r6 6
5 r4 r4
6 s7 r1
7 S8
8 r5 r5
解答:
步骤 状态 符号 输入串
0 0 # baba#
1 02 #D baba#
2 024 #Db aba#
3 0245 #Dba ba#
4 0246 #DbB ba#
5 02467 #DbBb a#
6 024678 #DbBba #
7 0246 #DbB #
8 01 #S # acc
哈哈,估计认识!!

‘贰’ 编译原理设计题目8——SLR(1)分析法

以前做过的不过昨天因为毕业了把机子上了一些资料也删除了
1刚好这个也在里面。。。。。。。。。

‘叁’ 编译原理问题,求解决

去问下医生是怎么回事吧

‘肆’ 编译原理 文法二义性 语法树

标准答案,请给分!

‘伍’ 编译原理LR分析法中的SLR(1)分析表和LR分析过程、语法树怎么求

第二题和第三题拿去,刚做的:


由B->cAa|c就可知该文法不是LR(0)文法了


‘陆’ 编译原理笔记9:语法分析树、语法树、二义性的消除

语法分析树和语法树不是一种东西 。习惯上,我们把前者叫做“具体语法树”,其能够体现推导的过程;后者叫做“抽象语法树”,其不体现过程,只关心最后的结果。

语法分析树是语言推导过程的图形化表示方法。这种表示方法反映了语言的实质以及语言的推导过程。

定义:对于 CFG G 的句型,分析树被定义为具有下述性质的一棵树:

推导,有最左推导和最右推导,这两种推导方式在推导过程中的分析树可能不同,但因最终得到的句子是相同的,所以最终的分析树是一样的。

分析树能反映句型的推导过程,也能反映句型的结构。然而实际上,我们往往不关心推导的过程,而只关心推导的结果。因此,我们要对 分析树 进行改造,得到 语法树 。语法树中全是终结符,没有非终结符。而且语法树中没有括号

定义:

说白了,语法树这玩意,就一句话: 叶子全是操作数,内部全是操作符 ,树里没有非终结符也不能有括号。

语法树要表达的东西,是操作符(运算)作用于操作数(运算对象)

举俩例子吧:

【例】: -(id+id) 的语法树:

【例】:-id+id 的语法树:

显然,我们从上面这两个语法树中,直接就能观察出来它们的运算顺序。

【例】:句型 if C then s1 else s2

二义性问题:一个句子可能对应多于一棵语法树。

【例】: 设文法 G: E → E+E | E*E | (E) | -E | id

则,句子 id+id*id、id+id+id 可能的分析树有:

在该例中,虽然 id+id+id 的 “+” 的结合性无论左右都不会影响结果。但万一,万一“+”的含义变成了“减法”,那么左结合和右结合就会引起很大的问题了。

我们在这里讲的“二义性”的“义”并非语义——我们现在在学习的内容是“语法分析器”,尚未到需要研究语言背后含义的阶段。

我们现在讲的“二义性”指的是一个句子对应多种分析树。

二义性的体现,是文法对同一句子有不止一棵分析树。这种问题由【句子产生过程中的某些推导有多于一种选择】引起。悬空 else 问题就可以很好地体现这种【超过一种选择】带来的二义性问题,示例如下。

看下面这么个例子。。

(其实,我感觉这个其实比较像是“说话大喘气”带来的理解歧义问题。。。)上面的产生式中并没体现出来该咋算分一块,所以两种完全不同的句子结构都是合法的。

二义性问题是有救的,大概有以下这三种办法:

这些办法的核心,其实都是将优先级和结合性说明白。

核心:把优先级和结合性说明白

既然要说明白,那就不能让一个非终结符可以直接在当次推导中能推出会带来优先级和结合性歧义的东西。(对分析树的一个内部节点,不会有出现在其下面的分支是相同的非终结符的情况。如果有得选,那就有得歧义了。没得选才能确定地一路走到黑)

改写为非二义文法的二义文法大概有下面这几个特点:

改写的关键步骤:

【例】改写下面的二义文法为非二义文法。图右侧是要达成的优先级和结合性

改写的核心其实就两句话:

所以能够得到非终结符与运算的对应关系(因为不同的运算有不同的优先级,我们想要引入多个优先级就要引入多个新的非终结符。这样每个非终结符就可以负责一个优先级的运算符号,也就是说新的非终结符是与运算有关系的了。因此这里搞出来了“对应关系”四个字)如下:

优先级由低到高分别是 +、 、-,而距离开始符号越近,优先级越低。因此在这里的排序也可以+ -顺序。每个符号对应一层的非终结符。根据所需要的结合性,则可确定是左递归还是右递归,以确定新的产生式长什么样子

【例】:规定优先级和结合性,写出改写的非二义文法

我们已经掌握了一种叫做【改写】的工具,能让我们消除二义性。接下来我们就要用这个工具来尝试搞搞悬空 else 问题!

悬空 else 问题出现的原因是 then 数量多于 else,让 else 有多个可以结合的 then。在二义文法中,由于选哪两个 then、else 配对都可以,故会引起出现二义的情况。在这里,我们规定 else 右结合,即与左边最靠近的 then 结合。

为改写此文法,可以将 S 分为完全匹配(MS)和不完全匹配(UMS)两类。在 MS 中体现 then、else 个数相等即匹配且右结合;在UMS 中 then、else 不匹配,体现 else 右结合。

【例】:用改写后的文法写一个条件语句

经过检查,无法再根据文法写出其他分析树,故已经消除了二义性

虽然二义文法会导致二义性,但是其并非一无是处。其有两个显着的优点:

在 Yacc 中,我们可以直接指定优先级、结合性而无需自己重写文法。

left 表示左结合,right 表示右结合。越往下的算符优先级越高。

嗯就这么简单。。。

我们其实可以把语言本身定义成没有优先级和结合性的。。然后所有的优先、结合都交由括号进行控制,哪个先算就加括号。把一个过程的结束用明确的标志标记出来。

比如在 Ada 中:

在 Pascal 中,给表达式加括号:

‘柒’ 如何由文法推导语法树(编译原理)

语法树,是针对上下文无关文法,用来表示一个句型的生成过程的一种描述手段。

对于给定的句型,依据文法构造它的语法树,是语法分析的任务。
编译原理课程中重点学习的各种语法分析方法,都是解决语法树的构造的具体分析方法。

在学习并掌握各种语法分析方法之前,一般只能依据直觉印象,通过猜测、拼凑等手段,去试着推演,凑出符合要求的句型的语法树。所以这个阶段练习用的题目一般也不很复杂,通过多多练习也能找到一些技巧(其实主要是后面将要学习的自顶向下语法分析中的一些原则)。

对于给定的文法,有一些句型可能能构建出两棵甚至多棵结构不同的语法树,结果不一定是唯一的。这样的文法就是所谓的二义性文法。
对于非二义性文法而言,任意一个句型的语法树都是唯一的。

‘捌’ 编译原理有关语法的题

短语:E+F*(E+i),F*(E+i),(E+i),E+i,i

直接短语:i(能直接推出来的)

句柄:i(最左直接短语)

素短语:i(并且至少含有一个终结符并除自身之外不含任何更小的素短语)

这些你根据语法树看,就比较好找了啊~

语法树如图:

‘玖’ 编译原理实现判断是不是一个文法的句子

构造LL(1)语法分析程序,任意输入一个文法符号串,并判断它是否为文法的一个句子。程序要求为该文法构造预测分析表,并按照预测分析算法对输入串进行语法分析,判别程序是否符合已知的语法规则,如果不符合(编译出错),则输出错误信息。

阅读全文

与编译原理输入串对应语法树怎么求相关的资料

热点内容
程序员东北大学 浏览:426
编译忽略空字符 浏览:117
多店铺阿里云服务器教程 浏览:378
单片机求初值 浏览:420
安卓机如何在电脑备份图片 浏览:925
ca证书加密机价格 浏览:798
天干地支年份算法 浏览:796
程序员打造的视频 浏览:7
java和php通信 浏览:680
为什么黑程序员 浏览:163
程序员男生 浏览:456
戴尔文件夹内文件怎么置顶 浏览:582
云服务器6m网速 浏览:722
vivo手机中国联通服务器地址 浏览:862
工程总控编译失败 浏览:707
燕赵红枫app如何下载 浏览:867
php查杀软件 浏览:878
教育管理学pdf 浏览:547
服务器均衡怎么使用 浏览:626
linux中jps 浏览:954