[翻译&演绎]LLVM教程::我的第一个基于LLVM的语言前端::第一章::词法分析器

导言

这段时间LLVM这个词突然经常出现在脑海里,例如一想到做Fuzz要各种插桩,然后AFL的插桩就是用到的LLVM,代码混淆框架 OLLVM 也是基于LLVM实现的。再加上以前也经常尝试写编译器,结果经常烂尾,撸到AST完成,后面就基本撸不动了,代码也比较乱,唯一一个能跑的是个Lisp解释器。想想LLVM天生是个强大的编译器设计框架,就来劲想彻底搞个小编译器出来,简单的能弄个程序出来,就开始学习官网的例子,自己同时用Flex, Bison设计前端,肝了三四天,最后勉勉强强弄了个出来。看看官网的教程没什么中文资料,打算翻译下打发时间。

我不打算直接翻译完整原文,首先原文其实挺容易理解,另外细节上的算法参考编译原理的书籍会更合适,手撸完整前端的过程有点浪费时间,且不是很有必要,所以我打算把我结合Flex/Bison等其他工程实现的过程做个介绍。

原文地址
我的实现::Fibol语言 基于Flex/Bison/LLVM实现的编译器

第一章 词法分析器

词法分析器

当我们想要实现一门语言时候,第一件需要完成的功能就是让程序有能力处理文本文件,并且理解其中内容意义。词法分析器(lexer)是一种传统的用于将输入分解成 “tokens” 的方法。词法器返回每个 “token” 的同时也潜在的携带一些元数据 (比如 文本中数字所代表的数值)。首先,我们需要定义各种可能的 “token” 。

//假设保留字  def  extern 
enum Token {
  tok_eof = -1,

  // 保留字
  tok_def = -2,
  tok_extern = -3,

  // 主要数据
  tok_identifier = -4,
  tok_number = -5,
};

static std::string IdentifierStr; // Filled in if tok_identifier
static double NumVal;             // Filled in if tok_number

在完成 token 的定义后,需要为每个token定义相关的规则,注意我们的词法器最终实现效果是提供一个输入文件,每次调用词法器都会返回一个token作为输出。通俗的说,如何确定文件中字符组成的是什么token就是我们需要定义的规则(词法器严格理论请参阅编译原理教材)

例如,定义这样一条规则,如果输入文件中遇到形如"xxx"双引号内包含任意字符,就视为一个字符串 token。要实现这样的规则就可以定义这样一个状态 1,当下一个字符为"时,进入状态 2, 在状态 2 下除非遇到 " 字符,否则所有字符都会被保存到内存中作为字符串token所必须的元数据的一部分。在状态 2 下遇到 " 字符 进入 状态 3,状态 3 返回定义好的代表字符串token值,同时返回携带的元数据。

a = getchr();
if( a == '\"'){
	while(1){
		if(getchr() 
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: LLVM编译器实战教程第二版是一本介绍LLVM编译器的实践指南,书中详细介绍了如何使用LLVM编译器来构建高性能的编译器、工具和应用程序。该书主要分为三个部分,分别是LLVM基础知识、编译器中的LLVM和工具中的LLVM。 在LLVM基础知识部分,作者首先介绍了LLVM的概念和架构,并详细讲解了LLVM中的IR表示和优化。然后,作者介绍了如何使用LLVM构建一个简单的编译器,包括如何实现词法分析、语法分析和代码生成。最后,作者讨论了如何使用LLVM来实现一些高级特性,例如JIT编译和LLVM IR的交互式优化。 在编译器中的LLVM部分,作者分别介绍了如何使用LLVM来开发C、C++和Objective-C编译器。该部分还讲解了如何使用LLVM来实现静态分析、污点分析和动态分析,并提供了一些实际的案例来帮助读者更好地理解。 在工具中的LLVM部分,作者介绍了如何使用LLVM构建一些实用的工具,例如调试器、反汇编器和符号化工具。该部分还讨论了如何使用LLVM来实现自定义的代码生成器和目标描述文件,以及如何使用LLVM来增强其他编程语言和环境中的编译器。 总之,LLVM编译器实战教程第二版是一本非常实用且系统的指南,它能够帮助读者深入了解LLVM编译器的内部机制和应用方法,并且可以作为开发高性能编译器和工具的参考书籍。 ### 回答2: LLVM编译器实战教程第二版是一本面向开发者的指南,它旨在引导读者了解LLVM编译器的内部运作机制,以及如何为其开发可扩展的前端和后端工具。该教程深入浅出地讲解了LLVM编译器的内部结构,包括词法分析、语法分析和代码生成等内容。同时该书提供了许多有关如何使用LLVM开发编译器的实用示例和应用案例,包括如何构建前端和后端的IR、如何使用全局优化和代码生成等。总之,LLVM编译器实战教程第二版是一本很好的LLVM编译器实践指南,它对于那些想要了解LLVM编译器内部的人、想要使用LLVM开发编译器的人或想要利用LLVM的优化和代码生成技术的人,都是一本非常有价值的参考书籍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值