热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

[编译原理]编译基础之名词及概念部分

一、前言编译原理这门课介绍的是程序设计语言翻译的原理与技术,大略可分为词法分析-语法分析-语义分析及中间代码生成-中间代码优化-目标代码生成五个步骤ÿ

一、前言

  编译原理这门课介绍的是程序设计语言翻译的原理与技术,大略可分为词法分析->语法分析->语义分析及中间代码生成->中间代码优化->目标代码生成五个步骤,刚开始看这编译原理简明教程这本书时,里面的新概念多的使人晕头转向,因为缺乏实践性的学习,只认识了一些新词汇和概念,但我想这些词汇和概念或许可能就是编译原理的基础吧,那就勉强先把基础学牢实点,然后再看进阶点的书籍,动手完成书本中所介绍的编译工具,为了使自己印象更加深刻,写了这篇博客。


二、编译原理中的前端和后端

  概念上,有时会把编译程序划分为编译前端和编译后端。前端主要由源语言有关,但与目标机无关的那些部分组成,这些部分通常包括词法分析,语法分析,语义分析与中间代码生成,有的代码优化工作也可以包括在前端。
  后端包括编译程序中与目标机有关的那些部分,如与目标机有关的代码优化和目标代码生成等。后端不依赖于源语言,仅依赖于中间语言。


三、文法

  文法是描述语言的语法结构的形式规则,即语法规则,这些规则必须是准确的,易于理解的,而且要有很强的描述能力,足以描述各种不同的结构。由这种规则所形成的程序语言应有利于句子的分析和翻译。
  这里以一句中文 ” 我是大学生” 来分析该句子的构成规则,以下先列出一组语法规则:

<句子> &#xff0d;> <主语><谓语>
<主语> &#xff0d;> <代词>|<名词>
<代词> &#xff0d;> 你|我|他
<名词> &#xff0d;> 小明|大学生|英语|工人
<谓语> &#xff0d;> <动词><直接宾语>
<动词> &#xff0d;> &#61;是|学习
<直接宾语> &#xff0d;> <代词>|<名词>

把刚才那句话往上对照&#xff0c;就可以发现这是一句合法的语句&#xff0c;并且这套规则可以表示无数个句子。


四、符号和符号串

  上面分析了句子的构成规则&#xff0c;句子又是由各种符号构成的&#xff0c;比如单词和标点符号等&#xff0c;为了给出语言的形式定义&#xff0c;下面首先讨论符号和符号串的概念。
(1).字母表
  字母表是元素的非空有穷集合&#xff0c;例如&#xff36;&#xff1d;{a,b,c}等&#xff0c;&#xff23;语言的字母表是由字符&#xff0c;数字&#xff0c;若干符号组成的。习惯上使用Σ&#xff0c;&#xff36;或其它大写字母表示。
     
(2).符号串
  由字母表中符号组成的任何有穷序列都叫符号串&#xff0c;例如aa,bb,cc,ab,ac,abc等&#xff0c;符号串的顺序不同代表的含义一般也不同。如果某符号串x有m个符号&#xff0c;则称其长度为m&#xff0c;记作 |x| &#61; m&#xff0c;不包含任何符号的符号串用 ε 表示&#xff0c;即 |ε|&#61;0。
  
(3)符号串的运算
&#xff13;.&#xff11;.符号串的集合  
  若集合&#xff21;中的一切元素都是字母表上的符号串&#xff0c;则称&#xff21;为该字母表上的符号串集合
&#xff13;.&#xff12;.符号串的连接
  假如有两个符号串分别为x,y&#xff0c;则xy符号串是把y符号串写在x符号串后面之后得到的符号串&#xff0c;由ε的定义显然有εx&#61;xε&#61;x
&#xff13;.&#xff13;.符号串的方幂
  设x是符号串&#xff0c;把x自身连接n次得到的符号串z为z&#61;xxxxx称为符号串x的方幂&#xff0c;写作z&#61;x^n
  对于符号串集合的方幂也一样
  {x,y,z}^2 &#61; {x,y,z}{x,y,z}
      &#61;{xx,xy,xz,yx,yy,yz,zx,zy,zz}   
      &#xff08;可理解为符号串集合的n次方幂 等于 符号串集合中所有元素组合长度为n的集合&#xff09;
      
