小言_互联网的博客

第二章 高级语言及其语法描述

295人阅读  评论(0)

大佬传送门:https://blog.csdn.net/qq_42322103/article/details/104451674

与机器语言或汇编语言比较,高级语言的优点

  • 易于理解
  • 易于维护
  • 编写效率高
  • 易于移植

1. 程序语言定义(掌握)


程序语言由两方面定义:语法、语义

1.1 语法

  • 定义:一组规则,用它可以形成和产生一个合式 (well-formed(结构合理的)) 的程序。

  • 词法规则:单词符号的形成规则。

    • 单词符号是语言中具有独立意义的最基本结构
    • 一般包括:常数、标识符、基本字、算符、界符等。
    • 描述工具:有限自动机
  • 语法规则:语法单位的形成规则。

    • 语法单位通常包括:表达式、语句、分程序、过程、函 数、程序等 。
    • 描述工具:上下文无关文法
  • 语言的词法规则和语法规则定义了程序的形式结构。

1.2 语义

  • 定义:一组规则,用它可以定义一个程序的意义

1.3 关于程序

  • 程序:本质上说是描述一定数据的处理过程。

  • 程序语言的基本功能:描述数据和对数据的运算。


2. 高级语言的一般特性

2.1 高级语言的分类(了解)

  1. 强制式语言、过程式语言:必须把解答问题的过程清晰地描述出来。
  2. 应用式语言:注重程序所表示的功能,将问题的结构描述出来,尤其是递归结构。
  3. 基于规则的语言:检查一定的条件,当它满足值,则执行适当的动作。
  4. 面向对象语言:封装性、继承性和多态性。

2.2 程序结构(了解)

  1. 如FORTRAN语言,非嵌套、非递归结构
  2. 如PASCAL语言,可以嵌套和递归,允许动态申请和释放内存
  3. 如ADA语言,一个程序包分为两部分,可见的规范说明部分,它定义了程序包外面可以访问的对象,程序包体部分,它实际定义程序包的实现细节。封装。
  4. 如JAVA语言,面向对象的高级语言,注意ADA语言不能称为面向对象语言是因为ADA语言不支持多态等。
  • 作用域:一个名字能被使用的区域范围称作这个名字的作用域。
  • 名字作用域规则—— " 最近嵌套原则 "

2.3 数据类型与操作(掌握)

  • 一个数据类型通常包括三种要素

    1. 用于区别这种类型数据对象的属性
    2. 这种类型的数据对象可以具有的
    3. 可以作用于这种类型的数据对象的操作
  • 初等数据类型

    1. 数值类型
    2. 逻辑类型
    3. 字符类型
    4. 指针类型
  • 标识符与名字

    • 标识符:以字母开头的,由字母数字组成的字符串。

    • 标识符名字两者有本质区别

    1. 标识符是语法概念。

    2. 名字有确切的意义和属性。

  • 名字

    • :单元中的内容
    • 属性:类型和作用域
  • 数组


  • 其他数据类型

    • 字符串:符号处理、公式处理

    • 表格:本质上是一种记录结构

    • 线性表:一组顺序化的记录结构

    • :一种线性表,后进先出, POP, PUSH

  • 抽象数据类型

2.4 语句与控制结构(掌握)

  • 表达式
    表达式由运算量(也称操作数,即数据引用或函数调用)和算符操作符)组成。
  • 算符的优先次序

    如对于A+B+C,在计算机上先算A+B和先算B+C结果可能不同。
  • 语句
    • 赋值语句
      • A = B
      • 名字左值(如A):该名字代表的那个单元 ( 地址 ) 称为该名字的左值 ( 所代表的存贮单元的地址 )。
      • 右值(如B):一个名字的值称为该名字的右值 ( 所代表的存贮单元的内容 )。
      • 例题:a+5是计算一个值,在编译实现时会存储在一个临时单元中,但是程序员并不能引用这个单元,所以a+5只有右值不具有左值。
    • 控制语句
      • 无条件转移语句:goto
      • 条件语句 if
      • 循环语句 for
      • 过程调用语句 call
      • 返回语句 return
    • 说明语句
      定义各种不同数据类型的变量或运算,定义名字的性质。
    • 简单句和复合句
      • 简单句
        不包含其他语句成分的基本句。
      • 复合句
        局中有句的语句。

3. 程序语言的语法描述

几个概念

  • 考虑一个有穷字母表字符集 ∑ ∑

  • 其中每一个元素称为一个字符

  • ∑ ∑ 上的 ( 也叫字符串 ) 是指由 ∑ ∑ 中的字符所构成的 一个有穷序列

  • 不包含任何字符的序列称为空字,记为 ε ε ε

  • ∑ ∗ ∑ * 表示∑上的所有字的全体,包含空字 ε ε ε

  • 例如 : 设 ∑ ∑ = { a , b a , b ab } ,则

    ∑ ∗ ∑* = { ε , a , b , a a , a b , b a , b b , a a a , . . . ε,a,b,aa,ab,ba,bb,aaa,... ε,a,b,aa,ab,ba,bb,aaa,... }


    注意:如果V中没有空字,那么V的正规闭包比闭包少一个空字,如果V中本来有空字,那么两者没区别。

3.1 上下文无关文法(重点)

文法:描述语言的语法结构的形式规则。

产生式(也称产生规则或简称规则):是定义语法范畴的一种书写规则。

终结符:是组成语言的基本符号,是一个语言的不可再分的基本符号,对于上下文无关文法来说只出现在产生式右部。

非终结符:代表了语法范畴,我理解为可以再分的元素。注意范畴不是“范围”,例如,“算术表达式”、“布尔表达式”、“賦值句”、“分程序”、“过程”等,它们都是现今程序语言常见的语法范畴注意:上下文无关文法产生式左边只能有一个非终结符。

由文法产生语言句子的基本思想是: 从识别符号开始,把当前产生的符号串中的非终结符号替换为相应规则右部的符号串,直到最终全由终结符号组成。这种替换过程称为推导或产生句子的过程,每一步成为直接推导或直接产生。

直接推出

推导

一般化

句型、句子、语言

两个例子

注意G(S)代表一个文法G,开始符号是S,而L(G)代表文法G所产生的语言。


逆推,这个例子与上个例子的不同是ab的次数是相同的,所以不能像上例一样分开写。

这个例子主要是m有范围是[n,2n],所以还是不能分开,只能像上例一样ab组合一起。

最左推导、最右推导

3.2 语法分析树和二义性(重点)



语法树的构造是从文法的开始符号出发,构造一个推导的过程,因为文法的每一个句型(句子)都存在一个推导,所以对应文法中任一句型的推导序列,总能构造一棵语法树。

一棵语法树表示一个句型的种种可能的(但未必是所有的)不同推导过程。

但是一个句型未必只对应一颗语法树



对于算术表达式,虽然上面这个文法是二义的,但是下面这个文法确是无二义的,说明算术表达式是无二义的,这是符合常识的,只是上面这个文法有问题。


只要满足这两个式子,说明这个P一定会出现在某个句子的推导中,那么它就是有用的。

3.3 形式语言鸟瞰(了解)




注意:2型文法左边只能有一个非终结符。




我的思考
可以试着构建G(S):
S → \rightarrow c | aSa | bSb | aSb | bSa

但是你会发现这个文法所产生的语言包含的句子远多于题目要求的,所以不正确,0型文法怎么写暂时没想到。


转载:https://blog.csdn.net/weixin_43820118/article/details/113995078
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场