上下文无关文法

作业三——语法树、短语、直接短语、句柄

笑着哭i 提交于 2020-02-28 21:38:32
1.已知文法: S->a|^|(T) T->T,S|S 分析句型(T,(^,a)),求全部的短语、直接短语和句柄。   答:根据题意画出语法树如下所示:       全部短语:(T, (^, a))  T, (^, a)  (^, a)  ^,a  ^  a   直接短语:^  a   句柄:^ 2.构造上下文无关文法,描述语言: (1){anbn|n>=0) (2){ambn|m>=n>=0} (3){(ab)n|n>=0} (4){ambn|m,n>=1}    答:(1)S -> aSb | ab | ε     (2)S -> aSb | a | ε     (3)S -> abS | a | b | ε     (4)S -> aS | bS | ε 3.如果if语句的方法: stmt ->if expr then stmt | if expr then stmt else stmt | other 句子if E1 then if E2 then S1 else S2是否有两棵不同的语法树?说明了什么?    答:         如果一个文法存在某个句子对应两棵不同的语法树,则说这个文法是二义的。如果文法中含有二义性的句子,则称该文法是二义性的,即一个语法存在某个句子对应两个不同的语法树,是二义性文法。所以说明if E1 then if E2 then S1 else

正则表达式的真正威力(2)

淺唱寂寞╮ 提交于 2020-02-28 12:45:20
上下文有关文法 接下来再看乔姆斯基谱系上一层:上下文有关语言。 上下文有关语言中的产生式都具有以下形式: α A β → α γ β 这种混合字符初看很复杂,其实很简单。核心依然具有形式 A → γ ,这点跟上下文相关文法一致。不同的是两边多出了 α 和 β 。这两者就构成了上下文(文法的名称由此得来)。所以 A 可以被 γ 替代的条件是其左右也有 α 和 β 。 为了清晰的说明这点,试着解析下面的规则: a b A -> a b c a B c -> a Q H c H B -> H C 翻译出来就是: 只有左边有`a b`时,`A`才可以用`c`替换 只有左边是`a`右边是`c`时,`B`才可以用`Q H`替换 只有走边是`H`时,`B`才可以用`C`替换 上下文相关文法在“一般”编程中是很少遇到的。在自然语言处理中比较重要(因为自然语言显然不是上下文无关的。单词在不同的上下文中意义不同)。然而即便在自然语言处理中,人们也经常使用“温和的上下文相关语言”,因为可以有效建模语言又可以快速解析。 要理解上下文相关文法有多么强大,我们先看一下另一种文法类型,它和上下文相关文法有基本一样的表达能力:非收缩文法。 非收缩文法每一个产生式规则的形式都是 α -> β ,其中 α 和 β 都是任意的符号串,唯一的限制是:右边的符号长度不能小于左边的符号。

编译系统中的LR与LL理解

