文章目录

  • 一、程序语言的定义
    • 1.语法
    • 2.语义
  • 二、高级语言的一般特性
    • 1.高级语言的分类
    • 2.程序结构
      • 2.1 FORTRAN
      • 2.2 Pascal
      • 2.3 Ada
      • 2.4 JAVA
    • 3.数据类型与操作
    • 4.语句与控制结构
  • 三、程序语言的语法描述
    • 1.上下文无关文法
    • 2.语法分析树和二义性
    • 3.形式语言鸟瞰

一、程序语言的定义

程序语言是一个记号系统,主要有语法、语义和语用等三方面定义。

语法(Syntax) 定义语言的词法和语法的形式规则。
语义(Semantic) 定义语言的单词符号和语法单位的意义。
语用(Pragmatic) 定义程序设计技术和语言成分的使用方法,它使语言的基本概念与语言的外界联系起来。

1.语法

任何语言程序都可看成是一定字符集上的一个字符串(有限序列)。

一个语言的语法规则定义了程序的形式结构。

语法规则是指这样的一组规则,用它可以形成和产生一合式(合法)的程序。这些规则的一部分称为词法规则,另一部分称为语法规则(或产生规则)。

单词符号是语言中具有独立意义的最基本结构。
词法规则定义了程序中单词符号的形成规则。即字母表中的哪些字符可以构成一个合法的单词。
单词符号包括:常量、标识符、基本字、界符、运算符
描述词法规则的有效工具:正规式、正规文法、有限自动机

例如: 字符串 0.5 * x+c
单词符号: 0.5 x c * +
语法单位: 0.5*x+c

语法规则规定了如何从单词符号串中形成更大的结构(即语法单位)。它是语法单位的形成规则。
语法单位包括:表达式、语句、分程序、函数、过程、程序。
描述语法规则的有效工具:上下文无关文法、BNF(Backus Naur Form)

2.语义

语义规则是指这样的一组规则,使用它可以定义一个程序的意义。
描述语义规则的工具:基于属性文法的语法制导翻译方法

所谓程序,是描述一定数据的处理过程,即包括描述数据和对数据的运算两个功能。
程序的层次结构如下图

二、高级语言的一般特性

1.高级语言的分类

从语言范型,程序设计语言分四类:

●强制式语言(Imperative Language) C, FORTRAN…

●应用式语言(Applicative Language) LISP…

●基于规则的语言(Rule-based Language)Prolog…

