(2)llvm解析器和抽象语法树

解析器的输出是抽象语法树

对于数字字面量,创造了一个实例,并捕捉

变量捕捉函数名;二元表达式捕捉运算符;函数调用捕捉函数名和函数调用参数

函数原型和函数定义

构建语法树

getNextToken会从输入流里拿一个token,CurTok是这个token的token值

当我们的curtok是num的时候进这段解析,我们创建数字的对象,捕获值,然后拿下一个token,使curtok更新,并返回我们创建的数字量对象

括号运算符就是吃掉左括号,再次解析括号中间的表达式,最后返回来吃掉右括号,然后把中间构建好的对象返回

这里是解析变量和函数,当识别到是变量名的时候进这里解析,然后直接看下一个token,如果是不是括号,说明是变量名,直接返回变量对象;如果是括号,说明是函数调用。

综上我们有基本表达式的解析。

二元表达式解析

a+b+(c+d)*e*f+g

上来把左边用解析初级表达式解析一遍,

会解析出变量a,然后创建右树

进来的话当前字符是+,那么我们鉴定该运算符的优先级,是要大于0,对于左右树本身,运算符的优先级都要高,所以不进if

然后拿到当前的运算符之后,把符号移动到下一个,解析右树,这时候会返回b

然后再拿下一个运算符,这次是c前面的+,因为相等,所以不进if,所以创建出一个左边的树为a+b。

第二轮循环到c前面的+,也是到解析右树我们用初级表达式解析,这时候是有括号的

因为是(c+d),所以会进解析括号的表达式,这里就和我们一开始遇到a+b的情况一样,所以返回来的表达式是一个二元表达式树,这时候输入流是从c开始的字符流,当遇到)的时候,会返回所构建的左树对象,所以返回的是c+d的二元表达式对象结构。

回过来,下一个符号是*,这时候是要比c前面的+优先的,所以会进if,这时候逻辑是因为你后面有更有优先的运算,所以是没有构建完成这个表达式的,所以我们把此时的右树传进去,以他为左树开始构建,这时候这个部分的优先级就不是0了,而是+加1。

依照之前的逻辑我们很容易就能得到(c+d)*e*f的结构,那么能出来就是我们会遇到最后g之气那的+,这时候发现式子本身的优先级是比+大的,我们就从这里返回了。

也就是第二个循环结束的时候,我们已经把左树构造出来了

a+b+(c+d)*e*f

之后就是正常构造a+b+(c+d)*e*f+g,然后没有字符了,就会得到下一个符号的优先级是-1,,也从这个地方退出,返回整个指向这个树的指针

解析函数原型

首先拿函数名字,然后进括号里面拿函数的参数,一个个放进数组,直到遇到右括号,然后返回这个对象

解析函数定义

首先拿掉def,然后拿到函数原型,然后解析表达式,最后把原型和表达式(函数体)作为对象返回

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

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

相关文章

克魔助手:方便查看iPhone应用实时日志和奔溃日志工具

查看ios app运行日志 摘要 本文介绍了一款名为克魔助手的iOS应用日志查看工具,该工具可以方便地查看iPhone设备上应用和系统运行时的实时日志和奔溃日志。同时还提供了奔溃日志分析查看模块,可以对苹果奔溃日志进行符号化、格式化和分析,极…

MSVC++ 编译 module std

环境:windows 10 19045.xxxx 只安装了MSVC C 工具链和一个版本的SDK,SDK版本建议选一个和本机系统匹配的。 cd %USERPROFILE%\source\repos\STLModules mkdir x86 mkdir x64 打开“x86 Native Tools Command Prompt for VS 2022”控制台,…

【mac-m1 docker 安装upload-labs靶场】

1.搜索upload-labs docker search upload-labs 2.下载upload-labs docker pull c0ny1/upload-labs 3.启动 docker run -it -d --name uploadlabs -p 80:80 c0ny1/upload-labs --platform linux/amd64 4.访问127.0.0.1:80

java设计模式学习之【备忘录模式】

文章目录 引言备忘录模式简介定义与用途实现方式 使用场景优势与劣势在Spring框架中的应用备忘录示例代码地址 引言 想象一下,你正在编辑一篇重要的文档,突然你意识到最近的一些更改实际上破坏了文档的结构。幸运的是,你的文本编辑器允许你撤…

哈希桶的模拟实现【C++】

文章目录 哈希冲突解决闭散列 (开放定址法)开散列 (链地址法、哈希桶)开散列实现(哈希桶)哈希表的结构InsertFindErase 哈希冲突解决 闭散列 (开放定址法) 发生哈希冲突时&#xf…

