深入研究Clang(七) Clang Lexer代码阅读笔记之Lexer

作者:史宁宁(snsn1984)

源码位置:clang/lib/Lexer.cpp

源码网络地址:http://clang.llvm.org/doxygen/Lexer_8cpp_source.html

Lexer.cpp这个文件,是Clang这个前端的词法分析器的主要文件,它的内容是对Lexer这个类的具体实现,原文件的注释中:“This file implements the Lexer and Token interfaces.” 这么解释这个文件的,但是Token只有两个简单函数的实现,剩下的都是Lexer的实现。所以要想搞清楚Clang的词法分析器是怎么实现的,那么必须对这个文件有着深入的理解。

从Lexer的初始化函数开始入手:

void Lexer::InitLexer(const char *BufStart, const char *BufPtr,
   56                       const char *BufEnd) {
   57   BufferStart = BufStart;
   58   BufferPtr = BufPtr;
   59   BufferEnd = BufEnd;
   60
   61   assert(BufEnd[0] == 0 &&
   62          "We assume that the input buffer has a null character at the end"
   63          " to simplify lexing!");
   64
   65   // Check whether we have a BOM in the beginning of the buffer. If yes - act
   66   // accordingly. Right now we support only UTF-8 with and without BOM, so, just
   67   // skip the UTF-8 BOM if it‘s present.
   68   if (BufferStart == BufferPtr) {
   69     // Determine the size of the BOM.
   70     StringRef Buf(BufferStart, BufferEnd - BufferStart);
   71     size_t BOMLength = llvm::StringSwitch<size_t>(Buf)
   72       .StartsWith("\xEF\xBB\xBF", 3) // UTF-8 BOM
   73       .Default(0);
   74
   75     // Skip the BOM.
   76     BufferPtr += BOMLength;
   77   }
   78
   79   Is_PragmaLexer = false;
   80   CurrentConflictMarkerState = CMK_None;
   81
   82   // Start of the file is a start of line.
   83   IsAtStartOfLine = true;
   84   IsAtPhysicalStartOfLine = true;
   85
   86   HasLeadingSpace = false;
   87   HasLeadingEmptyMacro = false;
   88
   89   // We are not after parsing a #.
   90   ParsingPreprocessorDirective = false;
   91
   92   // We are not after parsing #include.
   93   ParsingFilename = false;
   94
   95   // We are not in raw mode.  Raw mode disables diagnostics and interpretation
   96   // of tokens (e.g. identifiers, thus disabling macro expansion).  It is used
   97   // to quickly lex the tokens of the buffer, e.g. when handling a "#if 0" block
   98   // or otherwise skipping over tokens.
   99   LexingRawMode = false;
  100
  101   // Default to not keeping comments.
  102   ExtendedTokenMode = 0;
  103 }
时间: 2024-08-24 12:38:17

深入研究Clang(七) Clang Lexer代码阅读笔记之Lexer的相关文章

深入研究Clang(六) Clang Lexer代码阅读笔记之Preprocesser

clang/include/clang/Lex/Preprocesser.h 这个文件是包含clang::Preprocesser类的定义的头文件.它是类C语言(C.C++.Object C)的预处理的头文件.也就是说,类C语言的预处理都会用到此处的代码. 00082 /// \brief Context in which macro name is used. 00083 enum MacroUse { 00084 MU_Other = 0, // other than #define or

深入研究Clang(五) Clang Lexer代码阅读笔记

作者:史宁宁(snsn1984) Clang的Lexer(词法分析器)的源码的主要位置如下: clang/lib/Lex    这里是主要的Lexer的代码: clang/include/clang/Lex   这里是Lexer的头文件代码的位置: 同时,Lexer还使用了clangBasic库,所以要分析Lexer的代码,clangBasic(clang/lib/Basic)的一些代码也会用到. 首先从Lexer入手. clang/include/clang/Lex/Lexer.h clang

梦断代码阅读笔记有感之二

08梦断代码阅读笔记有感之二 在梦断代码的一开始我们就学会了如何去写代码,如何成功的去做一个软件工程师. 在现在人的严重,也许软件工程师写出的代码只是让人在玩游戏,在用一些简单的用代码写出的软件.只是认为工程师在不断地重复着一个动作:写代码.但我只能说你们大错特错,就像在文章中说的那样,其实软件工程师是在:“改变世界”,他们利用他们的手用键盘在电脑上打出一行一行的代码,程序产生了,一个新的软件也就产生了.而且,众所周知的,工程师做一个软件,总是在无限制的更新他的内容,让我们的软件更加的先进化,就

