写一个简单的解释器(2) 构建标记流

确定标记类型

分为几个大类:

  1. 用户符号(类型/标识符/数字/字符串…)
  2. 关键字 (流程控制和定义符)
  3. 括号 (这里暂时认为 [] 属于括号)
  4. 分号

上述四类标记基本囊括了 vc \texttt{vc} vc 中的所有最小单元的类型,但是因为构建标记流的程序还需要完成 vasm \texttt{vasm} vasm 文件的标记流构建,因此增加第五类:汇编符号

功能规划

据此,我们可以使用 enum class 记录下标记的类型,用结构体记录每一个标记的信息,用 vector 存储整个标记流,同时声明一个用于构建标记流的函数,有时候文件可能比较大,所以允许用户逐行生成标记流并整合起来。

对于一个源文件 S S S,使用两个整数变量 l , r l, r l,r ,每次让 r r r 向后移动,直到找到了一个标记的开头,或者说两个标记的分割处,然后将 S [ l , r − 1 ] S[l,r-1] S[l,r1] 作为一个标记,生成对应的信息。

代码参考

以下内容为读者可以参考的功能实现指南。

pretreat.h \texttt{pretreat.h} pretreat.h

//gloconst.h 声明了一些常用的函数
#include "gloconst.h"
namespace Interpreter {enum class TokenType {Empty,Identifier = 1, ExpressionEnd,Integer, Float, String, Char,SBracketL, SBracketR, MBracketL, MBracketR, LBracketL, LBracketR,//关键字VarDefine, FuncDefine, ClassDefine, NamespaceDefine,If, Else, Switch, Case, While, For, Continue, Break, Return, Private, Public, Protected, Super, Using, //运算符(除去[])Comma, Assign,Add, Minus, Mul, Divison, Mod, BitAnd, BitOr, BitXor, BitNot, Lmov, Rmov,Equ, Neq, Gt, Ge, Ls, Le,LogicAnd, LogicOr, LogicNot,CallMember, New, As, Region, ArrIndex, //下列内容为汇编符号,label 之前的是预处理指令集Expose, Extern, VasmRegion, Glomem, StringRegion, Rely,label = 1024,vbmov, vi32mov, vi64mov, vfmov, vomov, mbmov, mi32mov, mi64mov, mfmov, momov,add, sub, mul, _div, mod, ladd, lsub, lmul, _ldiv, lmod, fadd, fsub, fmul, fdiv, uadd, usub, umul, udiv, umod, badd, bsub, bmul, bdiv, bmod,eq, ne, gt, ge, ls, le, feq, fne, fgt, fge, fls, fle,_and, _or, _xor, _not, lmv, rmv, land, lor, lxor, lnot, llmv, lrmv, uand, uor, uxor, unot, ulmv, urmv, band, bor, bxor, bnot, blmv, brmv,ret, opop, pop,vbgvl, vi32gvl, vi64gvl, vfgvl, vogvl, mbgvl, mi32gvl, mi64gvl, mfgvl, mogvl,push0, push1,pvar0, pvar1, pvar2, pvar3, povar0, povar1, povar2, povar3,arrmem1, arromem1,pack, unpack, _new, jmp, jz, jp,setvar,poparg, push,pvar, povar, pglo, poglo, pstr,mem, omem,sys,arrnew, arrmem, arromem,call, ecall};//一些常用的范围constexpr TokenType OperTokenTypeStart = TokenType::Comma, OperTokenTypeEnd = TokenType::ArrIndex,KeywordTokenTypeStart = TokenType::VarDefine, KeywordTokenTypeEnd = TokenType::Using;struct Token {//类型TokenType Type;//内容ulong Ulong;double Float;string String;char Char;//该标记所处的行编号int Line;Token();};//用于调试void PrintToken(Token& Token);//进行一些准备和初始化,读取一个源文件之前都要运行一次void Pretreat_Init();//在标记流末尾添加内容,不会清空已有的内容int Pretreat_GetTokenList(vector<Token>& list, string& str, bool is_asm_style);
}

接下来在 pretreat.cpp \texttt{pretreat.cpp} pretreat.cpp 中实现三个函数,这里就不贴出代码了。

感兴趣的,可以点击这个链接参考代码。

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

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

相关文章

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数&#xff0c;设计算法找到只出现一次的整数&#xff1f;2、给两个文件&#xff0c;分别有100亿个整数&#xff0c;我们只有1G内存&#xff0c;如何找到两个文件交集&#xff1f;&#xff08;1&#xff09;用一个位图…

JAVA基础(JAVA SE)学习笔记(七)面向对象编程(进阶)

前言 1. 学习视频&#xff1a; 尚硅谷Java零基础全套视频教程(宋红康2023版&#xff0c;java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段&#xff1a;Java面向对象编程 6.面向对象编程&#xff08;基础&#xff09; 7.面向对象编程&…

Ubuntu下 u2net tensorrt模型部署

TensorRT系列之 Windows10下yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov8 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov7 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov6 tensorrt模型加速部署 TensorRT系列之 Linux下 yolov5 tensorrt模型加速…

nginx部署vue项目(访问路径加前缀)

nginx部署vue项目(访问路径加前缀) nginx部署vue项目&#xff0c;访问路径加前缀分为两部分&#xff1a; &#xff08;1&#xff09;修改vue项目&#xff1b; &#xff08;2&#xff09;修改nginx配置&#xff1b; vue项目修改 需注意&#xff0c;我这是vue-cli3配置&#x…

某验四代滑块验证码逆向分析

逆向目标 目标&#xff1a;某验四代滑块验证码&#xff0c;w 参数逆向主页&#xff1a;aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v加密算法&#xff1a;RSA、AES 通讯流程 验证码流程分析 进入网页后&#xff0c;打开开发者人员工具进行抓包&#xff0c;点击滑动拼图验证&#xff0c…

Vue3语法-双向绑定

点击加入精英计划可以加入 点击名字可以删除 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><!-- vue.js --><script src"https://unpkg.com/vue3/dist/vue.glob…

微软正式发布开源应用平台 Radius平台

“ 10 月 18 日&#xff0c;微软 Azure 孵化团队正式发布开源应用平台 Radius&#xff0c;该平台将应用程序置于每个开发阶段的中心&#xff0c;重新定义应用程序的构建、管理与理解方式。” 简单的概括就是&#xff0c;它和Kubernetes不一样&#xff0c;Radius将应用程序放在每…

在Windows下Edge浏览器OA发起流程问题

在Edge浏览器中发起流程 如上图所示&#xff0c;不能正常打开Excel&#xff0c;自动将Excel表格转为了PDF 怎么处理&#xff1f;还得使用IE浏览器来访问&#xff0c;但打开IE后又自动跳转到Edge&#xff0c;根本就不给使用&#xff0c;在Edge下使用IE模式也解决不了这个问题。…

项目管理实战总结(二)-沟通路径

在一个大型的项目管理中&#xff0c;不同的沟通路径&#xff0c;会对整个事情的进展形成不同的影响。从项目管理的视角来看&#xff0c;该如何驱动项目有效进展&#xff0c;失之毫厘谬以千里。 沟通路径&#xff1a;调查问卷的推动事宜 在项目进行到了后期&#xff0c;甲方希…

python学习笔记7-图的建立常用技巧

题目链接 题目中给了邻接链表&#xff0c;转为邻接矩阵初始化邻接矩阵 graph [[] for _ in range(n)]dfs() 的写法&#xff0c; 用visi避免重复访问&#xff0c;得到每个点所在的联通分量中点的个数 class Solution:def countPairs(self, n: int, edges: List[List[int]]) -…

JVM的几个面试重点

JVM的内存区域划分 JVM类加载机制 前言 Java程序最开始是一个 .java 的文件&#xff0c;JVM把它编译成 .closs 文件&#xff08;字节码文件&#xff09;&#xff0c;运行 Java 程序&#xff0c; JVM 就会读取 .class 文件&#xff0c;把文件内容读取到内存中&#xff0c;构造出…

YOLOv5:修改backbone为SPD-Conv

YOLOv5&#xff1a;修改backbone为SPD-Conv 前言前提条件相关介绍SPD-ConvYOLOv5修改backbone为SPD-Conv修改common.py修改yolo.py修改yolov5.yaml配置 参考 前言 记录在YOLOv5修改backbone操作&#xff0c;方便自己查阅。由于本人水平有限&#xff0c;难免出现错漏&#xff0c…

HammerDB的安装和使用(超详细)

目录 ​编辑 一、HammerDB的介绍 二、HammerDB的安装 1、下载hammerdb安装包 2、权限配置以及安装 3、查看安装目录 三、安装前的配置 1、启动监听 2、启动数据库 3、创建表空间 1.修改临时表空间 2…

【源码解析】Spring源码解读-bean的加载

Spring的整体流程其实就是通过配置 xml、注解将自定义bean类信息进行配置&#xff0c;然后通过BeanDefinitionReader读取配置信息&#xff0c;由Dom转换成xml解析成Docment。在通过加载的配置信息进行初始化Bean对象&#xff0c;然后在对象的前后进行处理&#xff0c;也就是不同…

Elesticsearch使用总结

写在前面 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&#xff0c;是当前流行的企业级搜索引擎。设计用于[云计…

vue3 更换 elemnt-ui / element-plus 版本npm命令

1. 安装 / 更换 element-ui 版本 [ 在 后面指定想要安装的版本 ] //卸载当前版本 npm uninstall element-ui //安装指定版本 npm i element-ui2.4.8 -S --legacy-peer-deps 2. 安装 / 更换 element-plus 版本 [ 在 后面指定想要安装的版本 ] npm install element-plus2.3…

面向对象【构造器】

文章目录 构造器定义构造器的作用构造器的使用说明无参构造器带参数的构造器构造器的重载使用构造器创建对象 总结 构造器定义 构造器是一种特殊类型的方法&#xff0c;它与类同名&#xff0c;没有返回值&#xff0c;并且用于在创建对象时执行初始化操作。构造器的名称必须与类…

java蓝桥杯前10题总结

文章目录 1.单词分析1.代码2.知识点 2.成绩统计1.代码2.知识点1.如何四舍五入&#xff1f;2.如何保留小数点后几位小数呢&#xff1f; 3.最短路4.回文日期1.代码2.知识点1.日期类2.字符串细节3.连等的细节 5.门牌制作1.代码 6.卡片1.代码2.细节 7.数字三角形1.代码2.细节 8.成绩…

最强英文开源模型LLaMA架构探秘,从原理到源码

导读&#xff1a; LLaMA 65B是由Meta AI&#xff08;原Facebook AI&#xff09;发布并宣布开源的真正意义上的千亿级别大语言模型&#xff0c;发布之初&#xff08;2023年2月24日&#xff09;曾引起不小的轰动。LLaMA的横空出世&#xff0c;更像是模型大战中一个搅局者。虽然它…

AI篇-如何用AI辅助对图片进行鉴赏

前言 目录 前言 一、观众侧鉴赏图片 方法1&#xff1a;直接将图片发给文心一言&#xff0c;让文心一言分析。 方法2&#xff08;正确方法&#xff09;&#xff1a;将图片简单介绍并把图片发给文心一言&#xff0c;让文心一言分析。 二、作者介绍图片 方法&#xff08;正…