通过词法分析实现的指出C程序中包含的头文件
在阅读有些程序的源码时,很希望能够马上弄清楚源码中到底包含了哪些头文件,以确定是否需要为了特殊的函数而手动加入#include。借助flex的词法分析实现了这一功能,本质上就是对正则表达式的匹配。注意这个程序不能够处理包含嵌套的情形(也就是说不能指出包含文件包含了哪些文件),感兴趣的可以通过栈来实现。源码如下:
/*源代码:ic.l*/ /*定义文件预处理指令文件名起始状态*/
%x IFILE %%
^"#"[ \t]*include[ \t]*[\"<] {BEGIN IFILE;} /*#include的多种表达方式的正则表达式*/
<IFILE>[^\t\n\">]+ {/*进入文件名状态*/
printf("%d:%s\n",yylineno++,yytext);/*输出行号和文件名,yylineno是flex定义的全局变量,yytext是当前
输入流*/
{
char c;
/*去处行尾可能的换行符*/
while((c=input()) && c!='\n');
}
/*回复至初始状态*/
BEGIN INITIAL;
}/*下面的RE用于处理行首换行(空行)和换行的情况,增加yylineno的值*/
^\n {++yylineno;}
\n {++yylineno;}
. {/*直接忽略*/}
%% int main(int argc,char *argv[])
{
/*命令行读取文件名参数*/
if (argc<)
{
fprintf(stderr,"Usage:%s filename\n",argv[]);
}
FILE *f;
int i;
/*循环打开文件*/
for (i=;i<argc;++i)
{
f=fopen(argv[i],"r");
if (!f)
{
perror(argv[i]);
exit(EXIT_FAILURE);
}
/*重新开始输入*/
yyrestart(f);
yylineno=;
/*开始新的文件,函数初始化为1*/
printf("\t%s:\n",argv[i]);
yylex();/*开始词法分析*/
printf("\n");
fclose(f);
}
return ;
}
编译指令:
$flex -o ic.lex.c ic.l
$gcc -o ic ic.lex.c -lfl
示范运行结果:
$ ./ic test_inc.c inc_count.lex.c
test_inc.c:
:stdio.h inc_count.lex.c:
:stdio.h
:string.h
:errno.h
:stdlib.h
:inttypes.h
:unistd.h
可见已经达到了目的。
通过词法分析实现的指出C程序中包含的头文件的更多相关文章
- [C++] C语言及C++语言中包含的头文件名称,及作用
头文件主目录include 头文件目录中总共有32个.h头文件.其中主目录下有13个,asm子目录中有4个,linux子目录中有10个,sys子目录中有5个.这些头文件各自的功能如下,具体的作用和所包 ...
- Makefile中自动生成头文件依赖
为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...
- Spring MVC程序中得到静态资源文件css,js,图片文件的路径问题总结
上一篇 | 下一篇 Spring MVC程序中得到静态资源文件css,js,图片 文件的路径 问题总结 作者:轻舞肥羊 日期:2012-11-26 http://www.blogjava.net/fi ...
- c++中 预编译头文件PCH
转载:https://blog.csdn.net/lovemysea/article/details/74858430 一.预编译头文件使用经验: 如果预编译头文件被正确使用时,它确实大大提高我们编程 ...
- Visual Studio 中使用万能头文件 #include <bits/stdc++.h>
最近开始使用VS,之前用的DEV C++软件可直接使用 #include <bits/stdc++.h> ,但VS中并没有,为了使用方便,可直接在VS中添加此头文件,方法如下: 1.在安 ...
- VC中包含的头文件名不区分大小写
VC中包含的头文件名,不区分大小写如 #include "my.h" = #include "MY.H".
- vscode中c/c++头文件引用找不到飘红
正在进行 GTK 学习, 但是在 vscode GTK 的头文件找不到(头文件引用底下飘红, 逼死强迫症), 影响敲字键入速度. 解决一下该问题-- vscode中c/c++头文件引用找不到(#inc ...
- 在控制台程序中,添加config文件
一.右击类库 → 添加 → 新建项 → 应用程序配置文件(或者选择一个XML文件,然后将名字改成XXX.config),内容如下: <?xml version="1.0" e ...
- 原生小程序中实现将scss文件实时编译为wxss文件
参考链接 全局安装gulp,方便以后直接执行gulp命令 npm install gulp -g 用原生小程序新建一个项目 在小程序根目录(app.js同级目录)中新建package.json文件 n ...
随机推荐
- leveldb源码分析—Recover和Repair
leveldb作为一个KV存储引擎将数据持久化到磁盘,而对于一个存储引擎来说在存储过程中因为一些其他原因导致程序down掉甚至数据文件被破坏等都会导致程序不能按正常流程再次启动.那么遇到这些状况以后如 ...
- C#初级知识点整理及VS的简单使用
C#预处理器指令#define #undef 声明一个不需赋值的变量注意的一点事它必须放到using 上面,如 #define TEST using System.xxx; public class ...
- Greenplum 4.3 For Centos 6.5 安装指南
1.greenplum数据库安装前期准备工作 1.1 安装Linux l 内存:最小1GB,推荐2GB或以上. l 交换空间: 内存大小是1-2GB时,交换空间是内存的1.5倍,内存大小2-16G ...
- 处理 InterruptedException——Brian Goetz
本文转自Brian Goetz大师在IBM的developerWorks中发布的文章: 中文地址:http://www.ibm.com/developerworks/cn/java/j-jtp0523 ...
- Redis-stat的安装与使用
redis-stat是一个用ruby写成的监控redis的程序,基于info命令获取信息,而不是通过monitor获取信息 一.安装ruby yum install -y ruby ruby-deve ...
- PPT制作教程:如何制作ppt
PowerPoint(PPT)是专门用于制作演示文稿(俗称幻灯片).广泛运用于各种会议.产品演示.学校教学等.学会如何制作ppt,成为提升工作效 率的好帮手.PPT包含有很多的功能,我们可以根据个人喜 ...
- c# 常用正则
"^\d+$" //非负整数(正整数 + 0) "^[0-9]*[1-9][0-9]*$" //正整数 "^((-\d+)|(0+))$" ...
- Merge Two Sorted Lists
Merge Two Sorted Lists https://leetcode.com/problems/merge-two-sorted-lists/ Merge two sorted linked ...
- bfs简单题-poj2251
宽搜基础题 思路很简单,注意细节. 走过的节点一定要打上标记//tag数组 三维字符串输入一定要注意 #include <stdio.h> #include <iostream> ...
- UESTC 31 饭卡(Card) --背包问题
背包问题. 思路:如果m<5,此时也不能消费,所以此时答案为m m>=5: 求出背包容量为m-5,买前n-1样便宜的菜(排个序)的最大价值(即最大消费,即消费完后剩余值最接近5)最后减去最 ...