程序设计语言编译原理第三版陈火旺 您所在的位置:网站首页 相似的字母表 程序设计语言编译原理第三版陈火旺

程序设计语言编译原理第三版陈火旺

2024-07-15 13:47| 来源: 网络整理| 查看: 265

1.写出下列程序设计语言所采用的输入字母表并进行比较

(1)Pascal (2)C (3)Ada(4)FORTRAN(5)Java 答: (1) pas c al:输入字母表: A-Z, a -z,""(下划线),0 - 9 与其它语言比较:与 C和 Java相比, Pascal的输入字母表没有特殊学符和等号,但具有类似的字因和数字约束; (2) C:输入字母表: A-Z, a - z,0 - 9,"","."(点号): 与其它语言比较: C语言的输入字母与 Pascal, Java和 Ada非常相似,但它允许使用点号作为字符,例如结构体和指针操作符; (3) Ada:输入字母表: A-Z, a - z,0 - 9,"_,","."(点号) 与其它语言比较: Ada的输入学母表与 Pascal, C和 Java相似,没有特殊字符和符号的限制; (4) FOR TR AN:输入字母表: A-Z, a - Z,0 - 9 与其他语言比较: FOR TR AN的输入字母表相对较简单,只包含英文字母和数字,没有特殊字符和符号; (5) Java:输入字母表: A-Z, a - z,0 - 9," _" 与其它语言比较: Java的输入字母表 Pascal, C和 Ada非常相似,没有特殊字符和符号的限制;

总结:这些编程语言的输入学母表都非常相似主要由大写字母,小写字母、数字和下划线组成,除 C语言外,其语言不支持特殊字符和符号。

2.关于变量、数组说明,练习1中所列的各种语言有何相同或不同之处

答: (1) Pascal:   变量:Pascal是一种强类型的编程语言,变量需要在声明时指定其数据类型。例如整数,实数,字符等。 Pascal也支持局部变量和全局变量的概念;   数组: Pascal支持多维数组,数组说素的索引从1开始。数组的大小在声明中指定,且大小固定。 (2) C:   变量: C也是一种强类型的编程语言,但在声明变量时需要指定数据类型。 C也支持局部变量和全局变量。   数组: C支持多维数组,数组元素的索引从0开始。数组的大小在声明时指定,但 C中的数组没有内建的边界检查,需要开发人员自行确保不越界访问。 (3) Ada:   变量: Ada是一种强类型的编程语言,变量需要在声明时指定其数据类型。 Ad la也支持局部变量和全局变量,而且有更严格的类型检查。   数组: Ada支持多维数组,数组的大小在声明时指定。 Ada在数组访问上更加强调安全性,有较严格的边界检查和类型匹配规则。 (4) FORTRAN:   变量: FORTRAN是一种早期的编程语言,变量在声明时需要指定数据类型。FORTRAN 77 及以前版本没有动态内存分配,因此数组大小通常在编译时确定。   数组: FORTRAN支持多维数组,数组元素的索引从1开始。FORTRAN中数组的维度在声明时指定。 (5) Java:   变量: Java是一种面向对象的编程语言,变量需要在声明时指定数据类型。Java中的变量分为实例变量和局部变量,对于实例变量需要通过类的实例来访问。   数组:Java支持多维数组,数组元素的索引从0开始,Jwa中的数组是对象,有动态内存分配,数组的大小可以在运行时改变。

3.何谓“标识符”,何谓“名字”,两者的区别是什么?

答: (1)标识符的定义:在程序设计语言中,标识符是一个最基本的概念,其定义为:凡以字母开头的字母数字序列(有限个字符)都是标识符。 (2)名字的定义:当给予某标识符以确切的含义时,这个标识符就叫做名字。 区别:(1)程序语言中各种名字都是用标识符表示的,只是标识符是一个没有意义的字符序列,而名字却有着确切的意义和属性(即类型和作用域)。如当A、B1等作为标识符时没有什么含义,但当其作为名字时,却可以代表变量名、数组名、函数名或过程名等。 (2)标识符是语法概念;名字是语义概念。

