title: PL/0功能拓展及基于VSCode的IDE配置
date: 2024-08-06 22:46:38
tags: 做过的实验||项目复盘
top: true

概述

PL/0语言可以看成PASCAL语言的子集,它的编译程序是由C语言编写的编译解释执行系统。PL/0能充分展示高级语言的最基本成分。

拓展了pl0语言的基础功能(浮点数实现、出错处理、实现整型数组以及格式化输入输出),增加了整型数组求和、平均值、最大最小值系统函数,基于VSCode插件来实现代码补全和自动高亮。

项目地址:https://github.com/GorwayWong/Compiler-Theory-Assignment-PL-0-extend

PL/0基础功能扩展实现

符号总览以及格式化输入/输出

在编译器源文件中添加以下新拓展:

其中 printfsym 代表格式化输出,scanfsym 代表格式化输入。

请添加图片描述
请添加图片描述
请添加图片描述

保留字符号及名字均按照字母表顺序进行排列。

其中printf是格式化输出符号,scanf是格式化输入符号;同时没有删除pl0本来的输入输出函数write和read,是因为一些情况下用这些更方便。

设置printfsym以及scanfsym为语句的开始符号。

在statement函数中添加对printf语句以及scanfsym语句的处理。二者的基本代码与write、read结构类似,就是多了对’d’以及’f’的处理,遇见d时以整型进行输入输出,而f则是浮点型。相对而言,scanf的处理更加复杂,由于浮点类型的读入与整型类型的读入存在区别,而原本的opr指令中只支持对整型的处理,所以我增加了一条新的指令(opr 0 17 0),与(opr 0 16 0)相互配合处理不同的类型输入。

同时将原来的整型数据栈s改成了float类型,整型浮点型都用这个栈进行操作。

请添加图片描述

格式化输入输出测试结果:

请添加图片描述

请添加图片描述

给PL/0添加浮点数以及浮点数上下取整系统函数

首先设置floatsym为因子开始符号。

在getsym中进行修改,如果识别到一个词有可能是数字,则如果在识别过程中遇到了小数点,则认为其是浮点类型:

请添加图片描述

上下取整采用系统函数的方式实现,即操作格式为:ceil(浮点数) floor(浮点数)。增加了两个新的关键字符号ceilsym和floorsym,将二者设置成因子开始符号。

二者的处理思想较为类似,即将被上下取整操作之后的浮点数当作因子返回。在factor函数中增加对这两个sym的识别以及处理。在对ceilsym的处理中,如果括号里的数是浮点数变量,则生成lod指令,最后一位参数为2(在前面已经提到,修改lod使得其能将浮点数转换成int后加1放到栈顶)。如果是常量,则将其转换成int类型再+1放到栈顶。

编写的.plg测试文件以及结果:

请添加图片描述
请添加图片描述

其他功能

还扩展了整数数组、浮点数组、出错处理模块,具体请看GitHub地址源码:

项目地址:https://github.com/GorwayWong/Compiler-Theory-Assignment-PL-0-extend

PL/0高级功能扩展实现

实现了四个系统的统计函数:sum(数组(求和范围)),avg(数组(求平均范围)),max(数组(求最大值范围)),min(数组(求最小值范围))。

这里的“范围”可以是数组大小,也可以是大于0小于数组大小的一个数,比如有一个大小为3的数组list, sum(list(2))则是求前两个数的和。

实现思路与浮点数上下取整功能实现类似,将处理之后的数字当作因子参与运算。于是在factor中增添了四个关键字符号的识别:sumsym,avgsym,maxsym,minsym。

对于求和函数sum:分别对整型数组和浮点数组进行处理,但二者的不同之处在于对于s栈顶数据的操作一个是整型一个是浮点型。求和思路为:依次将数组中的元素取到栈顶(使用lod方法,lod方法对不同的数据类型有不同的操作,具体请见源代码),然后使用opr 0 2 0对栈顶元素进行两两相加,最后栈顶留下的元素就是数组的和了。

对于求平均值函数avg,前面的步骤与求和类似,在栈顶元素是数组之和之后,将求平均的范围,也就是数组后跟的括号里的数(存在全局变量num中)存到栈顶,此时栈顶为数组大小,次栈顶为数组之和,再生成opr 0 5 0除法指令,得到的就是平均数了,存在栈顶。

