我正在尝试编写一个正则表达式来解决下面的C结构 我们的要求之一。 我正在解析C结构文件。在那里我将有子和父结构。子将继承父结构成员。我想要输出,它由结构成员组成,并有进一步处理的长度
INPUT:
#define Len1 10;
#define Len2 20;
#define Len3 3;
#define Len4 4;
typedef struct
{
char CHAR1 [Len1];
char CHAR2 [Len2];
} MyParent;
typedef struct
{
MyParent base;
char CHAR3 [Len3];
char CHAR4 [Len4];
} MyChild;
在上面我必须得到:在OUTPUT:
之下 CHAR1 10
CHAR2 20
CHAR3 3
CHAR4 4
Perl脚本将非常有用;
答案 0 :(得分:4)
在我给出答案后你改变了问题。虽然答案不是那么复杂,但这并不是什么大不了的事。你记得你在#define
中看到的内容并在以后使用它们:
while( <DATA> ) {
if( /^#define\s+(\w+)\s+(\d+)/ ) {
$Len{$1} = $2;
}
elsif( /^char\s/ ){
s/(?<=CHAR\d)\s+//;
s/;$//;
s/(?<=\[)(\w+)(?=])/ $Len{$1} || $1 /e;
print;
}
}
这是一个非常微不足道的问题。你确定你有什么不告诉我们的吗?你不需要做任何花哨的事情。跳过要忽略的所有行,并修复剩余的行以符合您的输出需求:
while( <DATA> ) {
next unless /^char\s/;
s/(?<=CHAR\d)\s+//;
s/;$//;
print;
}
__DATA__
#define Len1 10;
#define Len2 20;
#define Len3 3;
#define Len4 4;
typedef struct
{
char CHAR1 [Len1];
char CHAR2 [Len2];
} MyBase;
typedef struct
{
MyBase base;
char CHAR3 [Len3];
char CHAR4 [Len4];
} MyStruct;
答案 1 :(得分:2)
这个怎么样:
#!/usr/bin/perl
use strict;
use warnings;
my %len;
while( <DATA> ) {
if (/^#define\s+(\w+)\s+(\d+)\s*;/) {
$len{$1} = $2;
} elsif (s/^\s*char\s+(\w+)\s+\[(\w+)\]\s*;/$1 $len{$2}/) {
print;
}
}
__DATA__
#define Len1 10;
#define Len2 20;
#define Len3 3;
#define Len4 4;
typedef struct
{
char CHAR1 [Len1];
char CHAR2 [Len2];
} MyBase;
typedef struct
{
MyBase base;
char CHAR3 [Len3];
char CHAR4 [Len4];
} MyStruct;
输出:
CHAR1 10
CHAR2 20
CHAR3 3
CHAR4 4