Регулярное выражение для вложенных структур C - PullRequest
0 голосов
/ 31 августа 2010

Я пытаюсь написать регулярное выражение для решения приведенной ниже структуры 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;

В вышеупомянутом я должен получить: ниже ВЫХОД:

 CHAR1 10
 CHAR2 20
 CHAR3 3
 CHAR4 4

Скрипт Perl будет очень полезным;

Ответы [ 2 ]

4 голосов
/ 31 августа 2010

Вы изменили проблему после того, как я дал свой ответ.Это не так важно, потому что ответ не намного сложнее.Вы помните, что видите в #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;
2 голосов
/ 31 августа 2010

Что по этому поводу:

#!/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...