Kaleidoscope lexer

学习内容

完成对https://github.com/zy445566/llvm-guide-zh/blob/master/Chapter01/README.md
https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl01.html
的学习。

练习

看懂原网页后,实现同样的功能。
实现时需要做如下改进:
使用class将lexer封装起来,不使用全局变量
使用stream来抽象输入,使得lexer能支持stdin和文件两种方式作为输入。

扩展

clang 是如何实现lexer,如何取出和记录token的
玩具实现和clang的实现之间有没有实质性的区别

进展

实现

参考原有实现,做了如下一些改进:
使用了lexer 类来封装原示例中的全局数据;
使用基于istream的抽象,使得lexer可以支持文件和stdin两种输入;
使用独立的token 类,逻辑更清晰(我们使用string 存放token对应的字符串比较低效,clang是直接使用一个char *ptr+ size来给出这个信息,避免了存放冗余的信息 ,占用内存少速度也更快)。

clang对比

总体来说,clang的lexer核心逻辑和我们的学习示例一致。
lexer部分给出的token,最关键的就是Kind(相当于我们的type)和 PtrData (相当于我们的raw_str)
include/clang/Lex 中可以作为分析入口。
lexer.h中含有各类主要问题的分析入手点。其中FormTokenWithChars函数比较典型。

由于clang需要进行考虑预处理(包括include、marcro等),记录token在源代码中的位置等,其lexer的实现要复杂很多。