4、令 +、* 和↑代表加、乘和乘幂,按如下的非标准优先级和结合性质的约定,计算1+12↑1↑2的值:

(1) 优先顺序(从高至低)为+、* 和↑,同级优先采用左结合。

解答如下: 左结合

(2)优先顺序为↑、+、*,同级优先采用右结合。 解答如下: 右结合

5.对你所熟悉的某种语言中的某种基本数据类型:

(1)描述这种类型数据对象可以包含的值; (2)确定这种类型的值的存储表示; (3)定义这种类型的常量的语法表示; (4)确定对这种类型的数据对象可以进行哪些运算: (5)对每一种运算,确定它的实现是通过软件仿真还是仅用一条简单的硬件指令? (6)对这种类型的数据进行运算的合法性是静态确定还是必须动态确定?

答: 答:用 C++中的整数类型int问题进行回答:

(1)数数类型 int可以包含整数值,这些值包括正整数,负整数和零, 范围根据机器和编译器可能有所不同; (2)数据类型 int的存储表示通常是通过使用二进制补码来表示。 补码表示允许在计算在中使用相同的硬件逻辑来处理正数和负数; (3)在 C++中,定义整数类型int的常量可使用以下语法表示: const int num=42; (4)整数类型int支持各种基算术运算,包括加法,减法、乘法、除法以及取余等。此外,还支持位运算,如按位与,按位或,按位异或等; (5)大多数整数运算都可以通过硬件指令来实现,因为这些操作在计算机体系结构中具有原生的支持。例如,加法、减法、乘法等运算通常可由硬件指令直接执行; (6)整数类型的运算合法生通常是静态确定的,这意味着编译器可以在编译时进行类型检查和范围检查,以确保操作不会导致数据溢出或类型不匹配的问题。然而,在一些情况下,如除法操作时的除数为0,合法性可能需要在运行时动态确定。

6.令文法G6为 N→D∣ND D→0∣1∣2∣3∣4∣5∣6∣7∣8∣9

(1) G6 的语言 L(G6)是什么? 答:由题可得,D可以推导出0-9中的某个数字,N最终推出0-9这10个数字组成的字符串,则G6的语言L(G6)是0-9这10个数字组成的字符串。 N => ND => NDD => NDD => … =>ND…D 可表示为:L(G6)={(0|1|2|3|4|5|6|7|8|9)*}

(2) 给出句子 0127、34 和 568 的最左推导和最右推导。 答: 最左推导: N => ND => NDD => NDDD => DDDD => 0DDD => 01DD => 012D =>0127; N => ND => DD => 3D => 34; N => ND =>NDD => DDD => 5DD => 56D => 568;

最右推导: N => ND => N7 => ND7 => N27 => ND27 => N127 => D127 => 0127; N => ND => N4 => D4 => 34; N => ND => N8 => ND8 => N68 => D68 => 568;

7.写一个文法,使其语言是奇数集,且每个奇数不以0开头。

解:由题得,文法如下:

A->1|3|5|7|9 B->2|4|6|8|A C->B|0 D->B|DC S->A|DA

8.令文法为 E→ T | E+T| E-T T→ F | T*F | T/F F→(E) l i

(1) 给出i+i* i、 i* (i+i)的最左推导和最右推导

解答如下: 最左和最右

(2) 给出i+i+i、i+i * i和i-i-i的语法树。 解答如下: 语法树

9. 证明下面的文法是二义的: S→iSeSliSli

解答如下: 二义文法

11.给出下面语言的相应文法 L1={a nb nc i|n>=1,i>=0} L2={a ib nc n|n>=1,i>=0} L3={a nb na mb m|n,m>=0} L4={1 n0 m1 m0 n|n,m>=0}

解答: (1)L1的文法:     A->aAb|ab     B-> cB| ε     S->AB

(2)L2的文法:     A->aA| ε     B-> bBc| bc     S->AB

(3)L3的文法:     A->aAb| ε     B-> aBb| ε     S->AB

(4)L4的文法:     A->0A1| ε     B-> 1B0| ε     S->AB



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有