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

现代编译原理——第二章:语法分析之上下文无关文法

转自:http:www.cnblogs.comBlackWalnutp4471938.html我们知道了词法分析是专注于一个检测一个语言中是否有不合格的单词ÿ

  转自: http://www.cnblogs.com/BlackWalnut/p/4471938.html 

  我们知道了词法分析是专注于一个检测一个语言中是否有不合格的单词,以及将单词进行分类。那么为什么要分类呢?其目的就是为了规范化。只有无限的东西规范到一个范围内,我们才能对其进行识别和分析。例如,我们定义在加号两边只能是两个ID。这样,如果出现IF PLUS ID 这样的结构就说明是不正确的,其犯了语法错误。

  从上例可以看出,我们已经从单词级别的分析转换到了单词与单词之间的关系的分析。他们之间的关系就是我们定义的相关语法。

  类似于词法分析,我们为了描述一类单词,使用了正则表达式,在这里,我们为了描述一类语法,我们使用了上下文无关文法。由此可以知道,文法是用来定义句子结构的(单词与单词之间的关系),上下文无关文法是指,该文法所定义的所有的句子结构之间是没有关系的。例如ID = ID + ID,我们不关心ID在怎么来的,经历了那些东西,我们只关心一个字符是不是ID,以及ID的等价形式有那些。

  以上只是对文法的感性描述,比较正规的定义是:一个上下文无关文法包含四个成分,终结符号集合,非终结符号集合,起始符号,产生式集合。

  产生式的形式是A->B这种形式,其中左面一定是非终结符,右面是终结符和非终结符的混合。所以,凡事能够放到左面的符号都成为非终结符,是由语法的设计者定义的。终结符就是不能产生产生式的符号,比如语言中的+,-,),>等。起始符号是非终结符集合中的一个,表示语法分析从这个符号开始。例如:A->B+C, B->A,C->-C,使用B和C代替第一产生式中的相应部分,就可以得到一个能不限数字个数的加减法运算表达式。考虑下面一个文法:

   如果使用上面的文法来分析1+2*3这样的语句,我们就可能得到两个同的分析过程:

                              

  上面的树形结构就是语法分析树。采用自底向上的方式来计算表达式,第一个是(1+2)*3,第二个是1+(2*3)。如果一个文法对一个句子进行分析可以产生多个语法分析树,我们就称这个文法是二义文法。这个时候计算机就不知道该使用哪个过程了。但是,通常二义文法可以转化成非二义文法:

  上面这个文法就规定了*具有更高的优先级,且文法是左结合的文法。这里的S就是起始符号,?的意思是如果遇到这个符号表示一个文法分析过程的结束。

转:https://www.cnblogs.com/jacksplwxy/p/10052752.html



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 如何实现织梦DedeCms全站伪静态
    本文介绍了如何通过修改织梦DedeCms源代码来实现全站伪静态,以提高管理和SEO效果。全站伪静态可以避免重复URL的问题,同时通过使用mod_rewrite伪静态模块和.htaccess正则表达式,可以更好地适应搜索引擎的需求。文章还提到了一些相关的技术和工具,如Ubuntu、qt编程、tomcat端口、爬虫、php request根目录等。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • Final关键字的含义及用法详解
    本文详细介绍了Java中final关键字的含义和用法。final关键字可以修饰非抽象类、非抽象类成员方法和变量。final类不能被继承,final类中的方法默认是final的。final方法不能被子类的方法覆盖,但可以被继承。final成员变量表示常量,只能被赋值一次,赋值后值不再改变。文章还讨论了final类和final方法的应用场景,以及使用final方法的两个原因:锁定方法防止修改和提高执行效率。 ... [详细]
  • EPICS Archiver Appliance存储waveform记录的尝试及资源需求分析
    本文介绍了EPICS Archiver Appliance存储waveform记录的尝试过程,并分析了其所需的资源容量。通过解决错误提示和调整内存大小,成功存储了波形数据。然后,讨论了储存环逐束团信号的意义,以及通过记录多圈的束团信号进行参数分析的可能性。波形数据的存储需求巨大,每天需要近250G,一年需要90T。然而,储存环逐束团信号具有重要意义,可以揭示出每个束团的纵向振荡频率和模式。 ... [详细]
  • 这是原文链接:sendingformdata许多情况下,我们使用表单发送数据到服务器。服务器处理数据并返回响应给用户。这看起来很简单,但是 ... [详细]
  • 如何去除Win7快捷方式的箭头
    本文介绍了如何去除Win7快捷方式的箭头的方法,通过生成一个透明的ico图标并将其命名为Empty.ico,将图标复制到windows目录下,并导入注册表,即可去除箭头。这样做可以改善默认快捷方式的外观,提升桌面整洁度。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了计算机网络的定义和通信流程,包括客户端编译文件、二进制转换、三层路由设备等。同时,还介绍了计算机网络中常用的关键词,如MAC地址和IP地址。 ... [详细]
  • 本文介绍了使用AJAX的POST请求实现数据修改功能的方法。通过ajax-post技术,可以实现在输入某个id后,通过ajax技术调用post.jsp修改具有该id记录的姓名的值。文章还提到了AJAX的概念和作用,以及使用async参数和open()方法的注意事项。同时强调了不推荐使用async=false的情况,并解释了JavaScript等待服务器响应的机制。 ... [详细]
  • 本文详细介绍了PHP中与URL处理相关的三个函数:http_build_query、parse_str和查询字符串的解析。通过示例和语法说明,讲解了这些函数的使用方法和作用,帮助读者更好地理解和应用。 ... [详细]
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
author-avatar
Chloemw
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有