![](https://img-blog.csdnimg.cn/20201014180756754.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
cpp&compliers
文章平均质量分 63
jinnlxl
nothing,nothing at all
展开
-
从helloworld.c到a.out(2)预处理
本章介绍处理源代码的第一步原创 2014-10-16 12:55:50 · 679 阅读 · 0 评论 -
lcc源代码解析只decl.c
本文解析lcc中最复杂的模块之一decl.c,作为语法分析的一部分,它处理各个声明。#include "c.h"static char rcsid[] = "$Id: decl.c,v 1.1 2002/08/28 23:12:42 drh Exp $";#define add(x,n) (x > inttype->u.sym->u.limits.max.i-(n) ? (overfl原创 2015-01-01 19:45:49 · 1538 阅读 · 0 评论 -
语法分析的理论知识---整理自龙书
通常来说,语法分析器会构造一棵语法分析树抽象(不一定显示构造)。处理文法的语法分析器大体上有三类:通用,自顶向下,自低向上。通用语法分析算法如CYK和Earley可以用于分析任何文法,但是效率较低,不能用于编译器产品。顾名思义,自顶向下是从语法树的顶点开始像底部构造语法树,而自底向上则完全相反。自顶向下比较简单,不过用来分析C语言之类的简单语言,在一些辅助手段的辅助下已经足够用,l原创 2015-01-01 18:56:40 · 1361 阅读 · 0 评论 -
自顶向下的语法分析LL(1)
自顶向下的语法分析即是将输入词素从树的根节点开始,按照先根顺序开始创建语法树的各个结点,也是寻找输入串的最左推导的过程。常见的递归下降就是自顶向下语法分析机制的一种,lcc就是使用这种机制,但是这个机制需要回溯(或者使用预测分析表,向前看k个输入词素,即LL(k)文法)。FIRST集合和FOLLOW集合:鉴于递归下降的语法分析在处理有多产生式的非终结符号时,难以确定究竟应该使用哪个产生原创 2015-01-01 19:35:02 · 2754 阅读 · 0 评论 -
lcc 源代码解析之token.h
元旦憋了两天,终究是没能透彻的理解表达式的语法分析,关于这部分等我自己搞明白再分享出来,又要开工了,每天只有有限的时间区分析代码,再加上还要抽空看看面试题,估计要费一段时间了。先分享一道小菜,即头文件token.h,这是一个十分重要的头文件,用的也很奇妙,当然,这损失了代码的部分可读性。/* $Id: token.h,v 1.1 2002/08/28 23:12:47 drh Exp原创 2015-01-04 23:07:05 · 997 阅读 · 0 评论 -
lcc源代码解析之gen.c
代码生成器是编译器中的一个非常重要的模块,原创 2015-06-03 23:33:41 · 1287 阅读 · 0 评论 -
lcc源代码解析之dag.c
有向无环图(dag)通常被用作编译器中存储代码的数据结构,在lcc中也不例外。原创 2015-06-03 20:56:49 · 1185 阅读 · 0 评论 -
lcc源代码解析之x86后端
在前面的文章中已经介绍过,lcc中跟硬件平台相关的配置由src中*.md配置,本文以x86为例,详解这一部分的工作机制。熟悉汇编的同学都知道32位x86机器有八个通用寄存器:eax ebx ecx edx esi edi esp ebp而ebp和esp两个寄存器是有固定作用的,其保存的帧指针和栈指针是组成栈帧的基本组成部分,所以这两个寄存器不参与分配。在x86.md的最下面原创 2015-06-07 22:54:47 · 1634 阅读 · 0 评论 -
lcc源代码解析之interface
我们都知道lcc是一个可指定目标的编译器,具体目标平台可以用-target指定,有点类似嵌入式开发中的交叉编译器的味道。我们知道编译器通常分为前端和后端,前端复制词法和语法的解析,后端负责具体平台上的执行代码的生成,对于lcc而言,编译器启动时会依据用户的输入-target来识别目标,做好相关初始化,这个初始化实际上就是初始化一个结构体,填充其中的函数指针。这个结构就是本文即将分析的i原创 2014-12-21 21:05:43 · 1113 阅读 · 0 评论 -
lcc源代码解析之tree.c
这个小模块主要描述一种树状抽象的数据结构,这个数据结构用于存储源代码初步分析之后的结果。原创 2015-05-25 17:05:32 · 818 阅读 · 0 评论 -
lcc源代码解析之expr.c
又憋了一个周天,终于大概搞明白了表达式解析这一编译器中我个人认为也许最迷人的部分。之所以代码读起来费劲,主要还是在于理论上没有搞清楚,确实很绕,需要反复理解。所以,打算在本篇之后写一篇理论的科普文,尽管因为我文字表达能力太烂,这是我一直竭力避免的。其实细节上还是有不少不明白的地方,但是下周估计单位工作会比较忙,所以先把代码贴上来,然后慢慢完善,不然不知道又要拖到什么时候。#原创 2015-01-12 00:25:18 · 1257 阅读 · 0 评论 -
C语言文法
C语言文法原创 2015-01-18 01:24:31 · 4932 阅读 · 0 评论 -
nfa&dfa
词法分析器生成工具lex将它的输入程序原创 2014-07-30 00:02:01 · 1323 阅读 · 0 评论 -
从helloworld.c到a.out(1)概述
不管你是否写过下过这段程序,你一定原创 2014-10-15 14:30:04 · 959 阅读 · 0 评论 -
从helloworld.c到a.out(3)词法分析
本节介绍经过预处理之后的源代码进入微观原创 2014-10-16 21:54:04 · 665 阅读 · 0 评论 -
lcc源代码解析之sym.c
lcc是一款小巧的工业级编译器,代码精简,代码开源,相比gcc更适合编译器初学者阅读。你可以在这里搞到代码:https://github.com/drh/lcc但是,怎么说呢,这个代码防盗性较强,几乎没有注释,我在阅读源码中参考了其他前辈关于lcc的文章以及官方推荐书籍《a Retargetable C Compiler---Design and Implementation》同时原创 2014-11-30 00:08:51 · 1811 阅读 · 0 评论 -
lcc源代码解析之string.c
本文要解析的lcc字符串处理相关的代码,实际上不止是可以再lcc中使用,也可以单独摘出来用于需要的地方,里面的实现还是有不少可以借鉴的地方,废话不多少,代码上。#include "c.h"static char rcsid[] = "$Id: string.c,v 1.1 2002/08/28 23:12:46 drh Exp $";static struct string { ch原创 2014-12-02 22:40:00 · 827 阅读 · 0 评论 -
lcc源代码解析之types.c
最近好TM的忙啊,坑爹教练让每天五点钟起床去练车,平均每天至少有四个设备启动,运行中异常重启的问题报过来,我也是醉了。今天终于有点时间继续写blog了,废话不多说,代码上。今天解析lcc中的一个重要模块,类型管理相关,主要代码在types.c中,前面的符号表管理模块中就有对这部分的使用。首先,依然是相关数据结构的解析,在c.h中#define fieldsize(p) (p)->原创 2014-12-18 20:51:41 · 1251 阅读 · 0 评论 -
lcc源代码解析之alloc.c
本章学习lcc的内存管理模块,同string处理模块类似,这个模块也可以独立于lcc使用,实际上这个模块实现的是一个简单的内存池的概念,具体代码如下:#include "c.h"/*lcc内存管理的基本单位,以链表组成的block形式存在*/struct block { struct block *next; char *limit;/*从block的起始地址到limit的这段空间原创 2014-12-21 21:59:05 · 827 阅读 · 0 评论 -
C语言的形参和实参个数不一致问题
最近多个分支往基线合并,不同分支上基于不同平台的硬件抽象层提供给应用层的接口有变化,函数参数个数的变化是其中一个大类。这带来的一个问题,实参和形参个数不一致,能编译通过,且有些情况没有警告,并且能链接通过,但是运行时会产生严重的运行时错误。事实上,实参和形参个数不一致的问题,编译器是做了检查的,虽然这个检查机制不太完美。在存在前置声明的情况下,编译器是会做实参和形参个数的检查的,建立两原创 2014-12-29 15:51:10 · 16165 阅读 · 1 评论 -
lcc源代码解析之input.c
坑爹的科目二终于考完了,半坡起步终归还是忘了打转向灯,5.3.0也即将系统测试,终于有时间继续blog了。在正式开始词法解析器的代码解析之前,还需要了解一下一个和lex协同工作,更准确的说,给lex提供输入的小模块input。这个小模块的主要功能就是一句lex的需要读取源代码,输出给lex,其中一些重要的全局指针变量如 cp limit需要比较熟悉。一下是代码的具体解析部分:#原创 2014-12-28 21:35:37 · 869 阅读 · 0 评论 -
lcc源代码解析之lex.c
有了前面的铺垫,终于可以上正餐了,本节解析编译器的一个重要组件:词法分析器,即lcc的lex.c文件。lcc出于对效率的考虑,并没有使用类似nfa思想的自动词法解析生成工具来生成,而是采用了手写的lex。具体代码如下:#include "c.h"#include #include static char rcsid[] = "$Id: lex.c,v 1.1 2002/08/2原创 2014-12-28 23:48:59 · 2427 阅读 · 0 评论 -
lcc源代码解析之stat.c
前面的章节里已经解析了表达式部分,在理解了表达式的基础上,现在更进一步来理解语句。在C语言中,语句(statement)是一个比表达式(expression)更高粒度的存在,也即表达式是语句的组成成分。具体的C语言语法格式如下:statement:ID:statementcase constant-expression:statementdefault:statement原创 2015-05-24 22:11:38 · 1309 阅读 · 0 评论