最近开始尝试用go写点东西,正好在看LLVM的资料,就写了点相关的内容 - 前端解析器+中间代码生成(本地代码的汇编、执行则靠LLVM工具链完成)

https://github.com/daibinhua888/toy-compiler

go语言用下来感觉还好,类的实现比较面向过程,但还是OO的,package的用法import是基于文件夹相对路径的,go get安装这些要看具体库(如果和c强相关,就比较痛苦,要装一堆gcc、cmake之类的工具,比如llvm)

用go写的玩具编译器,最终目标是后端套用LLVM生成本机字节码

#Code:

parseCode("def test()")
parseCode("def test(p1,p2)") parseCode("a1") parseCode("1+1") parseCode("p1(a,b)+p2(a,b)") parseCode("1+(2+3)") parseCode("def test(p1,p2) p1(a,b)+p2(a,b)") parseCode("def showMessge(msg) toy_print(msg)") parseCode("showMessge('test')")

#AST:

command>def test(), 解析AST:def-()-(SIG)test()Body Expr: empty-()
command>def test(p1,p2), 解析AST:def-()-(SIG)test(p1,p2,)Body Expr: empty-() command>a1, 解析AST:identifier-a1() command>1+1, 解析AST:Operator-(+)(LHS: 1)numeric-()---(RHS: 1)numeric-()--- command>p1(a,b)+p2(a,b), 解析AST:Operator-(+)(LHS: 0)identifier-p1()-(CALL)p1(a,b,)---(RHS: 0)identifier-p2()-(CALL)p2(a,b,)--- command>1+(2+3), 解析AST:Operator-(+)(LHS: 1)numeric-()---(RHS: 0)Operator-(+)(LHS: 2)numeric-()---(RHS: 3)numeric-()------ command>def test(p1,p2) p1(a,b)+p2(a,b), 解析AST:def-()-(SIG)test(p1,p2,)Body Expr: Operator-(+)(LHS: 0)identifier-p1()-(CALL)p1(a,b,)---(RHS: 0)identifier-p2()-(CALL)p2(a,b,)--- command>def showMessge(msg) toy_print(msg), 解析AST:def-()-(SIG)showMessge(msg,)Body Expr: identifier-toy_print()-(CALL)toy_print(msg,) command>showMessge('test'), 解析AST:identifier-showMessge()-(CALL)showMessge('test',) *********RUN CODE********** CODE 2 RUN>def showMessge(msg) toy_print(msg) CODE 2 RUN>showMessge('test')

#LLVM IR:

declare i32 @puts(i8* nocapture) nounwind @.test = private unnamed_addr constant [6 x i8] c"test\0A\00" define void @showMessge(){ ; %cast210 = getelementptr [6 x i8], [6 x i8]* @.test, i64 0, i64 0 call i32 @puts(i8* %cast210) ret void } define i32 @main(){ ; call void @showMessge() ret i32 0 }

#llc

>>lli code.ll
>>test

转载于:https://www.cnblogs.com/aarond/p/llvm.html

