(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://xiahunao.cn/news/2659284.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

2023年中职“网络安全”——B-5:网络安全事件响应(Server2216)

B-5:网络安全事件响应 任务环境说明: 服务器场景:Server2216(开放链接) 用户名:root密码:123456 1、黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程,找出启…

医院安全(不良)事件报告系统源码 支持二次开发、支持源码交付

医疗不良事件报告系统源码旨在建立全面的、统一的医疗不良事件标准分类系统和患者安全术语,使不良事件上报管理更加标准化和科学化。通过借鉴国内外医疗不良事件报告系统的先进经验,根据医疗不良事件的事件类型、处理事件的不同部门,灵活设置…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是: 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…

Android Jetpack之用Room+ViewModel+LiveData实现增删改查数据(createFromAsset())

文章目录 一、Room简介二、用RoomViewModelLiveData增删改查数据三、下载源码 一、Room简介 Room是Google推出的数据库框架,是一个 ORM (Object Relational Mapping)对象关系映射数据库、其底层还是对SQLite的封装。 Room包含三个主要组件: 数据库类&…

润和软件HopeStage与亚信安全云主机深度安全防护系统完成产品兼容性互认证

近日,江苏润和软件股份有限公司(以下简称“润和软件”)HopeStage 操作系统与亚信科技(成都)有限公司(以下简称“亚信安全”)云主机深度安全防护系统完成兼容性测试。 测试结果表明,企…

golang并发安全-sync.map

sync.map解决的问题 golang 原生map是存在并发读写的问题,在并发读写时候会抛出异常 func main() {mT : make(map[int]int)g1 : []int{1, 2, 3, 4, 5, 6}g2 : []int{4, 5, 6, 7, 8, 9}go func() {for i : range g1 {mT[i] i}}()go func() {for i : range g2 {mT[…

Mysql 将数据按照年月分组 统计

要的效果: 方案: ① 使用 DATE_FORMAT(date, ‘%Y-%m-%d’) 函数 DATE_FORMAT 怎么去使用格式化,取决于后面的格式模式。 我们这里只是想区分到年 、月, 所以我们的sql 里面使用 %Y-%m : SELECT DATE_FORMAT(create_time, %Y-%m) AS …

Bind for 0.0.0.0:2379 failed: port is already allocated

1、执行命令docker-compose -p docker-apisix up -d 报错 Error response from daemon: driver failed programming external connectivity on endpoint docker-apisix-etcd-1 (2a92a0cefff9194fcd1dad4bdeabf4201d9047ec2633eda455c6e46528668af4): Bind for 0.0.0.0:2379 fa…

c++输入输出流和文件操作总结

目录 一、c的输入输出流——> 指的是字节流的数据传送;具有类型安全和可扩展性。 二、流的出入路径 三、c流类库 ①概览 ②标准输出流: ③标准输入流: 四、文件操作(ascii文件和二进制文件) 五、字符串流(或称…

【力扣题解】P94-二叉树的中序遍历-Java题解

👨‍💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【力扣题解】 文章目录 【力扣题解】P94-二叉树的中序遍历-Java题解🌏题目描述💡题解&#x1f30f…

oracle与mysql的分析函数(窗口函数)

分析函数定义 在SQL语句中,很多查询语句需要进行GROUP BY分组汇总,但是一旦经过分组,SELECT返回的记录数就会减少。为了保留所有原始行记录,并且仍可以进行分组数据分析,分析函数应运而生。 Oracle 8i 版本开始支持窗…

C++实现令牌桶过滤算法

什么是令牌桶算法 令牌桶算法通过限制令牌桶的固定容量,实现对资源以及流量的延迟控制。请求者需先获取令牌,方可执行动作。若令牌桶内具有足够令牌便可通过消耗相等数量放过请求;而若令牌不足,则会拒绝请求。 该算法具备平滑的…

C语言停车场模型详解

C语言停车场模型详解 1. 引言2. 代码概述3. 代码详解3.1 定义常量和数据结构3.2 初始化车库3.3 查找车辆所在车库3.4 查找车辆所在的车位3.5 打印车库状态3.6 打印等候车辆3.7 车辆入库3.8 车辆出库3.9 菜单功能3.10 主函数 5.效果展示5.完整代码6. 总结 1. 引言 本文将介绍一…

Android : 画布绘制矩形和文字 让其居中显示简单应用

示例图: CenterView.java package com.example.demo;import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.util.Log; import android.view.View;public class Center…

生成式 AI 原生开发

如何成为生成式AI原生开发者,快速进入: 下一站 GenAI QCon 上海站喊你上车啦! 无限构建,成为生成式 AI 原生开发者,12 月 28 日,下一站 GenAI 巴士即将抵达 QCon 全球软件开发大会上海站,码…

人大女王金融硕士为何是在职金融人士提升自己的首选?一起来看看

在这个经济飞速发展的时代,职场竞争愈发激烈,如果一味的安于现状,那么很有可能被社会所淘汰。近年来,金融行业的发展更是迅速,对于高端人才的需求也越来越大。所以对于从事这行的工作者来说,在职研究生就是…

QML —— RadioButton的两个经典示例(附完整源码)

示例1-效果 示例2-效果 实例1 - 源码 import QtQuick 2.12 import QtQuick.Window 2.12import QtQuick.Layouts 1.12 import QtQuick.Controls 2.5Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Text{id: classNametext: qsTr("--&quo…

金融贷款行业怎么精准获客,电销打吐了!教你两招

助贷行业,一般都会设有kpi,压力竞争都不小。虽然现在贷款电销大家对此意见不同,但是,不可否认,这个行业,电销就是它们最快速的获客方式。只要耐得住性子,有一份精准的话单,就可以开工…

在线教育系统源码解读:定制化企业培训APP的开发策略

当下,企业培训正经历着一场数字化的迭代,定制化企业培训APP应运而生,成为提升员工技能、推动企业发展的重要工具。下文小编将与大家一同深入了解在线教育系统的源码,探讨开发定制化企业培训APP的策略,以满足不同企业的…

AI大模型引领未来智慧科研暨ChatGPT在地学、GIS、气象、农业、生态、环境等领域中的高级应用

以ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Diffusion、星火大模型、文心一言、千问为代表AI大语言模型带来了新一波人工智能浪潮,可以面向科研选题、思维导图、数据清洗、统计分析、高级编程、代码调试、算法学习、论文检索、写作、翻译、润色、文献辅助…