gcc 源码分析-从一个最简单的程序说起1

本文通过分析一个简单的无参数无函数体的C语言程序,详细介绍了GCC编译器的词法分析过程。从源代码到汇编代码的转换,展示了GCC如何处理词法单元,生成对应的tree_node节点。

本节将以一个最简单的函数来分析gcc 的执行过程,这个函数没有函数体,也没有传入的参数。
例子如下:

void main( )
  {
  
  
  }

执行之后产生的汇编应该是这个样子

.file	"test.c"
gcc_compiled.:
.text	.align 2
.globl _main
_main:
	pushl %ebp
	movl %esp,%ebp
L1:
	leave
	ret

这是用1.40 gcc 的cc1 程序直接产生,后续版本可能会增加其他一些内容,但可以看出这个
版本产生的代码是最简洁的,它只产生了一个栈帧。

首先作词法分析:

我们这里没有按照gcc源代码的做法,用手工做词法分析,而是采用词法分析工具flex,来完成词法分析,这样做的结果,代码看起来很简洁直观。涉及到的词法分析规则如下:

void         {     
                yylval.ttype = ridpointers[RID_VOID]; 
                return TYPESPEC; 
              }
[ \t]        ;
[a-zA-Z0-9]+ { 	
                 yylval.ttype = get_identifier (yytext);
		 lastiddecl = lookup_name (yylval.ttype);

		if (lastiddecl != 0 && TREE_CODE (lastiddecl) == TYPE_DECL)
		{
		    return TYPENAME;
		}
		return IDENTIFIER;
	      }

\n          { 
                lineno++; 
            }
.        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值