嵌套C结构的正则表达式

时间:2010-08-31 10:40:09

标签: regex perl

我正在尝试编写一个正则表达式来解决下面的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脚本将非常有用;

2 个答案:

答案 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