梦断代码阅读笔记有感之三

09梦断代码阅读笔记之三 这是最后一篇的阅读笔记,我发现时间真的过的好快好快. 想想以前,我们总是在应付一切的差事,但是真正的到最后,我们才发现,到最后吃亏的还是我们自己. 从前的我们,我们总是对自己大脑中的东西一片一片的特别的混乱.其实我们就像作者所说的,我们就像放任胡乱的cd随地的乱放,到最后不知道哪是哪.我们应该学会分类去放置,例如:我们可以根据歌唱者的名字,音乐的类型等等,其实这些东西对于我们写代码也同样的试用,刚开始的上大一时候,我们第一次的学习C++,我们只是随时随地的在写代码,并不

socketserver.py代码阅读笔记

socketserver.py源码阅读笔记 前言 一直想弄清楚一个http server和Web框架的工作原理.但以我目前的实力,阅读一个http server或web框架代码还是太难了.后来又对异步IO.并发产生的兴趣.前几天做一个大作业需要写几个各种不同并发模型的TCP Server,写完才想起Python有现成的socketsever模块可以用,完全不需要自己写.于是对比了一下我写的代码和socketsever.py,发现我写的真没socketsever写的好.我的代码经验还是太少了.于是

梦断代码阅读笔记二(4-7章)

在上一周<梦断代码>读完了第七章,全书已经过半,对于这本书有了更深的体会,对于软件开发之难也更加理解.      乐高王国一章中引出了一个代码世界或者说程序员世界里的美好设想——程序将由可复用的部件组合而成,软件部件将在全球范围内提供,软件工程将从编程的窠臼中解放出来.软件组件就像乐高积木一样,细小.不能再分.可被替代.可以自由组合.这是代码复用的概念,这会省去编写代码的麻烦,但是也存在不少问题,诸如大型可复用组件的稀少,有些程序员不愿拾人牙慧等等.其实我认为这是一个不错的设想,也是一个值得努

梦断代码阅读笔记(5-7)

第五章--管束奇客和狗 用代码的多少去衡量一个程序员的好坏是最白痴的做法,一段精彩的代码或许仅仅是小小的一段创新,而那种做法只会让越来越多的人敲出越来越杂乱无章繁琐的代码.在变成当中我们可以用一部分时间来寻求简洁的方法路径,磨刀不误砍柴工,但是我们不能把这段时间过多的放大.就像我本来做饭而去超市买醋,却看到了旁边的衣服,逛了半天商场,忘记了本事是要来买醋的. 第六章--完成设计方案 通过对这一章节的阅读,让我认识到了对程序备份的重要性.或许我们可以足够的相信自己,但是我们也要为所有的结果预留合适

梦断代码阅读笔记之四

第七章 OSAF的第一个"演示日",看起来并不顺畅的演示,但是却是实现了以往没有过的模块,是工作人员们几个月的心血.而这整个改变正是许多细节都发生改变的结果.用户的错误理解却真实反映出关注细节.无视上下文的阅读方式是编程大牛们的专长.规格说明是程序员的圣经,编写一个好的规格说明很不易,但却很重要.     Chandler进程缓慢,虽然看客们都对其表示怀疑,感觉Chandler永远也做不出来了,但是只有卡普尔坚信坚持就会有回报,正是因为卡普尔的不懈坚持,创造了一个更好. 更灵活.更稳定

梦断代码阅读笔记之一

最近阅读了罗森伯格的<梦断代码>,算是近距离观察了十几年前软件开发的状态.这本书是作者对OSAF主持的Chandler项目进行田野调查  而写的一本书.本书是在讲一事,也是在讲百千事:是写一软件,也是在写千百软件.在描述Chandler项目的过程当中亦提出了很多观点,带给我们很多思考.让我们这些软件工程专业的学生对软件开发有了一个更深层次的认知. 在本书第一章,作者为我们介绍了一个布鲁克斯法则:"往已延误的项目里补充人力,只会使其继续延误". 布鲁克斯曾是IBM的资深程序经