编译原理(清华大学出版社)-- 文法和语言 -- 文法和语言的形式定义

规则(重写规则、产生式或生成式)

  • 形如 α→β 或 α::=β 的(α,β)有序对,其中α称为规则的左部,β称为规则的右部,这里的符号 →(::=)读作 "定义为",例如A→a读作 “A定义为a”
  • 文法 G定义为四元组(VN,VT,P,S)
  • 其中VN为非终结符集(语法实体 或 变量);VT终结符集;P为规则(α→β)的集合,α∈(VN∪VT* ,且至少包含一个非终结符,β∈(VN∪VT*,VN,VT和P都是非空有穷集
  • S称为识别符或者开始符,它是一个非终结符,至少要在一条规则中作为左部出现
  • VN 和 VT 不含公共的元素,即VN ∩ VT = Ø
  • 通常用 V 表示 VN ∪ VT ,V称为文法G的字母表或词汇表

例2.1 有文法G=<VN,VT,P,S>,其中,VN={S},VT={0,1},P={S→0S1,S→01},这里非终结符集中只含一个元素S,终结符号集由两个元素 0,1组成,有两条产生式,开始符是S

该例子也可以写成

G: S→0S1

  S→01

或者

G[S]:S→0S1

S→01

例2.2 有文法G=(VN,VT,P,S),其中 VN = {标识符,字母,数字},VT = {a,b,c,...,x,y,z,0,1,...,9}

P = { <标识符>→<字母>

    <标识符>→<标识符><字母>

    <标识符>→<标识符><数字>

<字母>→a

<字母>→b

    ...

    <字母>→z

    <数字>→0

    <数字>→1

   ...

    <数字>→9

}

S=<标识符>

为定义文法所产生的语言,还需要引入 推导 的概念,定义 V* 中的符号之间的关系,直接推导=>,长度为n(n≥1)的推导  和长度为n(n≥0)的推导 

直接推导/直接归约的定义

  • 设α→β是文法G=(VN,VT,P,S)的规则(或者是P中的一个产生式),γ 和 δ 是V*中的任意符号
  • 若有符号串 v、ω满足,v = γαδ,ω=γβδ,则说v(应用规则α→β)直接产生ω,或说ω是v的直接推导,或说ω直接归约到v,记作v=>ω

例如,对于例2.1的文法G,可以给出一些例子

  1. v=0S1,ω=0011,直接推导:0S1=>0011,使用的规则:S→01,这里γ=0,δ=1
  2. v=S,ω=0S1,直接推导:S=>0S1,使用的规则:S→0S1,这里γ=ε,δ=ε,ε类似于群里面的幺元
  3. v=0S1,ω=00S11,直接推导:0S1=>00S11,使用的规则,S→0S1,这里γ=0,δ=1

对于例2.1的文法G,直接推导的例子如下

  1. v=<标识符> ,ω=<标识符><字母>,直接推导:<标识符>=><标识符><字母>,使用的规则:<标识符>→<标识符><字母>,这里γ=δ=ε
  2. v=<标识符><字母><数字>,ω=<字母><字母><数字>,直接推导:<标识符><字母><数字>=><字母><字母><数字>,使用的规则:<标识符>→<字母>,这里γ=ε,δ=<字母><数字>
  3. v=abc<数字>,ω=abc5,直接推导:abc<数字>=>abc5,使用的规则:<数字>→5,这里γ=abc,δ=ε

序列中的推导定义

  • 如果存在直接推导的序列:v=ω0 => ω1 => ω2 => ... => ωn = ω (n>0)则称v推导出(产生)ω(推导长度为n),或称ω归约到v,记作v ω
  • 若有 v ω,或 v = ω,则记作 v ω 对例2.1的文法,存在直接推导序列 v=S1 => 00S11 => 000S11 => 00001111 = ω,即 0S1  00001111,也可记作 0S1 00001111
  • 对例2.2的文法,存在直接推导序列 v = <标识符> => <标识符><数字> => <字母><数字> => x<数字> => x1 = ω,即 <标识符> x1

句型(推导出来的结果)和句子(仅由终结符号组成的句型)的定义

  • 设G[S]是一个文法,如果符号串x从识别符号推导出来的,即有 S  x,则称x是文法 G[S] 的句型
  • 若x仅由终结符号组成, 即 S  x,x∈V*T ,则称x为G[S]的句子
  • 例如,在例2.1中,S、0S1、000111都是例2.1的文法G的句型,其中000111是G的句子
  • 在例2.2中,<标识符><字母>,<字母><数字>,a1都是例2.2文法G的句型,其中a1是G的句子

文法G产生的语言定义

  • 文法G产生的语言定义为集合{x|Sx,其中S为文法识别符号,且x∈V*T},可用L(G)表示该集合

文法描述的语言是该文法一切句子(仅由终结符号组成的句型)的集合

考虑例2.1的文法G,有两条产生式(规则):S→0S1 和 S→01,通过对第一个产生式使用 n-1 次,然后使用第二个产生式一次,得到 S=>0S1=>00S11=>...=>0n-1S1n-1=>0n1n

L(G)={0n1n|n≥1}

例题2.3

设G=(VN, VT, P, S),VN = {S, B, E}, VT = {a, b, e},P由下列产生式组成

  1. S→aSBE
  2. S→aBE
  3. EB→BE
  4. aB→ab
  5. bB→bb
  6. bE→be
  7. eE→ee

若L(G1) = L(G2),则称文法G1和G2是等价的

例如文法 G[A]:

    • A→0R
    • A→01
    • R→A1

原文地址:https://www.cnblogs.com/YC-L/p/12175810.html

时间: 2024-10-06 03:11:07

编译原理(清华大学出版社)-- 文法和语言 -- 文法和语言的形式定义的相关文章

文法的分类【编译原理】

对产生式施加不同的限制得到不同类型的文法 ¨0型(无限制文法): ¨1型(上下文有关): ¨ 2型(上下文无关): ¨3型(右线性和正规文法): 有限状态自动机是具有离散输入和输出的系统的一种数学模型. 其主要特点有以下几个方面: – (1)系统具有有限个状态,不同的状态代表不同的意义.按照实际的需要,系统可以在不同的状态下完成规定的任务. – (2)我们可以将输入字符串中出现的字符汇集在一起构成一个字母表.系统处理的所有字符串都是这个字母表上的字符串. – (3)系统在任何一个状态下,从输入字

编译原理随笔

最近初步接触到了编译原理这门课程,通过老师提供的一些链接,以及课上的知识,对这门课有了一些认识与了解. 编译原理旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.从源语言提取需要的信息:把源语言翻译成目标语言:自动生成满足一定规范的文本... 学习编译原理可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的可以更加客观的比较不同语言的差异,更不容易被某个特定语言的宣扬者忽悠,学习新的语言是效率

编译原理之我见

经过网上的调查,我发现编译原理并不像我所想象的那样简单,我以为编译原理其实就是像塑造一个翻译师一样,赋予它翻译的架构即可,但是经过调查后,结果却不是我所想,编译原理就是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵守的规律,让电脑可以懂得高级语言所能表达的东西,内容包括语言和文法,词法分析,语法分析,语法制导编译,中间代码生成,存储管理,代码优化和目标代码生成.编辑原理是计算机专业的一门重要课,旨在介绍编译程序构造的一般原理和方法.编译原理及技术从本质上来讲就是一个算法问题而已,

关于编译原理

1.编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 2.编译原理是计算机科学与技术中一个非常成熟的分支,非常完美地将原理与技术结合了起来,对于理解计算机的本质非常有帮助 . 编译原理是计算

对编译原理这门课程的看法

对我来说,我市首次听到和接触到"编译原理"这个词,但是经过一晚上的探索,已经有了一定的了解. 首先是编译原理就是什么? 编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 编译原理及

编译原理--谢建航

1.编译原理就是什么?编译原理旨在介绍编译程序构造的一般原理和基本方法.学习内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 2.学习编译原理有什么好处?1.可以更加容易的理解在一个语言种哪些写法是等价的,哪些是有差异的2.可以更加客观的比较不同语言的差异3.更不容易被某个特定语言的宣扬者忽悠4.学习新的语言是效率也会更高5.如果足够牛逼,甚至还可以自己写一个编译器.6.对未来的工作也会有很多的帮助 3.不学有什么损失? 完全不懂编译原理的程

0909 对编译原理见解

经过上网查找后,我对编译原理理解得到了更深刻的理解. 通过该课程了解,掌握了什么是编译程序,编译程序工作的基本过程及其各阶段的基本任务,熟悉了编译程序总流程框图,了解了编译程序的生成过程.构造工具及其相关的技术对课本上的知识有了更深的理解,课本上的知识师机械的,表面的.通过把该算法的内容,算法的执行顺序在计算机上实现,把原来以为很深奥的书本知识变的更为简单,对实验原理有更深的理解. 编译原理学什么?编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法

编译原理是什么

编译原理其实就是将高级语言翻译成计算机语言(即计算机所能识别的二进制代码)所遵循的规律,让电脑可以懂得高级语言所表达的东西,内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.编译原理是计算及专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂. 我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门

如何看待编译原理

1.随着我进入到大二的学习中我认识到一门叫编译原理的课程,一开始我对这一门课程不是十分的了解,编译原理是什么?所以我看了下书本的前言解释和网上的有关资料,给出的结果是编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成. 编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提

对编译原理有何看法?

编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法.内容包括语言和文法.词法分析.语法分析.语法制导翻译.中间代码生成.存储管理.代码优化和目标代码生成.编译原理是计算机专业设置的一门重要的专业课程.虽然只有少数人从事编译方面的工作,但是这门课在理论.技术.方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力. 我认为这门课是一门真正与代码做斗争的课程,对于一个有至于追求技术的人是不容错过的课程,而且编译原理可以说是一个计算机科学的缩影.你学习它更多的