02高级语言及其语法描述

一、程序语言的定义

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

语法(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	
		       ……
		END
		SUBROUTINE  SUB1
		       ……
		END
		SUBROUTINE  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→α 则称为左线性文法。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全糖去冰不加料

打赏一块钱💰也是钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值