【MyBatis-Plus】进阶之乐观锁、悲观锁逻辑删除分页和查询构造器的使用

目录 一、乐观锁、悲观锁 1、什么是乐观锁和悲观锁 ①乐观锁(Optimistic Locking): ②悲观锁(Pessimistic Locking): ③实现方式 2、乐观锁和悲观锁的区别 ①乐观锁(Optimistic Locking) ②悲观锁&…

【CSAPP】探究BombLab奥秘:Phase_2的解密与实战

📋 前言 ​🌈个人主页:Sarapines Programmer🔥 系列专栏:《斯坦福大学之CSAPP》⏰诗赋清音:桃花灼灼春风暖,心随乐曲扬徐徐。 苦尽甘来梦未阑,岁月长河任舟游。 ​ 🎉欢迎…

消息队列基础知识

学一点,整一点,基本都是综合别人的,弄成我能理解的内容 https://blog.csdn.net/BenJamin_Blue/article/details/125946812 https://blog.csdn.net/qq_46119575/article/details/129794304 📌导航小助手📌 生产者-消费者…

【C语言】初识C语言

本章节主要目的是基本了解C语言的基础知识,对C语言有一个大概的认识。 什么是C语言 在日常生活中,语言就是一种人与人之间沟通的工具,像汉语,英语,法语……等。而人与计算机之间交流沟通的工具则被称为计算机语言&am…

Redis中RDB和AOF

Redis中RDB和AOF 定时间间隔执行数据集的时间快照,把某一时刻数据和妆容以文件的形式写到磁盘上,也就是快照。 配置文件 如果是普通安装方式可以跳过,如果是docker安装,需要到官网下载redis.conf配置文件到本地,地址…

单挑力扣(LeetCode)SQL题:1951. 查询具有最多共同关注者的所有两两结对组(难度:中等)

题目:1951. 查询具有最多共同关注者的所有两两结对组 (通过次数2,464 | 提交次数3,656,通过率67.40%) 表: Relations ------------------- | Column Name | Type | ------------------- | user_id | int | | follower_id |…

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理

深入浅出图解C#堆与栈 C# HeapingVS Stacking第二节 栈基本工作原理 [深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈](https://mp.csdn.net/mdeditor/101021023)[深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第二节 栈基本工作原理](https://mp.cs…

非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II)

Title: 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II) 姊妹博文 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (I) 非线性最小二乘问题的数值方法 —— 从牛顿迭代法到高斯-牛顿法 (II) ⟵ \longleftarrow ⟵ 本篇 非线性最小二乘问题的…

uniapp Vue3 面包屑导航 带动态样式

上干货 <template><view class"bei"><view class"container"><view class"indicator"></view><!-- 遍历路由列表 --><view v-for"(item, index) in routes" :key"index" :class&quo…

听GPT 讲Rust源代码--src/tools(28)

File: rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 文件路径 rust/src/tools/clippy/clippy_lints/src/operators/identity_op.rs 中的作用是定义了 IdentityOp 类型的 Clippy lint 规则&#xff0c;用于检查代码中是否存在不必要的恒等操作符&#xff0…

洛谷:线性表

今天开始刷洛谷&#xff0c;之前刷leetcode都是核心代码模式&#xff0c;现在突然让我用ACM模式&#xff0c;刚开始还是很不习惯的&#xff0c;但做了几道题好点了&#xff0c;只能说洛谷题的难度是比leetcode大的。 还有就是&#xff0c;STL牛逼&#xff01; 1.询问学号(vect…

具有权威性的工信部证书怎么考

工信部证书的考试流程如下&#xff1a; 选择正规报考机构&#xff1a;选择一家权威的培训机构或考试中心&#xff0c;确保其具有相应的资质和经验。 提交个人报考资料&#xff1a;根据考试机构的要求&#xff0c;提交相关的个人报考资料&#xff0c;如身份证、学历证明、工作…

【kubernetes】集群网络(一):基础篇

Flannel 1 路由表 & arp & fdb 1.1 路由表 任何网络设备都需要路由表&#xff0c;路由表用来决定&#xff0c;当收到数据包时&#xff0c;该向哪里进行转发。路由表项通常会包含以下几个字段&#xff1a; Destination&#xff1a;目的地Gateway&#xff1a;网关Mas…

【DDD领域驱动篇】如何理解领域驱动设计?

如何理解领域驱动设计? ✔️典型解析✔️扩展知识仓库✔️DDD带来的好处✔️DDD 的不足 ✔️典型解析 领域动设计(Domain-Driven Design&#xff0c;DDD)是一种软件开发方法论&#xff0c;将业务领域作为软件设计的核心&#xff0c;以便更好地满足业务需求。 DDD认为&#xff…