首页 > 其他分享 >DCS292 编译器构造实验,实验三

DCS292 编译器构造实验,实验三

时间:2024-07-05 13:31:11浏览次数:21  
标签:语言 声明 编译器 实验 DCS292 类型 Oberon 标识符 常量

help-assignment

DCS292 编译器构造实验,实验三

3 Oberon-0 语言
本实验的处理对象是 Oberon-0 语言,该语言中包含了高级程序设计语言的表达 式,以及结构化程序设计中的结构化控制结构、子程序、参数传递等机制的抽象。
3.1 简介
用于编译原理实验的计算机语言应足够简单,但又不失其代表性。据此,本实验 项目选择了 Oberon-0 语言为处理对象。
Oberon-0 的来历可追溯到近 50 年前,在此期间的程序设计语言发展约每 10 年就 有一标志性成果。1960 年,P. Naur 等人设计了 Algol 60 语言;约 10 年后,随着 结构化程序设计思想的成熟,N. Wirth 设计出远比 Algol 68 语言成功(特别是在 教育界)的 Pascal 语言;又一个 10 年过去,N. Wirth 根据程序设计和软件工程 技术的最新进展,在 Pascal 基础上设计了 Modula-2 语言;又过了约 10 年后,M. Reiser 与 N. Wirth 一起,将 Pascal 语言和 Modula-2 语言的程序设计本质精华浓 缩为 Oberon 语言。
Oberon-0 语言是 Oberon 语言的一个子集,为程序员提供了良好的程序结构。在 Oberon-0 程序中,最基本的语句是赋值语句;复合语句支持顺序、条件(if 语句) 和迭代(while 语句)执行。Oberon-0 中还支持子程序这一重要概念,包括过程 声明和过程调用两个范畴,并且提供了两种不同的参数传递方式:按值调用(值参数)和按引用调用(可变参数)。
然而 Oberon-0 的类型系统却十分简洁,仅有的基本数据类型是整数类型 (INTEGER)和布尔类型(BOOLEAN),因而可声明整数类型的常量和变量,也允许用算术运算符构造表达式;而表达式的比较运算则产生 BOOLEAN 类型 的值,并可用于逻辑运算。Oberon-0 的复合数据类型包括数组和记录,且允许任 意嵌套;但最基本的指针类型或引用类型就被省略了。
一个过程代表了由语句组成的功能单元,因而在一个过程的写法中自然会关系到 名字的局部性(Locality)问题。Oberon-0 语言支持将标识符声明为局部于某一 过程,即仅在该过程本身范围内标识符才是可见的或合法的。
由 N. Wirth 本 人 编 著 的 Theory and Techniques of Compiler Construction: An Introduction(Addison-Wesley, 1996, ISBN 0-201-40353-6,本课程教学网站提供了 该教材的电子版)中,第 6 章描述了 Oberon-0 程序设计语言的语法并给出一个 样板程序。本文档的语法定义和例子程序即源于该教材,但作了少数改动,因而 本实验处理的 Oberon-0 语言应以本文档的定义为准。
3.2 词法定义
Oberon-0 语言定义了非常简单的语法规则。
3.2.1 单词
与我们熟悉的 C、C++、Java 等语言不同,Oberon-0 语言是大小写无关的。譬如,保留字 WHILE、While 和 while 三种写法是等价的;而标识符 BALANCE、Balance 和 balance 是相同的标识符。
Oberon-0 的标识符长度不允许超过 24 个字符(允许 24 个字符)。
在 Oberon-0 中还支持括号风格的注释,在“(”和“)”之间的内容全部为注释;注意,Oberon-0 注释不允许嵌套。
3.2.2 基本数据类型
在 Oberon-0 程序中仅支持 INTEGER 和 BOOLEAN 两种基本数据类型,可以利 用 VAR 声明这两种类型的变量。
INTEGER 类型的常量书写形式只允许 Pascal 语言的无符号整数;这些常量可以 由 0 开头,但解释为八进制常量(此时常量中不允许出现 8 和 9 两个数字),非 0 开头则解释为十进制常量。无论十进制还是八进制整数常量,每一常量中包含 数字(包括 0)的个数不可超过 12 个(从而限制了整数常量允许表达范围的最大值)。
INTEGER 类型常量与标识符之前必须以空白符号分隔;例如,扫描 25id 时应作 为一个非法整数常量处理,而不是理解为常量 25 和标识符 id 两个单词。注意, 不支持书写 BOOLEAN 类型的常量 TRUE 和 FALSE。
3.3 语法定义
本小节以 EBNF 定义了 Oberon-0 语言的形式语法。 3.3.1 扩展 BNF(EBNF) EBNF 意即扩展的 BNF(Extended BNF),是我们在实际应用中定义一门计算机 语 言 的 形 式 语 法 的 国 际 标 准 , 参 见 ISO/IEC 14977: 1996(E). The Standard Metalanguage Extended BNF(本课程教学网站提供了该标准的电子版文档)
3.4 语言描述
在Theory and Techniques of Compiler Construction: An Introduction 中并未详细描 述 Oberon-0 语言的语义特性,因为该语言的语义可以按直观的方式参照其他程 序设计语言(特别是沿 Algol 60、Pascal、Modula-2、Oberon 这一家族的语言) 来理解。
本小节特别强调了 Oberon-0 可能引起理解上二义性的几个方面,使得在本实验 项目中老师和所有学生对该语言的理解是无二义的。
3.4.1 模块声明
一个模块中可声明类型、常量、变量、过程等,也可声明该模块的主程序(程序 体包括在 BEGIN 和 END 之间)。但一个模块也允许没有主程序,仅声明一些类 型、常量、变量、过程等供其他模块使用(尽管本实验项目中尚未更深入地考虑这一问题)。
一个模块声明的 END 之后的标识符必须与该模块的名字相同。
3.4.2 运算符与表达式
算术表达式支持一元运算“+”和“–”,分别表示取正和取负运算;支持二元运 算“+”、“–”、“*”、“DIV”和“MOD”,分别表示加法、减法、乘法、整除、 取模运算。参与算术表达式的运算量必须是 INTEGER 类型,否则会产生类型不 兼容错误;由于 Oberon-0 语言不支持实数除法运算(仅支持整除运算),因而算 术表达式的运算结果总是 INTEGER 类型。
算术表达式可参与“=”、“#”(不等于)、“<”、“<=”、“>”和“>=”等关系运算,运算结果为 BOOLEAN 类型的值。BOOLEAN 类型的值不允许参与任何关系运 算,否则会产生类型不兼容错误。
但是 BOOLEAN 类型的值可能参与逻辑运算“&”、“OR”和“~”,分别表示“与”、 “或”和“非”。INTEGER 类型的值不允许参加任何逻辑运算,否则会产生类型不兼容错误。
3.4.3 类型声明
Oberon-0 允许类型声明,即以一个标识符重命名一个基本数据类型或复合数据类型。例如,
此后,即可用这些标识符作为类型,以声明其他变量。例如,
3.4.4 选择符
Oberon-0 语言支持两种选择符:“.”用于访问记录中的一个域;“[ ]”用于以下 标表达式访问一个数组的元素。这两种选择符均可以嵌套使用,但必须保证:“.” 左边的标识符指称的是一个记录,右边的标识符是该记录中的一个域;“[”左边 的标识符指称的是一个数组,“[ ]”中间是一个求值结果为 INTEGER 的表达式。
例如,以下选择符的使用是合法的:
3.4.5 作用域规则
Oberon-0 语言是一个块(Block)结构语言;凡在一个块中声明的所有标识符,其作用域仅局限在该块之中。
例如,在一个 MODULE 中声明的所有类型、常量和变量(参见语法单位 declarations)在该模块中是可见的,包括该模块定义的所有块(过程声明)中都是可见的;而在一个 PROCEDURE 中声明的所有类型、常量和变量(参见语法单位 declarations 和 FormalParameters)则仅在该过程中是可见的,其他过程中不可见之。
3.4.6 过程声明与参数传递
如果一个过程声明的某个形式参数之前声明有保留字 VAR,则该参数称为一个可变参数,将采用按引用传递(Call by Reference)的参数传递方式,因而该过 程可能有副作用;否则,该参数称为一个值参数,将采用按值传递(Call by Value) 的参数传递方式,因而该过程不会产生副作用。严格的语义检查应保证可变参数 必须是一个左值(L-value)。
一个过程声明的 END 之后的标识符必须与该过程的名字相同。
3.4.7 预定义函数
Oberon-0 提供了 3 种预定义函数:read()、write()和 writeln,分别表示控制台输入和输出,其含义与 Pascal 语言中的相同。
3.5 程序示例 以下提供了以 Oberon-0 书写的一个模块(Module)的源代码清单,可能会有助于你理解 Oberon-0 语言的特点。该模块中包含了几个简单的过程,这些过程的 名字表达了其功能。

contact me on V help-assignment

标签:语言,声明,编译器,实验,DCS292,类型,Oberon,标识符,常量
From: https://blog.csdn.net/telnet3000/article/details/140082263

相关文章

  • 2.2 实验三、自动生成语法分析程序(JavaCUP)
    help-assignment2.3实验三、自动生成语法分析程序(JavaCUP)实验三要求你下载一个语法分析程序自动生成工具JavaCUP,利用该工具自动产生一个Oberon-0语言的语法分析和语法制导翻译程序;生成的程序源代码是以Java语言编写的。2.3.1实验步骤3.1、下载自动生成工具Java......
  • 昇思25天学习打卡营第14天|基于MindSpore的红酒分类实验
    AI是在帮助开发者还是取代他们?在软件开发领域,生成式人工智能(AIGC)正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试,AI工具正在成为开发者的得力助手。然而,这也引发了对开发者职业前景和技能需求变化的讨论。AI究竟是在帮助开发者还是取代他们?我的观点是,正......
  • 数据结构实验报告:查找
     一、实验目的1.掌握查找表的结构。2.掌握顺序查找、折半查找、二叉排序树查找和哈希查找。二、实验环境Windows10、VisualC++6.0三、实验任务1.编写程序实现顺序查找和折半查找。(1)顺序查找#include<stdio.h>#include<stdlib.h>#defineLIST_SIZE20typ......
  • 《DNK210使用指南 -CanMV版 V1.0》第九章 打印输出实验
    第九章打印输出实验1)实验平台:正点原子DNK210开发板2)章节摘自【正点原子】DNK210使用指南-CanMV版V1.03)购买链接:https://detail.tmall.com/item.htm?&id=7828013987504)全套实验源码+手册+视频下载地址:http://www.openedv.com/docs/boards/k210/ATK-DNK210.html5)正点原子......
  • 对标 GPT-4o,法国开源实验室发布多模态大模型 Moshi;腾讯汤道生:AI 领域不应只关注大模型
      开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点,......
  • 物联网综合实验平台-物联网实验实训教学平台-物联网实验箱
    物联网(IoT)是一种连接性技术,将各种设备和物品连接到互联网,通过数据的收集和分析实现更智能的决策和操作。在《“十四五”数字经济发展规划》中,物联网被明确提出,被视为数字经济时代的基础设施。当前,物联网技术正加速融入生产生活、赋能千行百业发展,未来的发展潜力巨大。因此,物联......
  • ENSP模拟实验-ACL
    实验拓扑图:实验要求:R1,R2模拟PC,R1可以telnetR3,不能pingR3;R1可以pingR4,不能telnetR4;R2的配置与R1相反;实验过程;1.IP地址规划由于未作要求,随意给两个网段即可,地址划分如下:用户:192.168.1.0/24骨干:192.168.2.0/242.基础配置(仅给出模拟PC的路由器R1的配置,R2与R1相似,R3,R......
  • 华为eNSP综合实验:单臂路由、DHCP、RIP、OSPF、VLAN
    前言本实验为华为eNSP综合实验,为某学校相关课程期末考试真题,当时没有完全理解,现在由于工作需求,重新温习相关技术,于是想到用本实验来练练手,提升一下实验操作能力。主要涉及交换机VLAN划分、trunk口放通vlan;路由器单臂路由配置、DHCP配置、RIP配置、OSPF配置以及路由引入。......
  • springboot实验报告管理系统-计算机毕业设计源码10596
    目录1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 系统功能分......
  • springboot实验报告管理系统-计算机毕业设计源码10596
    目录1绪论1.1选题背景与意义1.2国内外研究现状1.3论文结构与章节安排2系统分析2.1可行性分析2.2系统流程分析2.2.1系统开发流程2.2.2用户登录流程2.2.3系统操作流程2.2.4添加信息流程2.2.5修改信息流程2.2.6删除信息流程2.3 系统功能分......