程序设计语言编译原理

一,引言

    翻译程序:它是一个程序,能把一种语言程序转换成另外一种语言程序,且二者在逻辑上是等价的。这两种语言分别称为源语言目标语言

    编译程序:一种翻译程序,它的源语言是“高级语言”(C,Java,Pascal),目标语言是“低级语言”(汇编语言,机器语言)。

    编译前端:与源语言有关,与目标机无关;编译后端:与源语言无关,与目标机有关。

二,高级语言及其语法描述

    2.1,程序语言的定义

        2.1.1,语法

            任何语言程序都可以看成是一定字符集(称为字母表)上的一字符串(有限序列)。主要由语法和语义两个方面定义。

            (1)词法规则:单词符号的形成规则。也就是规定了字母表组成的那些字符串是一个单词符号。

                【注】:单词符号:常数、标识符、基本字、算符和界符(正规式和有限自动机理论)

            (2)语法规则:是语法单位的形成规则。也就是规定了如何从单词符号形成更大的语法单位。

                【注】:语法单位:表达式、语句、分程序、函数、过程和程序(上下文无关文法)

           2.1.2语义

                    语义:可以定义程序意义的规则。这些规则称为语义规则。

    2.2高级语言的一般特性

          2.2.1高级语言的分类

1、强制性语言,也称过程式语言,命令驱动,面向语句。如FORTRAN、C、Pascal、Ada

2、应用式语言,从已有的函数出发构造出更复杂的函数。如LISP和ML。

3、基于规则的语言,检查一定的条件,当它满足值,则执行适当的动作。如Prolog。

4、面向对象语言,主要特性是支持封装性、继承性和多态性。如Java, C++

四,语法分析

    4.1语法分析器的功能

        语法的语法结构用上下文无关文法描述;

        语法分析器是按文法的产生式,识别输入的符号串是否为一个句子;

        文法的句子:看是否从文法开始符号推导出该串,或根据该文法可以建立一颗与该串匹配的语法分析树。

        语法分析方法有两种:自上而下分析法和自下而上分析法;

4.2自上而下分析面临的问题

    主旨:对一个输入串,从文法的开始符号(树根)出发,采用一切可能的办法,从上而下的为输入串建立一颗语法树;

    本质上:试探性的过程

    左递归: 分为直接左递归和间接左递归, 即文法存在非终结符 P,使得 P => Pα。左递归会使自上而下分析无限循环

  回溯:浪费分析时间,不成功时难于知道出错位置

  解决办法:取消左递归和取消回溯

4.3.1左递归的消除

 

   一般定义: 

   P -> Pα1|Pα2|…|Pαm |β1 |β2|…|βn,其中每个α均不等于ε,每个β不以P开头,则:P ->β1P’|β2P’|…|βnP’

   P’->α1P’|α2P’|…|αmP’|ε

   例如:S->Sc|Sabc|abc|bc|c取消左递归,S->abcS'|bcS'|cS',S'->cS'|abcS'|ε

消除文法中一切左递归的方法:

步骤:①将文法中所有非终结符按某一顺序排列P1、P2…Pn
     ②变为直接左递归(即,对于Pi,若存在Pj,j < i,且有产生式Pi->Pjr, Pj->δ1|δ2 |…|δk,则改写Pi的产生式为Pi-        >δ1r|δ2r|…|δkr),再消除直接左递归

     ③化简② 所得的产生式,即从开始符号出发永远无法到达的非终结符的产生规则。

4.3.2 消除回溯,提公因子

    消除回溯须保证:(1) 对文法的非终结符匹配输入串时,能根据所面临的输入符号准确地指派一个候选产生式。

                    (2) 若候选获得成功匹配,则这种匹配不会是虚假的;若此候选无法完成任务,则其他候选也肯定无法完                          成。

    引入文法有关的函数: FIRST (α)={a | α => a…, a属于 VT} ,即α的所有可能推导的开头终结符

    FIRST集合计算方法:
      (1) 若X->a.., 则将终结符 a 加入FIRST(X)中
      (2) 若X->ε,则将  加入FIRST(X)中

      (3) 若X->Y…,且Y属于非终结符,则将  FIRST(Y)\{}加入到FIRST(X)中

      (4) 若X->Y1Y2..YK,且Y1,Y2,..Yi-1都是非终结符,且Y1,Y2,..Yi-1的FIRST集合中均包含ε,则将FIRST(Yj) ,(                   j=1,2,..i) 的所有非元素加入到FIRST(X)中.特别地,若Y1~YK均有ε产生式,则将ε加到FIRST(X)中。

   提取公因子:有左因子的文法     A ->αβ1 | αβ2  等价于A->α(β1|β2) 提左因子:A->αA' A'->β1|β2

4.3.3LL(1)分析条件

    一个文法:不含左递归,每个非终结符的所有候选首符集两两不相交

    引入文法有关的函数:S为文法G开始符号,对于非终结符A  
                         FOLLOW(A)={ a  |S ...Aa...,a VT , A VN },特别的,若S ...A,则#  FOLLOW(A)

                         即句型中紧接A之后的终结符或#

    FOLLOW集合计算方法

        (1)对文法开始符号S, 置#于FOLLOW(S)中

        (2)若有AB,则将FIRST() \{}加入FOLLOW(B)中。 (此处 可以为空)

        (3) 若A B 或A B ,且  * (即 属于FIRST()),则将 FOLLOW(A)加入FOLLOW(B)中(此处 可以为                 空)。

 

你可能感兴趣的:(编译原理,考试必备,专业基础)