对于求最大值函数max,将数组中的各个元素取到栈顶之后,调用opr 0 18 0指令(新增的DIY指令,将栈顶和次栈顶比较,将最大值存在次栈顶,原栈顶去掉,即t-1)若干次,次数为数组大小-1,完成后栈顶元素就是最大值了。

对于求最小值函数min,将数组中的各个元素取到栈顶之后,调用opr 0 19 0指令(新增的DIY指令,将栈顶和次栈顶比较,将最小值存在次栈顶,原栈顶去掉,即t-1)若干次,次数为数组大小-1,完成后栈顶元素就是最小值了。

效果图:

请添加图片描述
请添加图片描述

编译原理的魅力

基于VSCode实现PL/0支持插件

效果:

请添加图片描述

对于特定后缀的文件.plg,通过编写自定义的vscode插件实现了关键字、标识符、以及其他符号的高亮。

同时,该vscode插件还可以实现自动补全(对于.plg文件),以下是效果图一览:

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91869.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91869.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/91869.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【低空经济】大型露天矿区安全生产无人机巡查与管理系统设计

1. 引言 大型露天矿区因其广阔的作业区域和复杂的环境条件,安全生产管理面临着严峻的挑战。随着科技的进步,无人机作为一种现代化的巡查工具,逐渐被应用于矿区的安全生产管理中。无人机具备高效、灵活、成本相对低廉等优点,可以在…

SpringCloud学习第一季-3

目录 11.服务网关-Gateway新一代网关 一、Gateway概述 1、Gateway是什么 1.1 概述 2、 能干嘛 3、微服务架构中网关在哪里 4、为什么选择gateway? 4.1 SpringCloud Gateway具有如下特性 4.2 SpringCloud Gateway 与 Zuul的区别 5、Zuul1.x模型 6、gateway模型 二、…

超越边界:MongoDB 16MB 文档限制的 pragmatic 解决方案

在软件开发中,我们选择的技术栈往往带有一些固有的设计边界。对于 MongoDB 而言,其最著名的边界之一便是 BSON 文档最大 16MB 的大小限制。在大多数场景下,这个限制是绰绰有余的,它鼓励开发者设计更为精简和规范的数据模型。然而&…

深入探讨:PostgreSQL正则表达式中的邮政编码匹配

引言 在处理大量数据时,如何高效地从字符串中提取特定模式的文本,如邮政编码,是一个常见且具有挑战性的任务。本文将通过一个具体实例,探讨在PostgreSQL中使用正则表达式匹配加拿大邮政编码的问题,并提供解决方案。 问题描述 我们希望能够从字符串中提取所有符合加拿大…

集合框架(重点)

第十五天集合框架1.什么是集合 Collections集合Collection,也是一个数据容器,类似于数组,但是和数组是不一样的。集合是一个可变的容器,可以随时向集合中添加元素,也可以随时从集合中删除元素。另外,集合还…

深度学习核心:神经网络-激活函数 - 原理、实现及在医学影像领域的应用

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开发…

OneCode3.0 核心表达式技术深度剖析:从架构设计到动态扩展

一、引言:表达式技术在企业级框架中的核心价值 在当今快速变化的企业级应用开发中,动态性和灵活性已成为衡量框架优劣的关键指标。OneCode 3.0 框架作为企业级应用开发的重要工具,其核心表达式技术提供了一种强大的解决方案,使开发…

[css]旋转流光效果

实现一个矩形的旋转流光边框效果。 需要使用css属性梯度渐变&#xff1a;链接: conic-gradient&#xff0c;他指的是圆锥形变化的梯度。 // html<div class"demo"></div>// css body {width: 100%;height: 100%;background-color: black; }.demo {width…

NPM组件 @0xme5war/apicli 等窃取主机敏感信息

