分享
 
 
 

正则表达式实务之一:处理C语言头文件

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

本文并不对打算正则表达式的用法进行详细解析,通过google可以找到很多相关教程,只是通过一个实例展示正则表达式的强大功能。

案例:很多通讯系统,在长期的运行过程中,难免会遇到很多异常,为了定位错误原因,一个通常的方法就是给每种错误或者每个出错误的地方分配一个唯一的错误码,然后将这个错误码发送到后台,分析者可以根据这个错误码提供的附加信息,定位异常原因,解决故障。错误码和附加信息的对应关系通常被写入到一个INI配置文件中。现在我们就需要根据errorcode头文件内容建立二者的对应关系。

定义错误宏的头文件一般是这样的形式:

#define cmeProgramErrs_M (WORD)0 /*代码逻辑错误*/

#define cmeUnexpState_M (WORD)(cmeProgramErrs_M + 1) /*不期望的程序状态*/

#define cmeUnexpNullPointer_M (WORD)(cmeProgramErrs_M + 2) /*不期望的空指针*/

#define cmeConfigErrs_M (WORD)500 /*配置错误*/

#define cmeSysCapCfgErr_M (WORD)(cmeConfigErrs_M + 1) /*系统能力配置错误*/

其中错误的原因,直接用数字定义会根据类型分段,每段有一个基址,具体的错误原因会在基址上递增。最终生成的二者对应关系的INI配置文件应该如下面的形式:

1=cmeUnexpState_M(不期望的程序状态)

2=cmeUnexpNullPointer_M(不期望的空指针)

501=cmeSysCapCfgErr_M(系统能力配置错误)

最原始的方法当然是拷贝复制,从头文件中拷贝相关字段到INI文件中。当然,也可以自己编写C语言程序,分别寻找相应的标志字段,拆出每个字段,同时建立错误段基址的宏和其数值的对应关系,然后计算每个错误码,将对应关系写道INT文件中。这样的处理,听起来就比较麻烦,有没有比较好的方法?

下面利用正则表达式的功能,用Perl语言完成以上功能:

#!/usr/bin/perl -w

#

# change errorcode macro head file to INI file

#

# Passed filename to handle use strict;

my %base; #声明一个关联数组

#需要处理的文件,名称从命令行输入获得

my $file = shift or die "Missing input file name!";

open(IN, "$file") or die "Opening $file: $!";

open(OUT, ">$file.ini") or die "Opening {$file}.out: $!";

# handle content

while (<IN>)

{

if (m/\s*\#define\s+(\w+)\s+\(WORD\)(\d+)/) #对于基址格式定义

{

$base{$1} = $2; #将基址加入HASH表

}

elsif (m/\s*\#define\s+(\w+)\s+\(WORD\)\(\s*(\w+)\s*\+\s*(\d+)\s*\)\s*\/\*(.*)\*\//) #对于原因格式定义

{

my $BaseValue = $base{$2}; #查询HASH表中该基址对应值

if ($BaseValue ne '')

{

my $MacroValue = $BaseValue + $3;

my $comment = $4;

print OUT "$MacroValue=$1($4)\n";

}

else

{

print "Undefined base macro. line $.: $_";

}

}

}

close(IN);

close(OUT)

从上例,正则表达式的强大可见一斑。此外,在这种文本操纵的方面,也刚好是perl的用武之地。C语言虽然强大,但是在这里确实不太方便。一个真正pragmatic的程序员,不会拘泥于具体的环境和语言,而是根据具体的情况采取最恰当的工具。

btw:对于正则表达式的详细描述可以参考Friedl的Mastering Regular Expressions

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有