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


    前言

      一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具。语法只是定义什么样的符号序列是合法的,与这此符导的含义落无关系,比如对于个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的直接短语(也称简单短语)。一个右句型的直接短语称为该句型的句柄。句柄的概念只适合于右句型。

     

    句型的分析

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

    附加练习 尝试写出PL/0 语言的文法。(或者你认为比较好的语言规则)

    程序  ::= [<常量说明部分>] [<变量说明部分>] [<过程说明部分>] <语句>

    <常量说明部分> ::= CONST<常量定义>{ ,<常量定义>};

    <常量定义> ::= <标识符>=<无符号整数>

    <无符号整数> ::= <数字>{<数字>}

    <数字> ::= 0 | 1 | 2…7 | 8 | 9

    标识符i   i ::=<字母> | {<字母> | <数字 >}

    表达式e  e ::= [+|-]<项>{<加减运算符><项>}

    条件语句  ::= if<条件>then<语句>

    赋值语句  ::= <标识符id> := <表达式>

    复合语句  ::= begin<语句>{;<语句>}end

    函数  ::= <类型说明><函数名><复合语句>

  • 相关阅读:
    Spring 框架的概述以及Spring中基于XML的IOC配置
    SpringBoot(1)
    C/C++经典程序之打印三角形
    C++构造函数详解(复制构造函数)
    利用函数模板计算并返回数组d 中size个元素的平方和
    C++模板之typename和class关键字的区别
    构造函数与成员函数的区别?
    为什么多数穷人很难逆袭成功
    用递归方式求解这个问题:一只母兔从四岁开始每年生一只小母兔,按此规律,第n年有多少只母兔?
    编写一个函数 reverseDigit(int num).该函数读入一个整数,然后将这个整数的每个位上的数字逆序输出。
  • 原文地址:https://www.cnblogs.com/Rakers1024/p/11583601.html
Copyright © 2020-2023  润新知