【高危】NPM组件 0xme5war/apicli 等窃取主机敏感信息 漏洞描述 当用户安装受影响版本的 0xme5war/apicli 等NPM组件包时会窃取用户的主机名、用户名、工作目录、IP地址等信息并发送到攻击者的电报地址(botToken “7699295118:AAF6pb7t718vjHWHwFQlZOastZQYHL8IVDE”&#x…

计算机网络:组播和多播有什么区别?

在网络通信中&#xff0c;“组播”和“多播”其实是同一概念的不同中文翻译&#xff0c;它们对应的英文都是 Multicast。二者本质上没有技术区别&#xff0c;只是因翻译习惯不同而产生的两种表述&#xff0c;在实际应用中可以通用。 不过&#xff0c;为了更清晰地理解这个概念&…

Amazon Q Developer:AI 增强编码生产力的未来

Amazon Q Developer&#xff1a;重塑编码体验的 AI 助手 在如今快节奏的软件开发世界中&#xff0c;开发者们始终在寻找能平衡生产力与探索欲的工具。而 Amazon 推出的 Amazon Q Developer&#xff0c;这款可嵌入 Visual Studio Code 等主流 IDE 的 AI 编码助手&#xff0c;无疑…

linux eval命令的使用方法介绍

在这篇文章中&#xff0c;让我们来详细地介绍一下 Linux 中另一个非常强大但也极其危险的命令&#xff1a;eval。 eval 是一个 shell 内置命令&#xff0c;它的名字是 “evaluate”&#xff08;评估&#xff09;的缩写。它的作用是将紧跟其后的参数&#xff08;一个或多个字符串…

JavaWeb笔记2-JavaScriptVueAjax

1. JavaScript 1.1 基础介绍 JavaScript(简称&#xff1a;JS)是一门跨平台、面向对象的脚本语言&#xff0c;是用来控制网页行为&#xff0c;实现页面的交互效果。JavaScript和Java是完全不同的语言&#xff0c;但基本语法类似组成 ECMAScript: 规定了JS基础语法核心知识&…

代码随想录刷题Day23

右旋字符串 这道题是比较常规的对字符串的复制操作&#xff0c;找到右旋部分的分界点是关键 代码直接贴出来&#xff1a; #include<stdio.h> #include<string.h> int main(){int k;char s[10000];scanf("%d %s",&k,s);int cnt 0;for(int i str…

机器学习sklearn:编码、哑变量、二值化和分段

就是转换为数值类型方便机器学习模型处理一、编码这里举例将Survived这一行的数据转换为编码&#xff0c;原本是字符串类型2、将标签编码并赋值回去from sklearn.preprocessing import LabelEncoder y data.iloc[:, -1] # 最后一列拿出来 print(y) le LabelEncoder() le …

嵌入式八股文总结(ARM篇)

嵌入式开发中使用的通常是ARM芯片&#xff0c;在此总结一些面试常问的问题&#xff0c;希望可以和大家一起进步。&#xff08;持续更新中……&#xff09; 目录 1. 介绍一下I2C的传输时序 2. I2C为什么加上拉电阻&#xff0c;为什么使用开漏输出 3. I2C能接多少个设备&…

TCL --- 列表_part2

0 回顾 列表part0和part1描述了列表的创建&#xff0c;修改&#xff0c;获取&#xff0c;搜索等相关命令。接下来这篇文章将介绍列表的排序和拼接。通过这三篇文章的描述&#xff0c;详细大家对列表具有一个详细并且系统的认识。 1 排序 排序是一个老生常谈的话题。最最最常见的…

Kafka 单机多 Broker 实例集群搭建 | 详情

全文目录&#xff1a;开篇语前言1. Kafka 集群架构2. 环境要求2.1 安装 Java2.2 安装 Zookeeper3. 安装 Kafka4. 创建 Topic4.1 查看创建的 Topic5. 测试 Kafka 集群5.1 生产者&#xff08;Producer&#xff09;测试5.2 消费者&#xff08;Consumer&#xff09;测试6. 小结文末…

Ajax——异步前后端交互提升OA系统性能体验

本文介绍了Ajax中的基础使用&#xff0c;包括XMLHttpRequest的状态变化、并使用BMI 场景的示例进行介绍&#xff0c;以及结合 DAO 和 Servlet 处理OA系统复杂业务逻辑和JSON数据的处理等等。 本文目录一、Ajax 基础html页面二、 XMLHttpRequestXMLHttpRequest的状态变化同步和异…

【最后一个单词的长度】

思路 逆向遍历&#xff1a; 从字符串末尾开始向前遍历&#xff0c;跳过末尾的空格&#xff0c;直到找到非空格字符。 遇到非空格字符时开始计数&#xff0c;直到再次遇到空格或字符串开头。 状态标记&#xff1a; 使用 state 标记是否已经进入最后一个单词的计数阶段&#xff1…