(4)特殊集合
  在规定字母表Σ后&#xff0c;该表上的符号串集合有两种比较特殊的形式&#xff0c;Σ^*称为Σ的闭包&#xff0c;Σ^&#43;称为Σ的正闭包
  
  Σ^*表示Σ上的所有有穷长的串的集合。
  例如 Σ&#xff1d;{0,1}
  则  Σ^*&#61;{ε,0,1,00,01,10,11,000,001,010,……..}&#xff0c;也可以表示为字母表的方幂形式如下:
     Σ^*&#61; Σ^0 ∪ Σ^1 ∪ Σ^2 … ∪ Σ^n
  
  Σ^&#43;的概念是由于发现很多时候需要描述一个语言连接1次或以上得到的集合
  所以Σ^&#43; &#61; Σ^1 ∪ Σ^2 … ∪ Σ^n

由以上可得出 Σ^&#43; &#61; Σ^*r &#61; rΣ^* (r为非空符号)
       Σ^* &#61; Σ^&#43;|ε
  


五、文法和语言的形式定义

  规则&#xff0c;也称重写规则&#xff0c;产生式或生成式&#xff0c;形如a -> b 或 a::&#61;b的(a,b)有序对&#xff0c;其中a 称为规则的左部&#xff0c;b称为规则的右部&#xff0c;中间的符号 -> 或 ::&#61; 读作”定义为”&#xff0c;例如A->a可以读作”&#xff21;定义a&#xff0c;也可以说成是关于&#xff21;的规则(产生式)
  
定义一.文法&#xff27;定义为四元组(Vn,Vt,P,S)
  其中&#xff36;n为非终结符(或语法实体,或变量)集&#xff0c;Vt为终结符集;&#xff30;为规则(α&#xff0d;>β)的集合&#xff0c;α∈(Vn ∪ Vt)^*且至少包含一个非终结符&#xff0c;β∈(Vn ∪ Vt)^*;Vn&#xff0c;Vt,和P是非空有穷集。S称为识别符或开始符&#xff0c;它是一个非终结符&#xff0c;至少要在一条规则中作为左部出现&#xff0c;
  Vt和Vn不含共同元素&#xff0c;即Vt∩Vn &#61; Ø
  通常的V表示Vt∪Vn表示文法G的字母表或字汇表。
  

定义二.如果a->b是文法G&#61;(Vn,Vt,P,S)中的一条规则&#xff0c;c和d是文法G字母表中的任意符号&#xff0c;若有符号串e,f满足
                e&#61;cad  f&#61;cbd
则 e 应用规则 a->b 直接产生 f &#xff0c;或说 f 是 e 的直接推导&#xff0c;或说 f 直接归约到 e&#xff0c;记作 e&#61;>f

定义三.如果存在直接推导序列
          e&#61;f0 &#61;> f1 &#61;> f2 &#61;> f3 &#61;> f4 &#61;> ……. &#61;>fn &#61; f (n>0)
则称 e 推导出 f &#xff0c;推导长度为 n&#xff0c;或称 f 归约到 e&#xff0c;记作 e &#61;&#43;> f

定义四.若有e&#61;&#43;>f&#xff0c;或e&#61;f&#xff0c;则记作e&#61;*>f.

定义五.设G[S]是一文法&#xff0c;如果符号串 x 是由识别符号推导出来的&#xff0c;即有&#xff33;&#61;*>x&#xff0c;则称 x 是文法&#xff27;[S]的句型。若 x 仅由终结符号组成&#xff0c;即S&#61;*>x&#xff0c;x∈&#xff36;t*&#xff0c;则称x为&#xff27;[S]的句子。即符号串中若还存在非终结符则是句型否则是句子。

定义六.文法&#xff27;所产生的语言的定义为集合{x|S&#61;*>x&#xff0c;其中&#xff33;为文法识别符号&#xff0c;且 x ∈&#xff36;t*}。可用L(G)表示该集合。
从中可以得出两点&#xff0c;第一&#xff0c;符号串 x 可从识别符号推出&#xff0c;也即 x 是句型。
         第二&#xff0c; x 仅由终结符号组成&#xff0c;即 x 是文法&#xff27;的句子。
 也就是说&#xff0c;文法描述的语言是该文法一切句子的集合。
 


