编译原理
yolosliu
那些寂寞的岁月,成全最美的人生!
展开
-
编译原理(一) Chomsky文法的判断方法及C++代码实现
一、明确定义0型文法:对任一产生式α→β,都有α∈(VN∪VT)+, β∈(VN∪VT)*1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 α→ε除外2型文法:对任一产生式α→β,都有α∈VN , β∈(VN∪VT)*3型文法:任一产生式α→β的形式都为A→aB或A→a,其中A∈VN,B∈VN,a∈VT。上述叫做右线性文法,另有左线性文法,二者等价。二、基本思路转载 2017-07-02 09:11:37 · 1455 阅读 · 0 评论 -
编译原理(九) LR(0)文法分析法(算法描述和C++代码实现)
概念梳理最左推导:每一步替换最左边的非终结符 最右推导:每一步替换最右边的非终结符,最右推导称为规范推导 短语:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有S⇒∗αAδ且A⇒+β则称 β是相对于非终结符A的, 句型αβδ的短语。 直接短语:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有S⇒∗αAδ且A⇒β转载 2017-07-02 09:25:03 · 7233 阅读 · 4 评论 -
编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
算法描述算符优先关系主要用于界定右句型的句柄:标记句柄的左端; =出现在句柄的内部; >标记句柄的右端。发现句柄的过程:从左端开始扫描串,直到遇到第一个>为止。向左扫描,跳过所有的=,直到遇到一个句柄包括从上一步遇到的左部之间的所有符号,包括介于期间或者两边的非终结符非终结符的处理: 因为非终结符不能影响语法分析,所以不需要区分它们,于是只用转载 2017-07-02 09:23:15 · 3138 阅读 · 1 评论 -
编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
概念简述移动归约分析法:自底向上的语法分析方法,也称为移动归约分析法。最易于实现的一种移动归约分析方法,叫做算符优先分析法,而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语法分析器的生成器。短语:文法G[S],αβδ是文法G的一个句型,S=>*αAδ且A=>+β则称β是句型αβδ相对于非终结符A的短语。 直接短语:若有A ⇒+β则称β是句型αβδ相对于该转载 2017-07-02 09:21:29 · 2075 阅读 · 0 评论 -
编译原理(六) LL(1)文法分析法(分析过程的C++实现)
算法分析预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a行事的。如下图所示,对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:若X = a = ‘#’,则宣布分析成功,停止分析过程。若X = a ≠‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。若X是一个非终结符,则查看分析表M。 若M[X,a]中存放着关于X的一个产生式转载 2017-07-02 09:19:44 · 1774 阅读 · 3 评论 -
编译原理(五) LL(1)文法分析法(预测分析表的构造算法C++实现)
基本定义FIRST(α): 令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为: FIRST(α)={a | α=>*a…, a∈VT}若α=>*ε,则规定ε∈FIRST(α)FIRST(α)是α的所有可能推导的开头终结符或可能的ε如果非终结符A的所有候选首符集两两不相交,即A的任何两个不同候选αi和αj FIRST(αi) ∩F转载 2017-07-02 09:17:47 · 4435 阅读 · 0 评论 -
编译原理(四) 提取左因子法消除回溯
概念简述回溯:分析工作部分地或全部地退回到之前的一个阶段,在当前阶段采取与之前不同的决策重新推进工作 FIRST(α):令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:FIRST(α)={a | α=>*a…, a∈VT}若α=>*ε,则规定ε∈FIRST(α)FIRST(α)是α的所有可能推导的开头终结符或可能的ε消除回转载 2017-07-02 09:16:28 · 2225 阅读 · 0 评论 -
编译原理(三) 消除文法的左递归
算法的功能对于任意上下文无关的文法消除左递归问题分析一、产生式直接消除左递归形如P→Pα|β可以通过直接消除转化为: P→βP′P′→αP′|ϵ二、产生式间接消除左递归有时候虽然形式上产生式没有递归,但是因为形成了环,所以导致进行闭包运算后出现左递归,如下:S→Qc|cQ→Rb|bR→Sa|a虽不具转载 2017-07-02 09:15:46 · 9466 阅读 · 0 评论 -
编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
1. NFA的确定化1.1. 明确NFA的定义一个非确定的有穷自动机(NFA)M是一个五元式:M=(S,∑,δ,S0,F) S是一个有限集,它额每个元素称为一个状态。∑是一个有穷字母表,它的每个元素称为一个输入字符δ是一个从S×∑∗至S子集额单值映射。即:δ:S×∑∗→2⋅SS0⊆S,是一个非空的初态集F⊂ S , 是一个终态集(可空)1.2. 定义转载 2017-07-02 09:13:49 · 6243 阅读 · 1 评论 -
编译原理(十) SLR文法分析法(算法原理和C++实现)
前情提要因为SLR文法分析法就是对LR(0)的一种优化,它提供了一种解决冲突的方法,所以很多之前在LR(0)提及的东西,在此只提供一个引用。 LR(0)文法分析法算法描述SLR文法构造分析表的主要思想是:许多冲突性的动作都可能通过考察有关非终结符的FOLLOW集而获解决。 解决冲突的方法:解决冲突的方法是分析所有含A和B的句型,考察集合FOLLOW(A)和FOLLOW(B)转载 2017-07-02 09:26:56 · 1788 阅读 · 0 评论