手写token解析器、语法解析器、LLVM IR生成器(GO语言)相关推荐

  1. 使用Caffe进行手写数字识别执行流程解析

    之前在 http://blog.csdn.net/fengbingchun/article/details/50987185 中仿照Caffe中的examples实现对手写数字进行识别,这里详细介绍下 ...

  2. 阿里架构师手写Tomcat——Session源码解析

    在 web 开发中,我们经常会用到 Session 来保存会话信息,包括用户信息.权限信息,等等.在这篇文章中,我们将分析 tomcat 容器是如何创建 session.销毁 session,又是如何 ...

  3. 手写一个electron本地音乐播放器

    myaMusic 一个基于 electron-vue 开发的音乐播放器 使用:vue+element+electron 源码地址: maya1900/myamusic: a simple local ...

  4. PostgreSQL的学习心得和知识总结(一百一十八)|深入理解PostgreSQL数据库 匿名块 的词法解析和语法解析流程(DRCLARE子句)

    目录结构 注:提前言明 本文借鉴了以下博主.书籍或网站的内容,其列表如下: 1.参考书籍:<PostgreSQL数据库内核分析> 2.参考书籍:<数据库事务处理的艺术:事务管理与并发 ...

  5. 鸿星尔克因公司系统崩溃、恳请顾客退款;乔布斯首份手写求职信拍卖出222万;OpenAI 开源 Triton语言|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 孙胜 出品 | CSDN(ID:CSDNnews) ...

  6. mysql+优化器+软解析_MySQL执行计划 - osc_93u9qofu的个人空间 - OSCHINA - 中文开源技术交流社区...

    执行计划,SQL语句过来,会先解析,词法解析,语法解析,之后生成执行计划,计划上会算出使用全盘扫秒还是依靠索引, mysql不缓冲执行计划,oracle有 体系结构 1.优化器--->执行计划 ...

  7. 安卓pdf阅读器_安卓6.0+2GB+32GB支持手写!BOOX Nova Pro电子书阅读器隆重上市

    近两年,给阅读器配备手写笔逐渐成为了电纸书行业的一种潮流.2月23日,文石隆重推出了一款全新的7.8寸电子书阅读器BOOX Nova Pro. 这款产品最特别的地方在于,它首次给7.8寸的小屏阅读器配 ...

  8. 内核级python:编译器的词法和语法解析基本原理

    python在收到代码内容后,首先要启动两个流程,分别为词法解析和语法解析.看过我编译原理课程的同学对这两个流程应该不陌生.词法解析其实就是把代码里面不同的元素分别归类,例如234,1.35,1e3等 ...

  9. pg/og内核原理-词法语法解析(更新中)

    目录 概念与含义 流程概览 词法语法代码 parsenode.h kwlist.h scan.l gram.y bison的使用 查看状态机 解决规约冲突 plpgsql的词法与语法 概念与含义 一条 ...

最新文章

  1. Python代码转Latex公式,这个开源库用一行代码帮你搞定
  2. 操作系统lab2实验总结——Part1
  3. 学了java然后深入_JAVA8学习——从源码角度深入Stream流(学习过程)
  4. C#泛型学习实例(简单易懂)
  5. 高手云集 WCTF世界黑客大师赛今日开战
  6. Win10中小娜无法搜索本地应用
  7. 图的邻接矩阵求图的出度,入度,可达矩阵,判断强连通,弱连通,单向连通(C++,vs2017)
  8. QQ技术攻略-原来隐藏着这么多秘密
  9. 华为v30怎么升级鸿蒙系统,这四款华为手机可升级到鸿蒙系统,老机型居多,最低只需千元!...
  10. 应用Python爬虫技术获取福彩历史数据
  11. Windows 10 启用telnet client功能
  12. Autodesk Alias AutoStudio 2021.3.1
  13. 快改密码!Struts2漏洞引爆网站“泄密门”
  14. Qt 在GraphicsView中 打开一幅图片
  15. java 深入剖析ThreadLocal
  16. 高等教育计算机等级,[高等教育]全国高校计算机等级考试5.doc
  17. ABB助力国网冀北电力打造虚拟电厂
  18. 总结常用的Javafx功能及用法(上)
  19. react-native集成极光推送
  20. Python实例26:佛祖镇楼

热门文章

  1. python中模块文件的扩展名不一定是py_python模块和python包有什么区别?
  2. igllib 203 Curvature directions
  3. error和warning指令
  4. pytorch dropout代码解读
  5. 图像的输入\输出和显示
  6. 服务器开机后显示f1 f2,电脑开机总是提示按f1 f2问题的解决办法
  7. android 4.3 模拟器,模拟器上的Android 4.3
  8. mysql所有选修课程都及格_Day37:MySQL 数据库 ---(7)
  9. html特殊字符p如何屏蔽 asp,利用asp去除html标记的四种方法
  10. for语句的执行过程_深入学习MySQL 01 一条查询语句的执行过程