六、文法的类型

  乔姆斯基把文法分成&#xff14;种类型&#xff0c;即&#xff10;型(短语文法)&#xff0c;&#xff11;型(上下文相关文法)&#xff0c;&#xff12;型(上下文无关文法)&#xff0c;&#xff13;型(正规文法)
  
0-型文法&#xff08;无限制文法或短语结构文法&#xff09;包括所有的文法。即它产生的每一个 α->β都是这样的&#xff0c;α ∈(Vn∪Vt)^&#43;且至少含有一个非终结符&#xff0c;而 β ∈(Vn∪Vt)^*。&#xff10;型文法的能力相当于图灵机&#xff0c;或者说任何&#xff10;型语言都是递归可枚举&#xff1b;反之&#xff0c;递归可枚举语言必须是&#xff10;型语言。

1-型文法&#xff08;上下文相关文法&#xff09;生成上下文相关语言。这种文法的产生式规则取如 αAβ -> αγβ 一样的形式。这里的A 是非终结符号&#xff0c;而 α, β 和 γ 是包含非终结符号与终结符号的字串&#xff1b;α, β 可以是空串&#xff0c; γ 必须不能是空串&#xff1b;这种文法也可以包含规则 S->ε &#xff0c;但此时文法的任何产生式规则都不能在右侧包含 S 。这种文法规定的语言可以被线性有界非确定图灵机接受。

2-型文法&#xff08;上下文无关文法&#xff09;生成上下文无关语言。这种文法的产生式规则取如 A -> γ 一样的形式。这里的A 是非终结符号&#xff0c;γ 是包含非终结符号与终结符号的字串。这种文法规定的语言可以被非确定下推自动机接受。上下文无关语言为大多数程序设计语言的语法提供了理论基础。

3-型文法&#xff08;正规文法&#xff09;生成正规语言。这种文法要求产生式的左侧只能包含一个非终结符号&#xff0c;产生式的右侧只能是空串、一个终结符号或者一个非终结符号后随一个终结符号&#xff1b;如果所有产生式的右侧都不含初始符号 S &#xff0c;规则 S -> ε 也允许出现。这种文法规定的语言可以被有限状态自动机接受&#xff0c;也可以通过正则表达式来获得。正规语言通常用来定义检索模式或者程序设计语言中的词法结构。
这里写图片描述


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文讨论了一个关于正则的困惑,即为什么一个函数会获取parent下所有的节点。同时提出了问题是否是正则表达式写错了。 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了如何使用Python正则表达式匹配MATLAB的函数语法,包括多行匹配和跨行签名的处理方法。同时,作者还分享了自己遇到的问题和解决方案。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • jmeter实践:从csv中获取带引号的数据详情的技巧和运行全部数据的方法
    本文分享了jmeter实践中从csv中获取带引号的数据的解决办法,包括设置CSV Data Set Config和运行脚本获取数据的方法。另外还介绍了循环运行csv中全部数据的解决方法,避免每次修改csv用例都需要修改脚本的麻烦。通过了解和掌握工具的细节点,可以更好地解决问题和提高技术水平。 ... [详细]
  • 分享2款网站程序源码/主题等后门检测工具
    本文介绍了2款用于检测网站程序源码和主题中是否存在后门的工具,分别是WebShellkiller和D盾_Web查杀。WebShellkiller是一款支持webshell和暗链扫描的工具,采用多重检测引擎和智能检测模型,能够更精准地检测出已知和未知的后门文件。D盾_Web查杀则使用自行研发的代码分析引擎,能够分析更为隐藏的WebShell后门行为。 ... [详细]
  • 本文介绍了Linux Shell中括号和整数扩展的使用方法,包括命令组、命令替换、初始化数组以及算术表达式和逻辑判断的相关内容。括号中的命令将会在新开的子shell中顺序执行,括号中的变量不能被脚本余下的部分使用。命令替换可以用于将命令的标准输出作为另一个命令的输入。括号中的运算符和表达式符合C语言运算规则,可以用在整数扩展中进行算术计算和逻辑判断。 ... [详细]
author-avatar
双赢糖
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有