●面向对象语言(Object-Oriented

2.程序结构

一个高级语言程序通常由若干子程序段(过程、函数)构造。许多语言还引入了类、程序包等更高级的结构。

2.1 FORTRAN

一个Fortran程序由一个主程序和若干个辅程序段组成。

        PROGRAM  MAIN    ……ENDSUBROUTINE  SUB1……ENDSUBROUTINE  SUB1……END

2.2 Pascal

Pascal是一个允许子程序嵌套的语言。

    Program EX……                                         {说明部分}procedure P1;……procedure p11;……   begin…… end;begin……end;Begin……                                   {执行语句部分}End.

2.3 Ada

在Ada语言中引入了程序包(Package),它可以把数据和操作代码封装在一起,支持数据抽象。一个程序包有两部分:
可见的规范说明
定义程序包外面可以访问的对象。
程序包体
定义程序包的实现细节。

2.4 JAVA

Java是一种面向对象的高级程序语言,它很重要的方面是(Class)及继承(Inheritance)的概念。
同时支持多态性(Polymorphism)和动态绑定(Dynamic binding)等特性。

3.数据类型与操作

一个数据类型通常包括以下三个要素:

● 用于区别这种类型的数据对象的属性;
(类型名,作用域)
● 这种类型的数据对象可以具有的值;
( 取值范围 )
● 可以作用于这种类型的数据对象的操作。
(运算符)

一、初等数据类型: 数值数据、逻辑数据、字符数据、指针类型
二、复合数据类型: 数组、记录、字符串、表格、栈和队列
三、抽象数据类型
一个抽象数据类型包括:
(1)数据对象的一个集合;
(2)作用于这些数据对象的抽象运算的集合;
(3)类型对象的封装。

4.语句与控制结构

表达式
表达式是由运算量和运算符组成的。运算量亦称操作数,即数据引用或函数调用;运算符有算术运算符、逻辑运算符、关系运算符等,运算符之间有规定的优先级和结合性。

表达式的形成规则:
(1)变量、常量是表达式;
(2)若E1,E2为表达式,是二元运算符,
则 E1  E2 也是表达式;
(3)若E为表达式,是一元运算符,则  E (或E )
也 是表达式;
(4) 若E为表达式,则 ( E )也是表达式。

语句
1、赋值句
2、控制语句
无条件转移语句
条件语句
循环语句
过程(或函数)调用语句
返回语句
3、说明句
4、简单句和复合句

三、程序语言的语法描述

基本概念
设∑是一个有穷字母表,它的每个元素称为一个符号。 ∑上的一个符号串是指由∑中的符号所构成的一个有穷序列。不包含任何符号的序列称为空字,记为ε 。
∑*表示∑上的所有符号串组成的集合。空字ε也包括在其中。
Φ 表示不含任何元素的空集 { } 。

●∑ * 的子集U和V的(连接)积定义为
UV = {αβ | α∈U & β∈V }
即集合UV中的符号串是由U和V的符号串连接而成的。
● V自身的n次积(连接)记为
V^n = VV …V
●规定V^0 = {ε}
V* = V^0 U V^1 U V^2 U V^3 U
称 V* 是V的闭包。
● V + = VV* 称 V+是V的正则闭包。
例如 若 ∑ = { a , b }
则 ∑* = {ε,a,b,aa,ab,ba,bb,aaa , … }

1.上下文无关文法

文法是描述语言语法结构的形式规则,即语法规则。
语法规则必须是正确的,且易于理解。
上下文无关文法是这样一种文法,它所定义的语法范畴是完全独立于这种范畴所可能出现的环境的。
以后,凡“文法”一词若无特别说明,则均指上下文无关文法。

例如:英文的语法规则:

“→ ”表示“由…组成”或“定义为”。
有时,“→” 也用 “ ::= ”表示,后者为巴科斯范式(BNF),前者为其简化表示。

例如: 判断He gave me a book.是否为正确句子


利用文法描述程序设计语言
文法为程序设计语言提供了精确、易懂的语法规则;
从文法出发,可以自动构造一个有效的语法分析器;
设计合理的文法使程序设计语言具有良好的结构;
基于文法描述的程序设计语言便于实现扩展。

归纳起来,一个上下文无关文法包括四个组成部分:

  一组终结符号     如:me ,book,gave 等一组非终结符号   如:<主语>,<谓语> 等一个开始符号     如: <句子>一组产生式      如:<间接宾语> → <代词><直接宾语> → <冠词> <名词>

上下文无关文法的定义

形式上说,一个上下文无关文法G是一个四元式:
G=(VT,VN,S,P),其中: VT是一个非空有限集,它的每个元素为终结符号; VN是一个非空有限集,它的每个元素为非终结符号, 且VT∩VN= Φ
S 是一个非终结符号,称为开始符号;
P是产生式有限集合,形如P→α
其中:P ∈ VN, α∈(VT U VN)*。
注: 开始符号S是一个特殊的非终结符号,它至少必须在某个产生式的左部出现一次。

若产生式的左部相同,则可以合并:

例如:
P→ α1
P→ α2

P→ αn 可合并为:
P→α1|α2| … |αn 其中:每个αi 称为P的一个侯选式
“ →” 读为 “定义为”
“|” 读为 “或”

约定

  1. 大写字母A、B、C……或汉语词组通常代表非终结符;
  2. 小写字母a、b、c……代表终结符;
  3. α、β、γ……代表(VT U VN)*

例如:下面是一个上下文无关文法。
G(E):
E → i | EAE
A → * | +
其中,E、A是非终结符,E是开始符号,i、+、* 是终结符

例如:算术表达式的定义
1.常量5、变量i是算术表达式;
2.若E1,E2是算术表达式,则 E1+E2, E1*E2, (E1)也是算术表达式。
用产生式来描述 G(E):
E → E + E
E → E﹡E
E → (E)
E → i
E → 5
即:E→ E+E | E * E | (E) | i | 5

一个上下文无关文法是如何定义一个语言呢?

从开始符号出发,反复连续使用产生式,对非终结符施行替换和展开,直到推导的字符串全由终结符组成(即句子),所有句子的集合即为该文法定义的语言。

例如:文法G(S):
S → AB
A → a | aA
B → b | Bb
则该文法定义的语言为:
L(G)={ a^m b^n | m , n > 0 }

例题 证明 i+5 是一个算术表达式
证明:

  E => E+E              ( 根据 E-> E+E)=> i+E                ( 根据 E-> i     ) => i+5                 ( 根据 E-> 5    )

故 i+5 是算术表达式。
解释:=> 表示仅使用一次规则的一步推导。

术语




最左推导和最右推导

最左推导: 是指任何一步 α=> β推导都是对 α 的最左非终结符进行替换的。
最右推导:是指任何一步 α=> β 推导都是对 β 的最右非终结符进行替换的。
例如:写出句型 (i + i * i) 的最左推导。
解:E=> (E) => (E+E) => (i+E)
=> (i+E * E) => (i+i * E) => (i+i*i)

2.语法分析树和二义性

语法分析树也可以描述一个句型的推导。
语法分析树的根由开始符号所标记
随着推导的展开,当某个非终结符被它的某个候选式所替换时 ,就产生下一代新结点,候选式中自左自右的每个字符对应一个新结点。
在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末(叶子)自左自右排列起来就是一个句型。


文法的二义性

一棵语法树是一个句型的种种不同推导过程的共性抽象,是它们的代表。
一棵语法树完全等价于一个最左(右)推导。

在一个文法中,若存在某个句子有两个不同的最左推导,则称该文法是二义的。
或者说,
在一个文法中,若存在某个句子有两棵不同的语法树,则称该文法是二义的。

注 文法的二义性问题是不可判断的。
即,不存在一个算法,它能在有限步内判断一个文法是否是二义的。

约定
作为描述程序语言的文法,有以下几点限制:
(1) 不能有任何产生式 : P -> P
(2) 每个非终结符P必须都有用处。即,必须存在含P的句型: S=>……=>α P β
且 P=>……=> γ ( γ∈VT*)

3.形式语言鸟瞰

Chomsky把文法分成四种类型,即0型、1型、2型和3型。这几类文法的差别,在于对产生式的形式施加了不同的限制。从0型到3型依次增强,但它们表达语言的能力则依次减弱。

设G=(VT,VN,S,P)是0型文法,如果它的每个产生式:
α→β
其中: α ,β ∈( VT U VN )*
且α中至少含有一个符号A∈ VN,

0型文法又称为短语文法。

对0型文法施加第 i 条限制,就得到 i 型文法:
(1) |α| ≤ |β|,仅S→ε 除外但S不能出现在任何产生式右部。
(2) G的任何产生式为: P→ α
其中: P ∈ VN, α ∈(VT U VN) * 。
(3) G的任何产生式为: A→αB 或 A→α
其中: A,B ∈ VN, α∈VT*

1型文法又称为上下文有关文法。
2型文法又称为上下文无关文法。
3型文法又称为正则(规)文法(或 线性文法)。
(1) 若3型文法产生式的形式为:
A→αB 或 A→α 则称为右线性文法。
(2)若3型文法产生式的形式为:
A→Bα 或 A→α 则称为左线性文法。




02高级语言及其语法描述相关推荐

  1. 高级语言及其语法描述

    高级语言及其语法描述 本章内容概述了高级程序的结构和主要的共同特征,并介绍程序语言的语法描述方法.全部内容分为三个部分,分别为程序语言的定义.高级语言的一般特性和程序语言的语法描述. 一.程序语言的定 ...

  2. 【编译原理】高级语言及其语法描述

    文章目录 高级语宫及其语法描述 (一)程序语言的定义 (二)高级语言的一般特性 1.高级语言的分类 2.数据类型与操作 3.语句与控制结构 (三)程序语言的语法描述 1.几个重要概念 2.上下文无关文 ...

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

    编译程序的工作过程一般可以划分为五个阶段:词法分析.语法分析.语义分析.中间代码的产生.优化.目标代码的生成. 1.语法三个基本概念: (1)字母表:有限字符集(类比组成单词的字母.组成词语的汉字). ...

  4. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  5. Python语言语法描述规范BNF介绍

    Python语言语法描述规范BNF介绍 读官方的 Python 语言参考(The Python Language Reference)需要了解BNF. BNF(Backus Normal Form:巴 ...

  6. 编译原理:高级程序设计语言的语法描述

    true beginning 高级程序设计语言的语法描述 文法:描述语言的语法结构的形式规则 比如在自然语言中 <句子> → <主语><谓语><直接宾语> ...

  7. Java基础-02(基础语法)

    Java基础-02(基础语法) 一 注释 加粗样式 注释用来解释和说明程序的文字,注释是不会被执行的. 1.1单行注释 //这是一条单行注释 public int i; 1.2多行注释 /* 这是 * ...

  8. Java精炼语言语法描述

    学习hadoop---Java初级快速入门指导(2) http://www.aboutyun.com/thread-6921-1-1.html (出处: about云开发) 阅读本文可以带着下面问题: ...

  9. 02 Java基础语法(变量+数据类型+运算符)

    Java基础语法 2 基础语法 2.1 二进制(复习总结) 进制转换(二进制 八进制 十进制 十六进制) 2.2 变量 2.2.1 变量定义 2.2.2 使用变量 2.2.3 声明变量的3种方式 2. ...

最新文章

  1. python3里的pillow怎么安装_“python安装pillow教程“python3.4怎么安装pil
  2. 迷倒高斯、费马、欧拉的女王,竟是低调的她
  3. DSP学习初阶的一些笔记
  4. 竹笋炒肉 I18N和L10N
  5. 请求nginx静态资源报403
  6. java 值栈的结构_Struts2 | 深入浅出理解struts2中的值栈
  7. Unity运行时刻资源管理
  8. 通讯录c语言以文本文件保存,学C三个月了,学了文件,用C语言写了个通讯录程序...
  9. ngxin做http强制跳转https,接口的POST请求变成了GET
  10. JPA 单元测试配置
  11. Android Socket通信
  12. 深圳地方坐标系转WGS84坐标系
  13. BZOJ1857: [Scoi2010]传送带(三分套三分)
  14. 分析微信聊天记录(2)——分析单人的微信聊天记录
  15. 智能合约节省GAS的小技巧:避免使用>=和<=
  16. 我不是领导,用考虑数字化转型么?
  17. 数据分析师成长路径-第一阶段
  18. 美团机器学习实践 密码_机器学习遇到密码学的地方
  19. 手机怎么压缩照片?手机压缩照片方法分享
  20. 【5】数据结构与算法--- 算法 进阶

热门文章

  1. 511遇见易语言递归寻找文件及枚举子目录
  2. windows连不上网解决办法(当360网络急救箱,网络重置,疑难解答无效时可以使用)
  3. HTML 下拉框
  4. android棋类计时器,棋类游戏计时器
  5. Macbook M1安装OpenCV
  6. python怎么更新setuptools_Python打包之setuptools
  7. jstree 选中指定节点-yellowcong
  8. Docker精华问答 | Docker commit如何用?
  9. 中国剩余定理及扩展中国剩余定理
  10. 如何拆分PDF文件?简单几步轻松拆分