📜  编译器理论|套装1

📅  最后修改于: 2021-06-28 07:39:13             🧑  作者: Mango

GATE CS考试中提出了以下问题。

1.自上而下的解析器在解析输入字符串使用以下哪些派生?假定以从左到右的顺序扫描输入(GATE CS 2000)。
(a)最左派生
(b)反向追溯最左边的推导
(c)最右派生
(d)反向追溯最右边的推导

答案(一)

自上而下的解析(LL)
在自上而下的解析中,我们仅从开始符号开始,然后将不同作品的右侧与第一个输入内容进行比较,以查看应使用哪个作品。

自上而下的解析器称为LL解析器,因为它解析从L eft到右的输入,并构造该句子的L eftmost派生。

算法(自顶向下解析)

a) In the current string, choose leftmost nonterminal.
  b) Choose a production for the chosen nonterminal. 
  c) In the string, replace the nonterminal by the right-hand-side 
     of the rule.
  d) Repeat until no more nonterminals. 

LL语法通常按数字分类,例如LL(1),LL(0)等。括号中的数字表示在语法中的任何一点上一次选择正确的生成词时,我们可能必须查看的最大终端数。

LL(1)是最常见(也是最有用)的LL语法,您可以随时在任何给定时间仅查看输入中的第一个终端,从而始终选择正确的生成。使用LL(2),您必须查看两个符号,依此类推。对于任何固定的k值,都存在根本不是LL(k)语法的语法,可悲的是它们很普遍。

让我们看一个自下而上的语法解析示例。令输入字符串为ax。

S -> Ax
    A -> a
    A -> b

LL(1)解析器以S开头,并询问“我应尝试哪种生产?”自然地,它预测S的唯一选择。从那里开始,它通过调用方法A(在递归下降解析器中)尝试匹配A。前瞻性预测产量

A -> a

解析器匹配a,返回到S并匹配x。完毕。派生树为:

S
    / \
   A   x
   |
   a

参考:
http://www.garshol.priv.no/download/text/bnf.html
http://en.wikipedia.org/wiki/Top-down_parsing
http://en.wikipedia.org/wiki/LL_parser

2.将加载地址分配给程序的各个部分,并调整程序中的代码和数据以反映分配的地址的过程称为(GATE CS 2001)。

a)组装
b)解析
c)搬迁
d)符号解析

答案:(c)
重定位是在运行程序之前用内存中的实际可用地址替换符号引用或库名称的过程。尽管它可以在运行时由重定位加载器完成,但通常由链接器在编译期间(在编译时)完成。编译器或汇编器通常生成以零作为最低起始地址的可执行文件。在执行目标代码之前,应调整这些地址,以便它们表示正确的运行时地址。

重定位通常分两个步骤完成:
1.每个目标代码都有不同的部分,如代码,数据,.bss等。要将所有对象组合到一个可执行文件中,链接器会将相似类型的所有部分合并到该类型的单个部分中。然后,链接器将运行时地址分配给每个部分和每个符号。此时,代码(函数)和数据(全局变量)将具有唯一的运行时地址。
2.每个部分都引用一个或多个符号,应对其进行修改,以使其指向正确的运行时地址。

参考:
http://en.wikipedia.org/wiki/Relocation_(computer_science)
3.以下哪项陈述是错误的? (GATE CS 2001)
a)明确的语法具有相同的最左和最右派生
b)LL(1)解析器是自上而下的解析器
c)LALR比SLR更强大
d)对于任何k,模棱两可的语法永远不会是LR(k)

答案:(a)
如果一种语法具有多个针对单个句子形式的最左(或最右)派生,则该语法是模棱两可的。句子形式的最左和最右派生可能会有所不同,即使在语法清晰的情况下也是如此。

4.以下哪些语法规则违反了运算符语法的要求? P,Q,R是非末端,而r,s,t是末端(GATE CS 2004)。
(i)P-> QR
(ii)P-> QsR
(iii)P->ε
(iV)P-> QtRr

仅a)(i)
b)仅(i)和(iii)
c)仅(ii)和(iii)
d)仅(iii)和(iv)

答案:(b)
解释:
运算符优先级解析器是一种自下而上的解析器,用于解释运算符优先级语法。例如,大多数计算器使用运算符优先级解析器将具有操作顺序格式的人类可读的前缀表示法转换为内部优化的计算机可读格式,例如反向波兰语表示法(RPN)。

运算符优先级语法是一种上下文无关的语法,可以使用运算符优先级解析器进行解析。它具有以下特性:没有产品的右侧有一个空的(ε)或右侧有两个相邻的非末端。这些属性允许通过优先级关系描述语法的末尾,并且利用该关系的解析器比诸如LALR解析器之类的通用解析器要简单得多。

参考:

http://en.wikipedia.org/wiki/Operator-precedence_grammar
http://en.wikipedia.org/wiki/Operator-precedence_parser


5.考虑具有以下翻译规则的语法,并以E作为开始符号。
E-> E1 #T {E.value = E1.value * T.value}
| T {E.value = T.value}
T-> T1&F {T.value = T1.value + F.value}
| F {T.value = F.value}
F-> num {F.value = num.value}

计算以下表达式的解析树的根的E.value:2#3&5#6&4。 (GATE CS 2004)

a)200
b)180
c)160
d)40

答案:(c)
解释:
我们可以通过为表达式2#3&5#6&4构造解析树来计算值。

另外,我们可以通过考虑以下优先级和关联性规则进行计算。
语法中的优先级通过确保具有较高优先级运算符产生式规则永远不会产生与运算符的表达与低优先级执行。
在给定的语法中,“&”的优先级高于“#”。

通过确保对于语法中的S-> S1 * S2之类的生产规则,S2永远不会产生带有*的表达式,从而增强了语法中运算符*的左联想性。另一方面,为了确保正确的关联性,S1永远不要产生带有*的表达式。
在给定的语法中,“#”和&都是左关联的。

因此表达式2#3&5#6&4将变为
(((2#(3&5))#(6&4))
让我们应用翻译规则,我们得到
((2 *(3 + 5))*(6 + 4))= 160。