PL-0功能拓展及基于VSCode的IDE配置


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…