NJU-ICS 2024学习随笔PA1_3(正则表达式)

news/2024/9/22 23:29:52/文章来源:https://www.cnblogs.com/jiayou-cdr/p/18426102

2024-09-22

确实这一块比前面有点难了,先看看这make_token函数在哪。

nemu目录下执行指令grep -r "make_token",就可以得到这个函数所在路径。

然后看到enumrule,结合文章可知,这里就是添加规则的地方。

先学一下正则表达式语法

正则表达式语法

  • .:匹配任意字符(除了换行符)
  • *:匹配前一个字符零次或多次
  • +:匹配前一个字符一次或多次
  • ?:匹配前一个字符零次或一次
  • ^:匹配字符串开头
  • $:匹配字符串结尾
  • []:匹配括号内任意字符
  • ():创建一个捕获组
  • \\:一个 \ 是转义字符,两个 \  是表示匹配后面紧跟的字符

enum里面更改为

enum {TK_NOTYPE = 0,  // " "TK_EQ     = 1,  // ==/* TODO: Add more token types */TK_LEFT   = 2,  // (TK_RIGHT  = 3,  // )TK_PLUS   = 4,  // +TK_MINUS  = 5,  // -TK_MUL    = 6,  // *TK_DIV    = 7,  // /TK_AND    = 8,  // &&TK_OR     = 9,  // ||TK_XOR    = 10, // ^TK_AR     = 11, // access registerTK_PD     = 12, // pointer dereferenceTK_NUM    = 13, // numberTK_HEX    = 14, // hexadecimal
};

rule里面更改为

static struct rule {const char *regex;int token_type;
} rules[] = {/* TODO: Add more rules.* Pay attention to the precedence level of different rules.*/{" +", TK_NOTYPE},    // spaces{"==", TK_EQ},        // equal{"\\(", TK_LEFT},     // left bracket{"\\)", TK_RIGHT},    // right bracket{"\\+", TK_PLUS},     // plus{"\\-", TK_MINUS},    // minus{"\\*", TK_MUL},      // multiply{"\\/", TK_DIV},      // divide{"&&", TK_AND},       // and{"||", TK_OR},        // or{"^", TK_XOR},        // xor{"\\$[a-z]?[0-9]+", TK_AR},   // access register{"[0-9]+", TK_NUM},   // number{"0[xX][0-9a-fA-F]+", TK_HEX}, // hexadecimal
};

这里解释一下关于访问寄存器部分。可以找到nemu/src/isa/riscv32/reg.c这里关于寄存器的命名。除了一个$0其余都符合一个字符+一个数字的命名方式,所以就这样写了。

剩下一个存token的地方明天再说吧,不早了,得睡觉了。反正后面都得测试,现在对不对也问题不大

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

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

相关文章

Java反序列化利用链篇 | JdbcRowSetImpl利用链分析

JdbcRowSetImpl利用链 前言 首先说明一下:利用链都有自己的使用场景,要根据场景进行选择不同的利用链。 JdbcRowSetImpl利用链用于fastjson反序列化漏洞中。 为什么? 因为fastjson会在反序列化类时自动调用set开头的方法(不一定是setter方法),而JdbcRowSetImpl中存在一个…

Java反序列化调用链分析系列 | URLDNS链

URLDNS链 URLDNS链是java通过反序列化发起dns请求的利用链。一般用于测试反序列化漏洞。 该链比较简单,利用链也比较短。 其中入口类为 HashMap,执行类为URLStreamHandler的hashCode()方法。 整个调用链如下: HashMap.readObject() HashMap.putVal() HashMap.hash()URL.hash…

控制请求并发数量:p-limit 源码解读

p-limit 是一个控制请求并发数量的库,他的整体代码不多,思路挺好的,很有学习价值; 举例 当我们同时发起多个请求时,一般是这样做的 Promise.all([requestFn1,requestFn2,requestFn3 ]).then(res =>{})或者 requestFn1() requestFn2() requestFn3()而使用 p-limit 限制并…

程序员职业发展之路思考:工程师的等级阶梯

德雷福斯模型:新手到专家 德雷福斯模型(Dreyfus model)是在 1980 年,Dreyfus 兄弟共同提出的技能习得模型。 它是一个技能习得的阶梯模型,也可以用来考察行业技术能手的分级。该模型由上而下分成:专家、精通者、胜任者、高级新手、新手五个等级,越到上面人数占比越少。新…

2024 人工智能学习内容

第六组思维导图:图形的认识

04. 流程控制

一、流程控制流程控制就是用来控制程序运行中各语句执行顺序的语句。基本的流程结构为:顺序结构,分支结构(或称选择结构),循环结构。顺序结构:程序自上到下执行,中间没有任何判断和跳转; 分支结构:根据条件,选择性的执行某段代码,有 if……else 和 switch……case 两…

CentOS 7 虚拟机连接网络

CentOS 7 虚拟机连接网络 检查网络 ping www.baidu.com切换 root 用户 su查看网卡名 ip addr激活网卡 vim /etc/sysconfig/network-scripts/ifcfg-ens33重启网络 service network restart

execve

目录glibc glibc execve() 执行由 pathname 指定的程序。这会导致当前正在被调用进程运行的程序被一个新程序替换,且该新程序会重新初始化栈、堆,以及(已初始化和未初始化的)数据段。

freeRTOS源码解析4--tasks.c 5

4.2.13 继续任务--vTaskResume 接口:void vTaskResume( TaskHandle_t xTaskToResume )形参1:xTaskToResume ,想要继续的任务handle; 首先是vTaskResume调用的一个内部函数:static BaseType_t prvTaskIsTaskSuspended( const TaskHandle_t xTask ),用于检查任务是否是挂起…

MySQL 必知概念

Delete、Drop 和 Truncatedelete、truncate 仅仅删除表里面的数据,drop会把表的结构也删除 delete 是 DML 语句,操作完成后,可以回滚,truncate 和 drop 是 DDL 语句,删除之后立即生效,不能回滚 执行效率:drop > truncate > deleteMyISAM 与 InnoDBInnoDB 支持事务…

视野修炼-技术周刊第102期 | js 编译运行C

① Bun 现在允许直接在js中直接编译运行 C ! ② caniuse-cli ③ SSL证书管理工具 ④ 好的重构与坏的重构 ⑤ sisi - 命令行图片检索工具 ⑥ cvbee.ai - AI 简历生成欢迎来到第 102 期的【视野修炼 - 技术周刊】,下面是本期的精选内容简介 🔥强烈推荐Bun 现在允许直接在js中…

【vulhub】Discuz-命令执行 wooyun-2010-080723

【vulhub】Discuz-命令执行 wooyun-2010-080723 ​docker-compose up-d​启动! ​​ wooyun-2010-080723 命令执行 0x01 搭建环境 访问192.168.132.138:8080/install​,安装数据库。数据库服务器填写db(必须db,不然安装失败),数据库名为discuz,数据库账号密码均为root,…