• 编译原理之理解文法和语言


    简介

      一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包括语法和语义两个方面。所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。目前广泛使用的手段是上下文无关文法,即用上下文无关文法作为程序设计语言语法的描述工具。语法只是定义什么样的符号序列是合法的,与这些符号的含义毫无关系,比如对于一个Pascal程序来说,一个上下文无关文法可以定义符号串A:=B+C是一个合乎语法的赋值语句,而A:=B+就不是。但是,如果B是实型的,而C是布尔型的,或者B、C中任何一个变量没有事先说明,则A:=B+C仍不是正确的程序,也就是说程序结构上的这种特点——类型匹配、变量作用域等是无法用上下文无关手段检查的,这些工作属于语义分析工作。程序设计语言的语义常常分为两类:静态语义和动态语义。静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的;动态语义也称作运行语义或执行语义,表明程序要做些什么,要计算什么。
      阐明语法的一个工具是文法,这是形式语言理论的基本概念之一。本章将介绍文法和语言的概念,重点讨论上下文无关文法及其句型分析中的有关问题。
    阐明语义要比阐明语法困难得多,尽管形式语义学的研究已取得重大进展,但是仍没有哪一种公认的形式系统可用来自动构造出正确的编译系统。本书不对形式语义学进行介绍。

    1.理解符号串与集合运算。

    L={A,B, … ,Z,a,b, … ,z}

    D={0,1, … ,9}

    说明下表示的含义:

    LUD L和D都是集合,那么LUD即为L的D的并集合,即L={A,B, … ,Z,a,b, … ,z,0,1, … ,9}

    LD =>> {xy | x∈L且y∈D}

    L4 L集合的4位组合即{AAAA, AAAB, ..., zzzz}

    L* 集合L的闭包

    D+ 表示D的正闭包

    L(LUD)* L并D的正闭包与L的乘积,即{xy | x∈L且y∈(LUD)*}

     

    2.文法G(Z):Z->aZb|ab定义的是什么样的语言?

     定义的是规则,也称作重写规则,产生式或生成式

    Z->aZb|abZ->aZb->aaZbb->aaabbb

    则:L(G) = {anbn | n > 1}

    3.写出教材22页例2.2中标识符的文法四元组形式(VN,NT,P,S)。

    2.2有文法G=(VNVTP,S)。

    其中,

    VN={标识符,字母,数字},

    VT={a,b,c... x,y,z,0,1... 9},

    P={<标识符>→<字母>

    <标识符>→<标识符><字母>

    <标识符>→<标识符><数字>

    <字母>→a

    <字母>→b

           ...

    <字母>→z

    <数字>→0

    <数字>→1

           ...

    <数字>→9}

    S=<标识符>

     

    解:由此例题可设<标识符>为I,<字母>为L,<数字>为D则

    P={I→L

    I→IL

    I→ID

    L→a

    L→b

      ...

    L→z

    D→0

    D→1

      ...

    D→9}

    S = I

    I-> L|IL|ID

    L-> a|b|c|...|x|y|z

    D-> 0|1|2|...|8|9

     

    4.写出下列表达式的最左推导、最右推导。

    G(E):

    E=> E + T | T

    T=>T * F | F

    F=>(E)| i

    • i*i+i

    最左推导:E => E + T => T+T => T*F+T => F*F+T => i*F+T => i*i+T => i*i+F => i*i+i

    推导:E => E + T => E+F => E+i => T+i => T*F+i => T*i+i => F*i+i => i*i+i

     

    • i+i*i

    最左推导:E => E + T => T+T => F + T => i + T*F => i + F*F => i + i*F => i+i*i

    推导:E => E + T => E + T*F => E + T*i => E + F*i => E + i*i => T +i*i => F+i*i => i+i*i

     

    • i+(i+i)

    最左推导:E => E + T => T+T => F + T => i + F => i+(E)=> i+(E+T) => i+(T+T) => i+(F+T) => i+(i+T) => i+(i+F) => i+(i+i)

    推导:E => E + T => E + (E) => E + (E) => E + (E+T) => E+(E+F)=> E+(E+i) => E+(T+i) => E+(F+i) => E+(i+i) => T+(i+i) => F+(i+i) => i+(i+i)

     

     

     注意观察最左和最右推导过程的不同。

  • 相关阅读:
    错误记录(一):VSCode
    【洛谷P4770】你的名字
    【洛谷P3177】树上染色
    【洛谷P3704】数字表格
    【CF762F】Tree nesting
    【洛谷P5064】等这场战争结束之后
    【洛谷P3346】诸神眷顾的幻想乡
    【BZOJ#2119】股市的预测
    UiPath数据抓取Data Scraping的介绍和使用
    UiPath录制器的介绍和使用
  • 原文地址:https://www.cnblogs.com/Rakers1024/p/11509796.html
Copyright © 2020-2023  润新知