编译原理的最左素短语
① 谁能够解释下编译原理中什么是FIRSTVT,和LASTVT,尽量浅显易懂点谢谢
给你COPY一个看管用不,虽然不懂你在问什么...
算符优先分析 [上一节] [下一节]
5.2.1 算符优先文法及其优先表构造
一个文法,如果它的任一产生式的右部都不含两个相继(并列)的非终结符,即不含如下形式的产生式右部:
…QR…
则我们称该文法为算符文法。
在后面的定义中,a、b代表任意终结符;P、Q、R代表任意非终结符;‘…’代表由终结符和非终结符组成的任意序列,包括空字。
假定G是一个不含e-产生式的算符文法。对于任何一对终结符a、b,我们说:
1. a�6�7b当且仅当文法G中含有形如P→…ab…或P→…aQb…的产生式;
2. a�6�3b当且仅当G中含有形如P→…aR…的产生式,而Rb…或RQb…;
3. a�6�4b当且仅当G中含有形如P→…Rb…的产生式,而R…a或R…aQ。
如果一个算符文法G中的任何终结符对(a,b)至多只满足下述三关系之一:
a�6�7b,a�6�3b, a�6�4b
则称G是一个算符优先文法。
现在来研究从算符优先文法G构造优先关系表的算法。
通过检查G的每个产生式的每个候选式,可找出所有满足a�6�7b的终结符对。为了找出所有满足关系�6�3和�6�4的终结符对,我们首先需要对G的每个非终结符P构造两个集合FIRSTVT(P)和LASTVT(P):
FIRSTVT(P)={a | Pa…或PQa…,a�0�2VT而Q�0�2VN}
LASTVT(P)={a | P…a或P…aQ,a�0�2VT而Q�0�2VN}
5.2.2 算符优先分析算法
所谓素短语是指这样的一个短语,它至少含有一个终结符,并且,除它自身之外不再含任何更小的素短语。所谓最左素短语是指处于句型最左边的那个素短语。如上例,P*P和i是句型P*P+i的素短语,而P*P是它的最左素短语。
现在考虑算符优先文法,我们把句型(括在两个#之间)的一般形式写成:
#N1a1N2a2…NnanNn+1# (5.4)
其中,每个ai都是终结符,Ni是可有可无的非终结符。换言之,句型中含有n个终结符,任何两个终结符之间顶多只有一个非终结符。必须记住,任何算符文法的句型都具有这种形式。我们可以证明如下定理(证明留给有兴趣的读者作练习):
一个算符优先文法G的任何句型(5.4)的最左素短语是满足如下条件的最左子串Njaj…NiaiNi+1,
aj-1�6�3aj
aj�6�7 aj+1,…,ai-1�6�7ai
ai�6�4ai+1
根据这个定理,下面我们讨论算符优先分析算法。为了和定理的叙述相适应,我们现在仅使用一个符号栈S,既用它寄存终结符,也用它寄存非终结符。下面的分析算法是直接根据这个定理构造出来的,其中k代表符号栈S的使用深度。
5.2.3 优先函数
在实际实现算符优先分析算法时,一般不用表5.1这样的优先表,而是用两个优先函数f和g。我们把每个终结符q与两个自然数f(q)和g(q)相对应,使得
若q1�6�3q2 则 f(q1)<g(q2)
若q1�6�7q2 则 f(q1)= g(q2) (5.5)
若q1�6�4q2 则 f(q1)>g(q2)
函数f称为入栈优先函数,g称为比较优先函数。使用优先函数有两方面的优点:便于作比较运算,并且节省存储空间,因为优先关系表占用的存储量比较大。其缺点是,原先不存在优先关系的两个终结符,由于与自然数相对应,变成可比较的了。因而,可能会掩盖输入串的某些错误。但是,我们可以通过检查栈顶符号q和输入符号a的具体内容来发现那些原先不可比较的情形。
如果优先函数存在,那么,从优先表构造优先函数的一个简单方法是:
1. 对于每个终结符a(包括#)令其对应两个符号fa和ga,画一张以所有符号fa和ga为结点的方向图,如果a �6�4�6�7b,那么,就从fa画一箭弧至gb;如果a�6�3�6�7b,就画一条从gb到fa的箭弧。
② (高分)编译原理的题,求高手,在线等,急急急!!!!!!
太多了,大概看了下考点:
若源程序是用高级语言编写的,目标程序是 机器语言程序或汇编程序 ,则其翻译程序称为编译程序.
何谓优化?按所涉及的程序范围可分为哪几级优化?
答:优化:对程序进行各种等价变换,使得从变换后的程序出发,能产生更有效的目标代码。
三种级别:局部优化、循环优化、全局优化。
简述常用的优化技术有哪些?
答:编译程序中常用的优化技术有:
(1) 删除公共子表示式;
(2) 复写传播;
(3) 删除无用代码;
(4) 代码外提;
(5) 强度削弱;
(6) 删除归纳变量;
(7) 合并常量。
一个句型中的最左 B 称为该句型的句柄。
可选项有:
A. 短语 B. 简单短语 C. 素短语 D. 终结符号
.递归下降法不允许任一非终极符是直接 左 递归的。
简单优先方法每次归约当前句型的 句柄 ,算符优先方法每次归约当前句型的 最左素短语 ,二者都是不断移进输入符号,直到符号栈顶出现 可归约串 的尾,再向前找到 可归约串 的头,然后归约。
算符优先文法——设有一不含ε产生式的算符文法G,如果对任意两个终结符对a,b之间至多只有 、 和 三种关系中的一种成立,则称G是一个算符优先文法。
常用的中间语言种类有哪几种?
答:有逆波兰式、三地址代码、抽象语法树和DAG。
③ 编译原理-句型、句子、短语、直接短语、句柄、素短语、最左素短语
在进行语法分析的时候,有时候会对这些词语的概念不清晰,这里我们就详细归纳总结一下。
可以看出这个里面,最需要理解的概念就是短语,其他大部分概念都是在短语基础上延伸的,从概念上可以看出:
假设有一个文法
针对文法的一个特定句型 (Sd(T)db) , 其推导过程如下:
这个句型 (Sd(T)db) 对应的 CFG 分析树如下:
那个这个句型 (Sd(T)db) 有多少个短语呢?
还记得短语的定义么, S ⇒* αβδ , αβδ 代表句型就是这里的 (Sd(T)db) 。
因此这个句型 (Sd(T)db) :
算法非常简单,就是通过分析树的后序遍历,先将子树的叶节点从左到右排合并成字符串(即一个短语),然后用它代表子树的根节点的值,再和与子树根节点同一层节点值合并,得到新的短语。就这样从分析树的最底层,一路合并到分析树的根节点,就能得到所有的短语了。
通过递归的方法,获取短语列表 phraseList , 直接短语列表 directPhraseList 和 素短语列表 plainPhraseList 。
运行结果: