编译原理之文法和语言总结与梳理

前言

  一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具。语法只是定义什么样的符号序列是合法的,与这此符导的含义落无关系,比如对于个Pascal程序来说,一个上下文无关文法可以定义符号串A:一B+C是一个合乎语法的默值语句,而A:=B+就不是。但是,如果B是实型的,而C是布尔理的,或者B、C中任何一个变量没有事先说明,则A:=B+C仍不是正确的程序,也就是说程序结构上的这种特点—类型匹配、变量作用域等是无法用上下文无关手段检查的,这些工作属于语义分析工作。程序设计语言的语义常常分为两类:静态语义和动态语义。静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的;动悉语又也称作运行语义或执行语义,表明程序要做些什么,要计算什么。

  阐明语法的一个工具是文法,这是形式语言理论的基本概念之一。本章将介绍文法和语言的概念,重点讨论上下文无关文法及其句型分析中的有关问题。

  阐明语义要比阐明语法困难得多,尽管形式语义学的研究已取得重大进展,但是仍没有哪一种公认的形式系统可用来自动构造出正确的编译系统。本书不对形式语义学进行介绍。

文法的直观概念

  在给出文法和语言的形式定义之前,先直观地认识一下文法的概念。

  当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷多个句子的语言来讲,存在着如何给出它的有穷表示的问题。

  以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明(或者定义)句子的组成结构,如“我是大学生”是汉语的一个句子。汉语句子可以由主部后随请活而成,构成谓语的是动词和直接宾话,采用EBNF来表示这种句子的构成规则:

<句子>::=<主语><谓语>

<主语>::=<代词> | <名词>

<代词>::=我 | 你 | 他

<谓语>::=<动词><直接宾语>

<动词>::=是 | 学习

<直接宾语>::=<代词><名词>

符号和符号串

  正如英语是由句子组成的集合,而句子又是由单词和标点符号组成的序列那样,程序设计语言Pascal或C语言是由一切Pascal程序或C程序所组成的集合,而程序是由类似i、begin、end的符号以及字母和数字这样一些基本符号所组成,从字面上看,每个程序都是一个“基本符号”串,假设有一个基本符号集,那么Pascal或C语言可看成是在这个基本符号集上定义的、按一定规则构成的一切基本符号串组成的集合。为了给出语言的形式定义,首先讨论符号和符号串的有关概念。

文法和语言的形式

  规则,也称重写规则产生式生成式,是形如a→b或a::=b的(a,b)有序对,其中。称为规则的左部,β称作规则的右部。这里使用的符号→(::=)读作“定义为”。例如A→a读作“A定义为a”。也把它说成是一条关于A的规则(产生式)。

文法的类型

  自从乔姆斯基(Chomsky)于1956年建立形式语言的描述以来,形式语言的理论发展很快。这种理论对计算机科学有着深刻的影响,特别是对程序设计语言的设计、编译方法和计算复杂性等方面更有重大的作用。

  乔姆斯基把文法分成4种类型,即0(文法)1(上下文有关的)2(上下文无关的)3(正规文法)。这几类文法的差别在于对产生式施加不同的限制。

定义 令G是一个文法,S是文法的开始符号,abo的是文法G的一个句型。如果有S-*→aAo且(A-+→b测标b是句型abo相对于非终结符A的短语。特别地,如果有(A→β是句型abo相对于规则A→b的直接短语(也称简单短语)。一个右句型的直接短语称为该句型的句柄。句柄的概念只适合于右句型。

 

句型的分析

  对于上下文无关文法,语法树是句型推导过程的几何表示。语法树确实将所给句型的结构很直观地显示出来了。语法树是句型结构分析的极好工具。而这里所说的句型分析问题,是说如何知道所给定的符号串是文法的句型。句型的分析就早识别一个符号串是否为某文法的句型,是某个推导的构造过程。进一步说,当给定一个符号串时,试图按照某文法的规则为该符号串构造推导或语法树,以此识别出它是该文法的一个句型;当符号串全部由终结符号组成时,就是识别它是不是某文法的句子。因此也有人把语法树称为语法分析树分析树。对于程序设计语言来说,要识别的是程序设计语言的程序,程序是定义程序设计语言的文法的句子。句型分析是一个识别输入符号串是否为语法十正确的程序的过程。在语言的编译实现中,把完成句型分析的程序称为分析程序识别程序,分析算法又称识别算法。

原文地址:https://www.cnblogs.com/Rakers1024/p/11583601.html

时间: 2024-10-12 14:55:00

编译原理之文法和语言总结与梳理的相关文章

编译原理:文法和语言总结与梳理

1. 梳理第二章的内容,写一篇理解与总结. 一. 对程序设计语言的描述从语法.语义和语用三个因素考虑: 语法:对语言结构的定义: 语义:语言的含义: 语用:从使用的角度描述语言. 形式语言理论是编译的理论基础. 二. 字母表:元素的非空有穷集合: 符号/字符:字母表中的元素: 符号串:符号的有穷序列. 三. 符号串运算: 符号串的连接:εx=xε=x: 集合的乘积:AB={xy|x∈A,y∈B}:{ε}A=A{ε}=A: 符号串的幂运算:x=abc,x^2=abcabc; 集合的幂运算 正闭包A

编译原理的文法与语言

理解符号串与集合运算. L={A,B, … ,Z,a,b, … ,z} D={0,1, … ,9} 说明下表示的含义: LUD :全部字母和数字的结合的一个集合 LD :由一个字母后跟一个数字组成的所有符号串的集合 L4:由4个字母组成的所有符号串的集合 L*:由字母组成的所有符号串包括空符号串ξ的集合 D+:由一个或到九个数字全组成的符号串的集合 L(LUD)*:以字母开头,后跟字母或数字组成的所有符号串的集合 文法G(Z):Z->aZb|ab定义的是什么样的语言? Z->aZb|ab Z-

编译原理学习:TINY语言词法扫描程序实现

最近对解释型程序(类似python或者是linux里的bc计算器)非常感兴趣,就开始学习一下编译原理.今天自己实现了TINY语言的词法扫描程序.大部分参考<编译原理及实践>一书.但是我做了一些小小的改进. 先说一下TINY语言: 1.注释:放在一对大括号内.书上的注释不能嵌套,我做了一点改进,允许嵌套. 2.关键字:read write if end repeat until else 3.类型:只支持整型和布尔型. 4.计算:+ - * / ( ) < = :=,其中:=为赋值运算,=

4.文法和语言总结与梳理

1.梳理第二章的内容,写一篇理解与总结. 第二章首先介绍了文法的相关概念以及概念的推导过程,接着介绍了符号和符号串,其中字母表的定义为元素非空有穷集合,字符串为由字母表中的符号组成的任何有穷序列.接着介绍字符串的一些运算,例如:符号串的头尾,固有头和固有尾:符号串的连接:符号串的方幂:符号串集合.文法和语言的形式定义:文法G定义为四元组(VN,VT,P,S),其中VN为非终结符,VT为终结符,P为规则(a→ß)的集合.S为识别符或开始符,不是终结符,至少有一条出现在左边. 文法的类型有四种:0型

文法和语言总结与梳理

1. 梳理第二章的内容,写一篇理解与总结. 第二章主要讲述了文法的直观概念,符号和符号串,文法和语言的形式定义,文法的类型,上下文无关语法及其语法树 句型的分析,自订向下的分析方法,自底向上的分析方法,限制文法中不得含有有害规则和多余规则,在形式语言中, 最右推导常被称为规范推导,由规范推导所得的句型称为右句型或规范句型,而且一个文法存在某个句子对应两颗 不同的语法树,则这个文法是二义的. 2. 尝试写出PL/0 语言的文法.(或者你认为比较好的语言规则) 整数n 标识符i 表达式e 条件语句

编译原理学习(5)文法和语言总结与梳理

梳理第二章的内容,写一篇理解与总结. 文法: 以有穷的集合刻画无穷的集合的一个工具.用规则来说明句子的组成结构,用来表示无穷句子的语言描述. 句子与句型: 如果符号串x是由起始符号推导出的,则称x是文法G[S]的句型. 如果x中只包含终结符,则称x是文法G[S]的句子. 文法描述的语言是该文法一切句子的集合. 四种文法: 0型文法:α→β,其中α至少包含一个非终结符. 1型文法(上下文有关文法):α→β,其中|β|≥|α|,S→ε除外. 2型文法(上下文无关文法):a→β,其中a是一个非终结符.

小白说编译原理-9-最简单minus-c语言编译器

简介 继上节8说到利用手动构建的语法树解析下面的c语言代码: a = 1 sum = 0 input(x) while(a <= x){ sum = sum + a a = a+1; } print(sum) 而一个编译器不应该依赖用户去手动构建对应语言的语法树,我们需要的是一种支持自动构建语法树的策略.本节将要说明的就是如何利用前面1-6节学到的lex,yacc以及符号表,7-8节学到的语法树来支持给定c语言代码自动构建过程. 动机 在第5节变量支持的计算器中,对于expr的语法解析有如下的y

编译原理LL1文法分析树(绘图过程)算法实现

import hjzgg.analysistable.AnalysisTable; import hjzgg.first.First; import hjzgg.follow.Follow; import hjzgg.treenode.TreeNode; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Grap

编译原理 LL1文法First集算法实现

import java.util.LinkedHashMap; import java.util.Map; import java.util.Set; import java.util.TreeMap; import java.util.TreeSet; public class First { private Map<String, Set<Character>> first = new TreeMap<String, Set<Character>>();