编译器实现

Posted x-police

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编译器实现相关的知识,希望对你有一定的参考价值。

1.自底向上的分析

最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入,R表示生成了最右推导,而数字1则表示使用了先行的一个符号)。

1.1自底向上分析概览

自底向上的分析程序使用了显式栈来完成分析,这与非递归的自顶向下的分析程序相类似。分析栈包括记号和非终结符,以及一些后面将讨论到的其他信息。自底向上的分析开始时栈是空的,在成功分析的末尾还包括了开始符号。

自底向上的分析示意为:

  技术图片

  分析栈在左边,输入位于正中间,而分析程序的动作则在右边。

 

自底向上的分析程序有两种可能的动作(除“接受”之外):
1) 将终结符从输入的开头移进到栈的顶部。
2) 假设有BNF选择A→α,将栈顶部的串α归约为非终结符A。

因此自底向上的分析程序有时称作是移进-归约分析程序。

移进动作是由书写单词s h i f t指出的。归约动作则由书写re d u c e单词给出且指出在归约中所用的B N F选择。

另一个特征是(由于技术原因???):

  总是将文法与一个新的开始符号一同扩充 这就意味着若S是开始符号,那么就将新的开始符号S增加到文法中,同时还添加一个单元产生式到前面的开始符号中:

            S → S

 

例:

  E→ E

  E → E + n | n

  技术图片

移进-归约分析程序描绘出输入串的最右推导,但推导步骤的顺序却是颠倒的。

在表5 - 2中,相对应的推导是E’  => E => E + n =>  n + n

这样的推导中的终结符和非终结符的每个中间串都称作右句型。

 

句柄:(参考:https://blog.csdn.net/it_dream_er/article/details/53612006

  直接短语中的最左直接短语为该句型的句柄

  移进-归约分析程序将终结符从输入移进到栈直到它能执行一个归约以得到下一个右句子格式。它发生在位于栈顶部的符号串匹配用于下一个归约的产生式的右边。这个串、它在右句子格式中发生的位置以及用来归约它的产生式被称作右句型的句柄(handle) 。

例如,在右句子格式n + n 中,它的句柄是由最左边的单个记号n 与用来归约它以产生新的右句型E + n的产生式E→n 组成的串。这个新句型的句柄是整个串E + n (一个可行的前缀)以及产生式E→E + n。有时由于表示法上的弊端,我们要用串本身来作为句柄。

判断分析中的下一个句柄是移进-归约分析程序的主要任务。

 

1.2 LR(0)项的有穷自动机与LR(0)分析

1.3 LR(0)项

 

以上是关于编译器实现的主要内容,如果未能解决你的问题,请参考以下文章

实现一个简易编译器

编译器实现

实现一个简单的编译器

模板实现和编译器

“编译器有助于实现 C 标准”是啥意思?

如何实现一个简易编译器