编译原理算法实现
一些编译原理算法的实现,一些文法分析器的实现
黎辰
其实一切只为一个理由,一切理由在一个人面前也都沦为借口
展开
-
编译原理(十) SLR文法分析法(算法原理和C++实现)
前情提要因为SLR文法分析法就是对LR(0)的一种优化,它提供了一种解决冲突的方法,所以很多之前在LR(0)提及的东西,在此只提供一个引用。 LR(0)文法分析法算法描述SLR文法构造分析表的主要思想是:许多冲突性的动作都可能通过考察有关非终结符的FOLLOW集而获解决。 解决冲突的方法:解决冲突的方法是分析所有含A和B的句型,考察集合FOLLOW(A)和FOLLOW(B),如果这两个集合不相原创 2015-12-04 09:37:22 · 24896 阅读 · 2 评论 -
编译原理(九) LR(0)文法分析法(算法描述和C++代码实现)
概念梳理最左推导:每一步替换最左边的非终结符 最右推导:每一步替换最右边的非终结符,最右推导称为规范推导 短语:令G是一个文法,S是文法的开始符号,假定αβδ是文法G的一个句型,如果有 S⇒∗αAδ且A⇒+βS\Rightarrow^* \alpha A \delta 且 A \Rightarrow^+ \beta则称 β是相对于非终结符A的, 句型αβδ的短语。 直接短语:令G是一个文法,S原创 2015-12-02 19:58:45 · 28667 阅读 · 17 评论 -
编译原理(四) 提取左因子法消除回溯
概念简述回溯:分析工作部分地或全部地退回到之前的一个阶段,在当前阶段采取与之前不同的决策重新推进工作 FIRST(α)FIRST(\alpha):令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为:FIRST(α)={a | α=>*a…, a∈VT} 若α=>*ε,则规定ε∈FIRST(α)FIRST(α)是α的所有可能推导的开头终结符或可能的ε原创 2015-11-28 09:51:18 · 11001 阅读 · 3 评论 -
编译原理(三) 消除文法的左递归
算法的功能对于任意上下文无关的文法消除左递归问题分析一、产生式直接消除左递归形如P→Pα|βP\rightarrow P \alpha | \beta可以通过直接消除转化为: P→βP′P′→αP′|ϵ\begin{aligned}&P \rightarrow \beta P' \\ &P' \rightarrow \alpha P' | \epsilon\end{aligned}二、产原创 2015-11-28 08:45:19 · 51329 阅读 · 7 评论 -
编译原理(一) Chomsky文法的判断方法及C++代码实现
一、明确定义0型文法:对任一产生式α→β,都有α∈(VN∪VT)+, β∈(VN∪VT)*1型文法:对任一产生式α→β,都有|β|≥|α|, 仅仅 α→ε除外2型文法:对任一产生式α→β,都有α∈VN , β∈(VN∪VT)*3型文法:任一产生式α→β的形式都为A→aB或A→a,其中A∈VN,B∈VN,a∈VT。上述叫做右线性文法,另有左线性文法,二者等价。二、基本思路0型文法 首先字原创 2015-11-08 00:49:45 · 5552 阅读 · 1 评论 -
编译原理(二) NFA的确定化及DFA的最小化的算法及C++实现
1. NFA的确定化1.1. 明确NFA的定义一个非确定的有穷自动机(NFA)M是一个五元式:M=(S,∑,δ,S0,F)M=(S,\sum,\delta,S_0,F) S是一个有限集,它额每个元素称为一个状态。S是一个有限集,它额每个元素称为一个状态。∑是一个有穷字母表,它的每个元素称为一个输入字符\sum是一个有穷字母表,它的每个元素称为一个输入字符δ是一个从S×∑∗至S子集额单值映射。原创 2015-11-12 10:41:21 · 17554 阅读 · 6 评论 -
编译原理(八) 算符优先分析法(分析过程的算法和C++实现)
前情提要算符优先分析法(构造算法优先关系表)算法描述算符优先关系主要用于界定右句型的句柄: <标记句柄的左端; =出现在句柄的内部; >标记句柄的右端。发现句柄的过程:从左端开始扫描串,直到遇到第一个>为止。向左扫描,跳过所有的=,直到遇到一个<为止。句柄包括从上一步遇到的<右部到第一个>左部之间的所有符号,包括介于期间或者两边的非终结符非终结符的处理: 因为非终结符不能原创 2015-11-30 10:49:45 · 16763 阅读 · 2 评论 -
编译原理(七) 算符优先分析法(构造算符优先关系表算法及C++实现)
概念简述移动归约分析法:自底向上的语法分析方法,也称为移动归约分析法。最易于实现的一种移动归约分析方法,叫做算符优先分析法,而更一般的移动归约分析方法叫做LR分析法,LR分析法可以用作许多自动的语法分析器的生成器。短语:文法G[S],αβδ是文法G的一个句型,S=>*αAδ且A=>+β则称β是句型αβδ相对于非终结符A的短语。 直接短语:若有A ⇒+\Rightarrow^+β则称β是句型α原创 2015-11-29 15:11:21 · 66455 阅读 · 8 评论 -
编译原理(六) LL(1)文法分析法(分析过程的C++实现)
前情了解快速通道算法分析预测分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a行事的。如下图所示,对于任何(X,a),总控程序每次都执行下述三种可能的动作之一:若X = a = ‘#’,则宣布分析成功,停止分析过程。若X = a ≠‘#’,则把X从STACK栈顶弹出,让a指向下一个输入符号。若X是一个非终结符,则查看分析表M。 若M[X,a]中存放着关于X的一个产生式,原创 2015-11-28 21:38:45 · 13099 阅读 · 8 评论 -
编译原理(五) LL(1)文法分析法(预测分析表的构造算法C++实现)
基本定义FIRST(α):FIRST(\alpha): 令G是一个不含左递归的文法,对G的所有非终结符的每个候选α定义它的终结首符集FIRST(α)为: FIRST(α)={a | α=>*a…, a∈VT} 若α=>*ε,则规定ε∈FIRST(α)FIRST(α)是α的所有可能推导的开头终结符或可能的ε 如果非终结符A的所有候选首符集两两不相交,即A的任何两个不同候选αi和αj FI原创 2015-11-28 20:02:54 · 44061 阅读 · 7 评论