女生的网名这么多〃 提交于 2020-01-26 00:39:17
编译原理:LL(1),LR(0),SLR(1),LALR(1),LR(1)对比 LL(1)定义: 一个文法G是LL(1)的,当且仅当对于G的每一个非终结符A的任何两个不同产生式 A→α|β,下面的条件成立:SELECT( A→α) ∩ SELECT( A→ β ) =dd,其中,   α|β不能同时 ε.    解释:LL(1)的意思是,第一个L,指的是从左往右处理输入,第二个L,指的是它为输入生成一个最左推导 。 1指的是向前展望1个符号 。   LL(1)文法是 上下文无关文法 的一个子集。它用的方法是 自顶向下的(递归式的处理 )。它要求生成的 预测分析表 的每一个项目至多只能有一个生成式 。   上面的定义说的是,任何两个不同的产生式 A→α和 A→β,选择A→α或者 A→β是不能有冲突的,即SELECT( A→α)∩SELECT( A→β)=,具体来说,就是,   第一:First( A→α) ∩First( A→β)=,首符集不能有交集, 否则当交集中的元素出现时,选择哪个产生式进行推导是不确定的 ,(这其中也包含了α|β不能同时ε,否则交集就是{ε}不为空);   第二:若任何一个产生式β,有ε属于First(β),应有First(A)∩Follow(A)为空(当ε属于First(β),则A有可能被空串代替,那么就要看 A的下一个字符,即Follow集

编译原理学习指导 - ★★★TINYUE的专栏★★★ - CSDNBlog

房东的猫 提交于 2020-01-21 02:53:18
编译原理学习指导 编译原理是计算机专业课程中最难同时也是最有挑战性的一门,理论上高度抽象,而且要求扎实的数学功底,在实践上也对数据结构的知识要求比较高.但是编译原理又是计算机科学中最为基础和重要的,类似于高等数学在理工科中的地位,所以今天粗略的跟大家谈谈这门课程的学习. 一、为什么学编译原理? 1、 编译原理蕴涵着计算机学科中解决问题的思路、抽象问题和解决问题的方法; 2、 编译原理课程的学习有利于加深对程序语言的理解,可以帮助你更加快速的掌握新的语言工具; 3、 课程中包含了很多软件技术,这对于以后从事软件设计是很有帮助的. 二、编译原理主要内容提要 (一)编译程序的功能、工作过程、结构以及构造方法 计算机只能读懂0或者1,而我们用高级语言编写的程序(原程序)是抽象的符号化了的东西,为了让计算机读懂我们写的程序,必须把我们 书写的程序翻译成某台机器能够读懂的(机器)语言(目标程序),这就是翻译程序的作用.翻译程序进行的是等价的翻译,意思就是说目标程序 和原程序在功能上是等价的;翻译程序有两种方式:“编译”、“解释”,区别在于是否生成目标代码,解释方式下,是直接执行源程序本身的 或者与源程序等价的中间程序,并不生成目标代码,而编译方式下,必须生成目标代码. 编译方式的特点①源程序的执行是分阶段的:编译阶段和执行阶段(若编译生成的目标程序是汇编语言程序,则在两者之间还有一个汇编 阶段

编译原理(清华大学出版社)-- 文法和语言 -- 句型的分析

不想你离开。 提交于 2020-01-11 10:40:36
句型分析 句型分析是一个 识别输入符号串是否为语法上正确 的程序的过程 在语言的编译实现中,把完成句型分析的程序称为 分析程序 或 识别程序 , 分析算法 又称 识别算法 该书介绍的都是 从左到右 的分析算法,从左到右地识别输入符号串 两大类分析算法 自顶向下,从文法开始符号出发, 反复使用各种产生式 ,寻找"匹配"于输入符号串的推导 ( 正着推 ) 自底向上,从输入符号串开始, 逐步进行"归约" ,直至归约到文法的开始符号 ( 反着推 ) 从构造语法树的角度看,自顶向下,从树根开始构造;自底向上,从末端结点开始构造 自顶向下的分析方法 例题2.9 考虑文法G[S] S→sAd A→ab A→a S=>cAd=>cabd 自底向上的分析方法 例题2.9中的文法来为输入符号 cabd 构造语法树 句型分析的有关问题 在自顶向下分析方法中, 回溯 从各种可能的选择中随机挑选一种,并希望它是正确的 如果它是错误的,必须退回去,再试另外的选择 在自底向上分析方法中, 句柄 需要精确定义"可归约串",称为句柄 令G是一个文法,S是文法的开始符号,αβδ是文法G的一个句型 若有S αAδ 且 A β,则称β是句型αβδ相对于非终结符号A的 短语 如果有 A=>β,则称β是句型αβδ相对于规则 A→β 的 直接短语(简单短语) 一个 右句型 的直接短语,称为该句型的 句柄

编译原理(清华大学出版社)-- 文法和语言 -- 文法的类型

不想你离开。 提交于 2020-01-10 14:48:10
0型文法 设G=(V N ,V T ,P,S)是一个文法,如果它的每个产生式α→β是这样一种结构:α∈(V N ∪ V T ) * 且 至少含有一个非终结符 ,而β∈(V N ∪ V T ) * ,则G是一个 0型文法 又称短语文法, 0型文法的能力相当于图灵机(Turing machine);任何0型语言都是 递归可枚举 的;反之,递归可枚举集必定是一个0型语言 1型或上下文有关的(context-sensitive) 设G=(V N ,V T ,P,S)是一个文法,若P中的每一个产生式 α→β均满足 |β|≥|α|,仅仅 S→ε 除外 ,则文法G是 1型或上下文有关的 在有些定义中,将上下文有关文法的产生式的形式描述为 α 1 Aα 2 → α 1 βα 2 ,其中α 1 、α 2 和 β 都在(V N ∪ V T ) * β≠ε,A在V N 更能体现 "上下文有关",因为只有 A出现在 α 1 和 α 2 的上下文中 ,才允许用β取代A 2型或上下文无关的(context-free) 设G=(V N ,V T ,P,S)是一个文法,若P中的每一个产生式 α→β均满足 α是一个终结符 ,β∈(V N ∪ V T ) * ,则文法G是 2型或上下文无关的 有时将2型文法的产生式表示为 A→β的形式,其中A∈V N ,即用β取代非终结符A时,与A所在的上下文无关

编译原理知识

╄→гoц情女王★ 提交于 2020-01-08 01:12:38
1、将表达式翻译成后缀式 https://zhidao.baidu.com/question/421915764.html 2、绪论   指令格式:操作码 操作地址码   低级语言:机器语言、汇编语言   翻译:逻辑等价的程序语言转变、编译:专指高级语言一次性转化为低级语言、解释:高级语言的一解释一执行   编译程序工作过程一般可分为五个阶段:词法分析、语法分析、语义分析、优化和目标代码生成,同时伴随表格管理和出错处理   编译有自编译和交叉编译 3、词法分析   任务:从左到右逐个字符地对源程序进行扫描,产生一个个单词 (Token)符号,输入源程序,输出单词符号(流),需要不断访问、更新符号表   符号分类:保留字、标识符、常数、运算符、界符   输出为二元式:(单词种别,单词自身的值/内码值)   状态转换图     作用:识别单词     定义:状态转换图是 状态有限的有向图 ,结点代表 状态 ,用圆圈表示;结 点之间可由有向边连接,代表 状态转换关系 ,有向边上可标 记 字符 ,表示前一状态接受某一个字符之后的状态转移     状态转换图的表示:       • 初始状态用“ ->○”表示 • 非终止状态用“○”表示 • 状态之间的跳转用“ ”(有向边)表示 • 终止状态用“◎*”表示       含分支的状态 • 对应一个switch()语句 • 或对应一组if

侃一侃编译原理的“文法”

落花浮王杯 提交于 2019-12-22 02:30:10
如果你敲累了代码,想喝喝咖啡,顺便看点儿可以当佐料的文章那本文应该比较适合现在的你。(•̀ᴗ•́)و ̑̑ 我们一天天都在和代码打交道,但是你了解代码的运行原理么?为什么你的一行代码就能被执行出五花八门的效果嘞? 其实代码这玩意儿就是一门语言。是的,你可以看成和中文、英文等语言平等的存在。是语言就得有语言的解析规则,不懂得规则自然无法理解语言的意思。就跟看没字幕的美剧一样,真是痛苦。╮(╯﹏╰)╭ 中文有中文的语义、语法、句子、句法、文法,那么编程语言也有自己的语言系统。 我们知道,我们写的代码被编译器或者解释器所执行,那它们是按照什么文法来理解你的代码呢?这就是文法。 本文也不会深入去解析文法,不然可以直接转语言学了(笑~)。本文只是简单介绍文法的一些概念。如果您喝着咖啡,看完之后,能有些许收获,微微一笑,那本文的目的也就达到了。^_^ 工欲善其事必先利其器。在谈文法之前,我们先介绍几个概念。 一.文法涉及的几个简单概念 假设Σ是一个有限的 字母表集合 ,它的每一元素都是一个 符号 。Σ上的一个 符号串 就是指由Σ中的符号组成的一个有限序列。如果一个符号串不包含任何符号,就叫它 空串 ,记为ε。现在再定义一个集合U和V的 连接积 的概念:          UV = {αβ | α∈U,β∈V} 比如A = {a,b},B = {1,2},则AB={a1,a2,b1,b2}

用C++编写简单绘图语言的语法分析器

喜夏-厌秋 提交于 2019-12-09 13:03:13
语法分析器 概述 从词法分析的角度看,语言是一个单词的集合,称之为正规集,单词是由一个个字符组成的线性结构;从语法分析的角度看,语言是一个句子的集合,而句子是由词法分析器返回的记号组成的非线性结构。反映句子结构的最好方法是树,常用的有分析树和语法树。分析语法结构的基本方法有两种: 自上而下 分析方法和 自下而上 分析方法。自上而下分析从根到叶子建立分析树,而自下而上分析恰好相反。在这两种情况下,分析器都是从左到右地扫描输入,每次读进一个记号。 与词法分析类似,语法分析也具有双重含义: ①规定句子形成的规则,也被称为语法规则。程序设计语言的大部分语法规则可以用上下文无关文法( Context Free Grammar , 简称 CFG )来描述。 ②根据语法规则识别记号流中的评议结构,也被称为语法分析。最有效的自上而下和自下而上的分析方法都只能处理上下文无关文法的子类,如 LL 文法和 LR 方法,但是它们已足以应付程序设计评议的绝大多数语法现象。 一、任务与目的 ·上机任务: 1 、使用 C/C++ 程序设计语言和递归下降子程序的方法编写该函数绘图语言的词法分析器。并要求设计一个语法分析器的测试小程序来调用自己编写的语法分析器测试各种不同的输入。 2 、语法分析的任务是在词法分析基础上,根据语言的语法规则,把词法符号分解成各类语法单位。语法分析所依据的是语言的语法规则

软件构造的四种文法的简单区分

百般思念 提交于 2019-12-05 09:29:07
文法 文法G定义为四元组(VN ,VT ,P,S) VN :非终结符集,通常用大写字母表示 VT : 终结符集,通常用小写字母表示 P :产生式集合(规则集合) S :开始符号(识别符号) 提示:下面例子中的大写字母表示的是非终结符,而小写字母表示的是终结符。 1. 0型文法(短语) 设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈(VN∪VT)*且至少含有一个非终结符,而β∈(VN∪VT)*,则G是一个0型文法。0型文法是这几类文法中,限制最少的一个,所以我们在试题中见到的,至少是0型文法。 0型文法相当于图灵机。 2. 1型文法(上下文有关文法) 它是在0型文法的基础上每一个α→β,都有|β|>=|α|。这里的|β|表示的是β的长度。 1型文法相当于线性有界自动机。 例子:如有A->Ba则|β|=2,|α|=1符合1型文法要求。反之,如aA->a,则不符合1型文法。 特例:α→ε也满足1型文法。 3. 2型文法(上下文无关文法) 2型文法是在1型文法的基础上,再满足:每一个α→β都有α是一个非终结符。如A->Ba,符合2型文法要求。 2型文法相当于下推自动机。 例子:Ab->Bab虽然符合1型文法要求,但不符合2型文法要求,因为其α=Ab,而Ab不是一个非终结符。A->Bab就对啦 4. 3型文法(正规文法) 它是在2型文法的基础上满足:A→α|αB