科技编译原理讲解
‘壹’ 求编译原理 华中科技大学出版 何炎祥 的课后详细答案
这个答案楼主你是不可能拿得到的,华科的都应该知道,想要找这种答案只能去图书馆找吧,我在华科的图书馆帮你搜索了一下,图书馆有这本书的习题集,但是我看了下,不能外借,只能馆内阅览,我把搜索的信息给你复制下来了,你自己在学校主页图书馆先看一下吧。
主要责任者 何炎祥 he yan xiang 编着
题名 编译原理及其习题解答 bian yi yuan li ji qi xi ti jie da / 何炎祥 ... [等] 编着
出版发行 武汉 : 武汉大学大学出版社, 2004
ISBN 7-307-04198-7 CNY41.00
馆藏地点 索书号 馆藏状态
湖北出版物样本室(304) TP314 91 馆内阅览
湖北出版物样本室(304) TP314 91 馆内阅览
‘贰’ 如何学好 程序设计语言 编译原理 诚求
1.明确学习目的
学习编程对大多数IT业人员来说都是非常有用的。学编程,做一名编程人员,从个人角度讲,可以解决在软件使用中所遇到的问题,改进现有软件,可以为自己找到一份理想的工作添加重要得砝码,有利于在求职道路上谋得一个好的职位;从国家的角度,可以为中国的软件产业做出应有的贡献,一名优秀的程序员永远是被争夺的对象。学习编程还能锻炼思维,使我们的逻辑思维更加严密;能够不断享受到创新的乐趣,将一直有机会走在高科技的前沿,因为程序设计本身是一种创造性的工作。知识经济时代给我们带来了无限的机会,要想真正掌握计算机技术,并在IT行业里干出一番事业来,有所作为,具有一定的编程能力是一个基本条件和要求。
2.打好基础
学编程要具备一定的基础,总结之有以下几方面:
(1)数学基础 从计算机发展和应用的历史来看计算机的数学模型和体系结构等都是有数学家提出的,最早的计算机也是为数值计算而设计的。因此,要学好计算机就要有一定的数学基础,出学者有高中水平就差不多了。
(2)逻辑思维能力的培养学程序设计要有一定的逻辑思维能力,“逻思力”的培养要长时间的实践锻炼。要想成为一名优秀的程序员,最重要的是掌握编程思想。要做到这一点必须在反复的实践、观察、分析、比较、总结中逐渐地积累。因此在学习编程过程中,我们不必等到什么都完全明白了才去动手实践,只要明白了大概,就要敢于自己动手去体验。谁都有第一次。有些问题只有通过实践后才能明白,也只有实践才能把老师和书上的知识变成自己的,高手都是这样成材的。
(3)选择一种合适的入门语言 面对各种各样的语言,应按什么样的顺序学呢?程序设计工具不外乎如下几类: 1)本地开发应用软件开发的工具有:Visual Basic 、Delphi 、VC++ ( C++ Builder ) 等;数据库开发工具有:Visual Foxpro 、Oracle Developer 、Power Builder 等。 2)跨平台开发开发工具如 Java 等。 3)网络开发对客户端开发工具如:Java Script 等;对服务器开发工具如:PHP 、ASP 、JSP 、ISAPI 、NSAPI 、CGI 等。以上不同的环境下几种开发工具中 VB 法简单并容易理解,界面设计是可设化的,易学、易用。选 VB 作为入门的方向对出学者是较为适合的。
3. 注意理解一些重要概念
一本程序设计的书看到的无非就是变量、函数、条件语句、循环语句等概念,但要真正能进行编程应用,需要深入理解这些概念,在理解的基础上应用,不要只简单地学习语法、结构,而要吃透针对这些语法、结构的应用例子,做到举一反三,触类旁通。
4.掌握编程思想
学习一门语言或开发工具,语法结构、功能调用是次要的,最主要是学习它的思想。例如学习 VC 就要学习 Windows 的内在机理、什么是线程......;学习 COM 就要知道 VTALBE 、类厂、接口、idl......,关键是学一种思想,有了思想,那么我们就可以触类旁通。
5.多实践、多交流
掌握编程思想必须在编程实际工作中去实践和体会。编程起步阶段要经常自己动手设计程序,具体设计时不要拘泥于固定的思维方式,遇到问题要多想几种解决的方案。这就要多交流,各人的思维方式不同、角度各异,各有高招,通过交流可不断吸收别人的长处,丰富编程实践,帮助自己提高水平。亲自动手进行程序设计是创造性思维应用的体现,也是培养逻辑思维的好方法。
6.养成良好的编程习惯
编程入门不难,但入门后不断学习是十分重要的,相对来说较为漫长。在此期间要注意养成一些良好的编程习惯。编程风格的好坏很大程度影响程序质量。良好的编程风格可以使程序结构清晰合理,且使程序代码便于维护。如代码的缩进编排、变量命令规则的一致性、代码的注释等。
7.上网学编程
在网上可以学到很多不同的编程思想、方法、经验和技巧,有大量的工具和作品及相关的辅导材料供下载。例如网站“编程课堂”()主要以 VB 和 Delph;教学和交流为主,提供大量实用技巧;网站“现在时编程学园”()是专门介绍C、VC、VB、Delphi 等的综合编程网站;网站“ VB 编程乐园 ”()提供内容丰富而且实用的编程技术文章、精选控件、源代码下载、计算机考试、相关软件以及编程书籍推荐等等。
8.加强计算机理论知识的再学习
学编程是符合“理论→实践→再理论→再实践”的一个认识过程。一开始要具有一定的计算机理论基础知识,包括编程所需的数学基础知识,具备了入门的条件,就可以开始编程的实践,从实践中可以发现问题需要加强计算机理论知识的再学习。程序人人皆可编,但当你发现编到一定程度很难再提高的时候,就要回头来学习一些计算机科学和数学基础理论。学过之后,很多以前遇到的问题都会迎刃而解,使人有豁然开朗之感。因此在学习编程的过程中要不断地针对应用中的困惑和问题深入学习数据结构、算法、计算机原理、编译原理、操作系统原理、软件工程等计算机科学的理论基础和数理逻辑、代数系统、图论、离散数学等数学理论基础知识。这样经过不断的学习,再努力地实践,编程水平一定会不断提高到一个新高度。
‘叁’ 为什么要学习编译原理(转)
大学课程为什么要开设编译原理呢?这门课程关注的是编译器方面的产生原理和技术问题,似乎和计算机的基础领域不沾边,可是编译原理却一直作为大学本科的必修课程,同时也成为了研究生入学考试的必考内容。编译原理及技术从本质上来讲就是一个算法问题而已,当然由于这个问题十分复杂,其解决算法也相对复杂。我们学的数据结构与算法分析也是讲算法的,不过讲的基础算法,换句话说讲的是算法导论,而编译原理这门课程讲的就是比较专注解决一种的算法了。在20世纪50年代,编译器的编写一直被认为是十分困难的事情,第一Fortran的编译器据说花了18年的时间才完成。在人们尝试编写编译器的同时,诞生了许多跟编译相关的理论和技术,而这些理论和技术比一个实际的编译器本身价值更大。就犹如数学家们在解决着名的哥德巴赫猜想一样,虽然没有最终解决问题,但是其间诞生不少名着的相关数论。 推荐参考书 虽然编译理论发展到今天,已经有了比较成熟的部分,但是作为一个大学生来说,要自己写出一个像TurbocC,Java那样的编译器来说还是太难了。不仅写编译器困难,学习编译原理这门课程也比较困难。 第一本书的原名叫《CompilersPrinciples,Techniques,andTools》,另外一个响亮的名字就是龙书。原因是这本书的封面上有条红色的龙,也因为獗臼樵诒嘁朐?砘?嘴域确实?忻?所以很多国外的学者都直接取名为龙书。最近机械工业出版社已经出版了此书的中文版,名字就叫《编译原理》。该书出的比较早,大概是在85或86年编写完成的,作者之一还是着名的贝尔实验室的科学家。里面讲解的核心编译原理至今都没有变过,所以一直到今天,它的价值都非凡。这本书最大的特点就是一开始就通过一个实际的小例子,把编译原理的大致内容罗列出来,让很多编译原理的初学者很快心里有了个底,也知道为什么会有这些理论,怎么运用这些理论。而这一点是我感觉国内的教材缺乏的东西,所以国内的教材都不是写给愿意自学的读者,总之让人看了半天,却不知道里面的东西有什么用。 第二本书的原名叫《ModernCompilerDesign》,中文名字叫做《现代编译程序设计》。该书由人民邮电出版社所出。此书比较关注的是编译原理的实践,书中给出了不少的实际程序代码,还有很多实际的编译技术问题等等。此书另外一个特点就是其现代而字。在传统的编译原理教材中,你是不可能看到如同Java中的垃圾回收等算法的。因为Java这样的解释执行语言是在近几年才流行起来的东西。如果你想深入学习编译原理的理论知识,那么你肯定得看前面那本龙书,如果你想自己动手做一个先进的编译器,那么你得看这本《现代编译程序设计》。 第三本书就是很多国内的编译原理学者都推荐的那本《编译原理及实践》。或许是这本书引入国内比较早吧,我记得我是在高中就买了这本书,不过也是在前段时间才把整本书看完。此书作为入门教程也的确是个不错的选择。书中给出的编译原理讲解也相当细致,虽然不如前面的龙书那么深入,但是很多地方都是点到为止,作为大学本科教学已经是十分深入了。该书的特点就是注重实践,不过感觉还不如前面那本《现代编译程序设计》的实践味道更重。此书的重点还是在原理上的实践,而非前面那本那样的技术实践。《编译原理及实践》在讲解编译原理的各个部分的同时,也在逐步实践一个现代的编译器TinyC.等你把整本书看完,差不多自己也可以写一个TinyC了。作者还对Lex和Yacc这两个常用的编译相关的工具进行了很详细的说明,这一点也是很难在国内的教材中看到的。 推荐了这三本教材,都有英文版和中文版的。很多英文好的同学只喜欢看原版的书,不我的感觉是这三本书的翻译都很不错,没有必要特别去买英文版的。理解理论的实质比理解表面的文字更为重要。 编译原理的实质 几乎每本编译原理的教材都是分成词法分析,语法分析(LL算法,递归下降算法,LR算法),语义分析,运行时环境,中间代码,代码生成,代码优化这些部分。其实现在很多编译原理的教材都是按照85,86出版的那本龙书来安排教学内容的,所以那本龙书的内容格式几乎成了现在编译原理教材的定式,包括国内的教材也是如此。一般来说,大学里面的本科教学是不可能把上面的所有部分都认真讲完的,而是比较偏重于前面几个部分。像代码优化那部分东西,就像个无底洞一样,如果要认真讲,就是单独开一个学期的课也不可能讲得清楚。所以,一般对于本科生,对词法分析和语法分析掌握要求就相对要高一点了。 词法分析相对来说比较简单。可能是词法分析程序本身实现起来很简单吧,很多没有学过编译原理的人也同样可以写出各种各样的词法分析程序。不过编译原理在讲解词法分析的时候,重点把正则表达式和自动机原理加了进来,然后以一种十分标准的方式来讲解词法分析程序的产生。这样的做法道理很明显,就是要让词法分析从程序上升到理论的地步。 语法分析部分就比较麻烦一点了。现在一般有两种语法分析算法,LL自顶向下算法和LR自底向上算法。LL算法还好说,到了LR算法的时候,困难就来了。很多自学编译原理的都是遇到LR算法的理解成问题后就放弃了自学。其实这些东西都是只要大家理解就可以了,又不是像词法分析那样非得自己写出来才算真正的会。像LR算法的语法分析器,一般都是用工具Yacc来生成,实践中完全没有比较自己来实现。对于LL算法中特殊的递归下降算法,因为其实践十分简单,那么就应该要求每个学生都能自己写。当然,现在也有不少好的LL算法的语法分析器,不过要是换在非C平台,比如Java,Delphi,你不能运用YACC工具了,那么你就只有自己来写语法分析器。 等学到词法分析和语法分析时候,你可能会出现这样的疑问:词法分析和语法分析到底有什么?就从编译器的角度来讲,编译器需要把程序员写的源程序转换成一种方便处理的数据结构(抽象语法树或语法树),那么这个转换的过程就是通过词法分析和语法分析的。其实词法分析并非一开始就被列入编译器的必备部分,只是我们为了简化语法分析的过程,就把词法分析这种繁琐的工作单独提取出来,就成了现在的词法分析部分。除了编译器部分,在其它地方,词法分析和语法分析也是有用的。比如我们在DOS,Unix,Linux下输入命令的时候,程序如何分析你输入的命令形式,这也是简单的应用。总之,这两部分的工作就是把不规则的文本信息转换成一种比较好分析好处理的数据结构。那么为什么编译原理的教程都最终把要分析的源分析转换成树这种数据结构呢?数据结构中有Stack,Line,List这么多数据结构,各自都有各自的特点。但是Tree这种结构有很强的递归性,也就是说我们可以把Tree的任何结点Node提取出来后,它依旧是一颗完整的Tree。这一点符合我们现在编译原理分析的形式语言,比如我们在函数里面使用函树,循环中使用循环,条件中使用条件等等,那么就可以很直观地表示在Tree这种数据结构上。同样,我们在执行形式语言的程序的时候也是如此的递归性。在编译原理后面的代码生成的部分,就会介绍一种堆栈式的中间代码,我们可以根据分析出来的抽象语法树,很容易,很机械地运用递归遍历抽象语法树就可以生成这种指令代码。而这种代码其实也被广泛运用在其它的解释型语言中。像现在流行的Java,.NET,其底层的字节码bytecode,可以说就是这中基于堆栈的指令代码的。 关于语义分析,语法制导翻译,类型检查等等部分,其实都是一种完善前面得到的抽象语法树的过程。比如说,我们写C语言程序的时候,都知道,如果把一个浮点数直接赋值给一个整数,就会出现类型不匹配,那么C语言的编译器是怎么知道的呢?就是通过这一步的类型检查。像C++语言这中支持多态函数的语言,这部分要处理的问题就更多更复杂了。大部编译原理的教材在这部分都是讲解一些比较好的处理策略而已。因为新的问题总是在发生,旧的办法不见得足够解决。 本来说,作为一个编译器,起作用的部分就是用户输入的源程序到最终的代码生成。但是在讲解最终代码生成的时候,又不得不讲解机器运行环境等内容。因为如果你不知道机器是怎么执行最终代码的,那么你当然无法知道如何生成合适的最终代码。这部分内容我自我感觉其意义甚至超过了编译原理本身。因为它会把一个计算机的程序的运行过程都通通排在你面前,你将来可能不会从事编译器的开发工作,但是只要是和计算机软件开发相关的领域,都会涉及到程序的执行过程。运行时环境的讲解会让你更清楚一个计算机程序是怎么存储,怎么装载,怎么执行的。关于部分的内容,我强烈建议大家看看龙书上的讲解,作者从最基本的存储组织,存储分配策略,非局部名字的访问,参数传递,符号表到动态存储分配(malloc,new)都作了十分详细的说明。这些东西都是我们编写平常程序的时候经常要做的事情,但是我们却少去探求其内部是如何完成。 关于中间代码生成,代码生成,代码优化部分的内容就实在不好说了。国内很多教材到了这部分都会很简单地走马观花讲过去,学生听了也只是作为了解,不知道如何运用。不过这部分内容的东西如果要认真讲,单独开一学期的课程都讲不完。在《编译原理及实践》的书上,对于这部分的讲解就恰到好处。作者主要讲解的还是一种以堆栈为基础的指令代码,十分通俗易懂,让人看了后,很容易模仿,自己下来后就可以写自己的代码生成。当然,对于其它代码生成技术,代码优化技术的讲解就十分简单了。如果要仔细研究代码生成技术,其实另外还有本叫做《》,那本书现在由机械工业出版社引进的,十分厚重,而且是英文原版。不过这本书我没有把它列为推荐书给大家,毕竟能把龙书的内容搞清楚,在中国已经就算很不错的高手了,到那个时候再看这本《》也不迟。代码优化部分在大学本科教学中还是一个不太重要的部分,就是算是实践过程中,相信大家也不太运用得到。毕竟,自己做的编译器能正确生成执行代码已经很不错了,还谈什么优化呢? 编译原理的课程毕竟还只是讲解原理的课程,不是专门的编译技术课程。这两门课程是有很大的区别的。编译技术更关注实际的编写编译器过程中运用到的技术,而原理的课
‘肆’ 计算机科学主要是讲什么内容
主要课程
电路原理、模拟电子技术、数字逻辑、数字分析、计算机原理、微型计算机技术、计算机系统结构、计算机网络、高级语言、汇编语言、数据结构、操作系统、编译原理、系统分析与控制、信号处理原理、通信原理概论。
主要专业实验
编程与上机调试、电子线路、数字逻辑、微型计算机接口技术、计算机组成等。
授予学位
工学或理学学士。
计算机科学与技术(师范类)
培养目标
培养掌握计算机科学与技术,包括计算机硬件、软件与应用的基本理论、基本知识和基本技能与方法,熟练地进行程序设计和使用数据库技术、网络技术以及多媒体技术等解决实际问题,具有教书育人的良好素养,能在高等和中等学校进行计算机教育的教师和其他教育工作者。
主干学科
计算机科学与技术。
主要课程
离散数学、数据结构、高级语言程序设计、操作系统、数据库原理、计算机通信与网络、计算机组成原理等。
主要专业实验
程序设计和上机调试、电子线路基础、微机接口技术、计算机组成、数据库、网络和多媒体技术等。
来源:计算机科学与技术学院 作者:计算机科学与技术学院 [字体:大 中 小]
本专业培养适应21世纪计算机科学与技术学科发展,国家、社会发展与进步事业实际需要,德、智、体、美全面发展,具有创新精神和实践能力的高级专门人才。毕业生适宜到科研部门和高、中等学校从事科学研究和教学工作;适宜到ICT产业、重要部门,以及相近学科的有关单位从事计算机科学与技术开发研究、应用与管理等工作;可以继续攻读计算机科学与技术及其相关学科的硕士学位。
一、专业特点及培养要求:
培养学生具有良好的科学素养和文化修养,较完整地掌握计算机科学技术一级学科的基础知识,使学生即懂系统,又会应用;既有扎实的理论基础,又有较强的应用能力;既可以承担实际系统的开发,又可进行科学研究。
毕业生应获得以下几方面的知识与能力:
1、系统地、较好地掌握理工科公共基础知识,较好地掌握本学科基本概念、基本原理、基本方法、基本技术等基础理论知识,理论联系实际,受到良好的科学思维和科学实验的基本训练;
2、毕业生应初步了解整个学科的知识组织结构、学科形态、典型方法、核心概念和学科基本工作流程方式,初步了解学科当前的发展现状和未来的发展趋势,掌握计算机科学与技术本科一级的核心基础知识和某一专业化方向的专业基础知识,为未来在计算机科学与技术领域从事一般教学、研究、应用与开发或深造提供一个开展工作的坚实的专业知识基础;
3、毕业生应初步具有进一步深入掌握学科核心基础知识和某一专业化方向专业基础知识的能力,初步具有对一般计算机科学与技术的技术项目所提出的思想、方法、技术和工程技术路线的可行性作出基本估计的能力;
4、具有较强的工作适应性,能适应计算科学与技术的快速发展要求。
二、专业方向:
A:计算机信息处理 B:计算机控制技术 C:图形学与可视化技术 D:信息安全技术
三、主干学科:电子科学、构造性数学、计算机科学与技术
四、主干课程:
电路、电子技术、离散数学、数字电路及逻辑、计算机组成原理、数据结构与算法分析、编译原理、操作系统、网络与通信、计算机系统结构、C++程序设计、信号处理原理、微型机系统与接口技术、软件工程、数据库系统基础等。
五、教学进程:
1、必修课:公共基础课和人文、社科、经管类素质课见表一,技术基础课和专业平台课见表二
2、选修课:限定选修课(专业方向课)和任意选修课见表三
3、实践教学环节:见表四
4、总周数分配:见表五
5、学历:见表六
六、学制:四年
本专业具有计算机应用技术、计算机软件与理论硕士学位授予权,并具有计算机技术工程硕士授予权
‘伍’ 计算机编译原理 图 里面的 圆圈 表示什么意思
先打个比方:
用程序接受从键盘输入的单词,并对照词典判断是不是拼写正确,步骤是:
一个一个地接收字母,每接受一个字母,识别状态往前推进一步。
假如只考虑识别3个单词:it, if, is
状态1:刚开始,一个字母还没收到。
状态2:接收到一个字母 i
状态3:又接收到一个字母 s
1,2,3用圆圈圈起来,1和2之间画个箭头连起来,箭头上标上字母 i。2和3也画个箭头,标上字母 s 。
这样的一张图,表示的是单词 is 的识别过程。
这个过程,就是你照片中第一个图,1,2,3串成一直线的图。
图中V1对应 i , 图中 V2 对应 s
你书上的图,描述的是“自动机”。自动机反映的是读取到一连串字母后的状态变化过程。
它包含若干个状态,即画有圆圈的数字。
当读入一个字母时,自动机从一个状态运行到另一个状态,对应图上的一个带箭头线条。线上标注的符号,代表读到的字符。
‘陆’ 什么是计算机科学技术,主要学什么内容
领学网为你解答:
计算机科学与技术
培养目标:本专业培养具有良好的科学素养,能系统的、较好的掌握计算机科学、信息技术的基本理论,掌握计算机硬件、软件、网络与应用的基本知识和基本技能与方法,能从事计算机教学、科学研究和开发应用的计算机科学、信息技术专业的计算机信息技术人才。
培养要求:掌握计算机科学、信息技术的基本理论、基本知识,特别是网络、数据库和多媒体技术以及计算机硬件、软件设计的基本技能,具有研究和开发计算机系统的基本技能和科技创新能力。
主要课程:信息技术导论、程序设计、电子技术基础、数字电路、数据结构、汇编程序设计、计算机组成原理、操作系统、网络技术、数据库原理、网络编程、编译原理、软件工程、网络安全、教学软件制作、三维动画创作等。
希望帮到你!
‘柒’ 学过编译原理的人看c\c++跟没学过的人比起来,有什么长处
一般来讲...没学过C\C++就跟编程文盲差不多...C\C++是基础,在这之上才能看很多.包括数据结构和算法(用汇编实在难以描述),或者学习其他编程语言.
让我难以理解的是,学习编译原理应该需要学习数据结构,但是楼主又没有学过C\C++,又是怎么学会数据结构进而理解编译原理??我很纳闷....楼主有无写过一个简单的编译器?纯汇编是很难写编译器的,在编译器的词法分析,语法分析,语义分析,中间代码等都基本用C\C++写,只有当要生成特定的CPU汇编指令的时候需要用汇编语言.
学习操作系统基本不需要过多编译原理的知识,只需要 汇编+C语言+数据结构和算法基础,基本就可以了.
附加一段:楼主好像对编译原理的理解有所偏差.编译原理主要是讲解编译器的构造,而汇编语言应该属于一种编程语言,和C\C++一样可以应用于很多场合.编译器原理就是如何把高级语言转换为低级语言的过程.
一般操作系统使用 汇编语言+C语言写成.(以下是Intel IA-32平台机器的一般开机过程)在计算机启动时,操作系统从汇编代码开始运行,因为这时处于实模式状态,也没有操作系统,因此首先启动BIOS程序,然后CPU通过编译好的汇编代码从实模式转入保护模式.接着逐步把PC的控制权交给操作系统内核,当内核启动后,由于有了操作系统的支持,此时的机器就可以通过高级语言编译好的代码(比如C语言)来管理PC的所有资源.因此,学习操作系统必须有汇编语言和C语言基础.不然例如进程调度和控制等这种核心问题是不可能看的懂的.
‘捌’ 编译原理怎么样
大学里面的课本,大多数都是一个稍微浓缩了的编译原理讲解,老师基本上还是要看看这本红龙书才敢讲课的。 如果说这本书有什么优点,那么可以这么说,很多编译原理......
‘玖’ 编译原理中文法变换的特殊方法有哪些
虽然对编译原理了解不多,但是看到楼上那位答案,顺便留个脚印:
设G=(VN,VT,P,S),如果它的每个产生式α→β是这样一种结构:α∈( VN∪VT )*且至少含有一个非终结符,而β∈( VN∪VT )*,则G是一个0型文法。
0型文法也称短语文法。一个非常重要的理论结果是,0型文法的能力相当于图灵机(Turing)。或者说,任何0型语言都是递归可枚举的;反之,递归可枚举集必定是一个0型语言。
对0型文法产生式的形式作某些限制,以给出1,2和3型文法的定义。
设G=(VN,VT,P,S)为一文法,若P中的每一个产生式α→β均满足|β|≥|α| ,仅仅S→ε除外,则文法G是1型或上下文有关的。
在有些文献给的定义中,将上下文有关文法的产生式的形式描述为α1Aα2→α1βα2,其中α1、α2和β都在( VN∪VT )*中(即在V*中),β≠ε,A在VN中。这种定义与前边的定义等价。但它更能体现"上下文有关"这一术语,因为只有A出现在α1和α2的上下文中,才允许用β取代A。
设G=(VN,VT,P,S),若P中的每一个产生式α→β满足:α是一非终结符,β∈( VN∪VT )*则此文法称为2型的或上下文无关的。有时将2型文法的产生式表示为形如:A→β其中A∈VN,也就是说用β取代非终结符A时,与A所在的上下文无关,因此取名为上下文无关文法。
设G=(VN,VT,P,S),若P中的每一个产生式的形式都是A→aB或A→a,其中A和B都是非终结符,a是终结符,则G是3型文法或正规文法。
多数程序设计语言的单词的语法都能用正规文法或3型文法来描述。
3型文法G=(VN,VT,P,S)的P中的规则有两种形式:一种是前面定义的形式,即:A→aB或A→a其中A,B∈VN ,a∈VT*,另一种形式是:A→Ba或A→a,前者称为右线性文法,后者称为左线性文法。正规文法所描述的是VT*上的正规集。
四个文法类的定义是逐渐增加限制的,因此每一种正规文法都是上下文无关的,每一种上下文无关文法都是上下文有关的,而每一种上下文有关文法都是0型文法。称0型文法产生的语言为0型语言。上下文有关文法、上下文无关文法和正规文法产生的语言分别称为上下文有关语言、上下文无关语言和正规语言。
令G是一文法,S是文法的开始符号,αβδ是文法G的一个句型。如果有:
S αAδ且Aβ则称β是句型αβδ相对于非终结符A的短语。特别,如有Aβ则称β是句型αβδ相对于规则A→β的直接短语(也称简单短语)。一个句型的最左直接短语称为该句型的句柄。
文法中不得含有有害规则和多余规则
有害规则:形如U→U的产生式。会引起文法的二义性
多余规则:指文法中任何句子的推导都不会用到的规则
① 文法中某些非终结符不在任何规则的右部出现,该非终结符称为不可到达。
② 文法中某些非终结符,由它不能推出终结符号串,该非终结符称为不可终止。
‘拾’ 编译原理中#的意义
#后面应该是一个立即数