Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Парсер кода программы на Perl, Проверка правильности вызова функции 
:(
    Опции темы
Octane
Дата 27.12.2007, 00:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 14.5.2007
Где: Волгоград

Репутация: нет
Всего: нет



Здравствуйте.

При написание несложного парсера програмного кода C++ застрял на проверке правильности вызова функции по ее прототипу (зачем мне это нужно? не знаю smile задание такое), может кто подскажет идею как это сделать или пример какой приведет. Что то слышал что можно формировать динамически регулярные выражения и это как то можно использовать в моей ситуации, но никакой вразумительной информации по этой теме не получается найти...

Допустим есть код программы например на языке C++,
есть прототип функции int f1(int a, int b);
В коде программы вызываем функцию, например так: printf("%d",f1(5,7)); или c=f1(x,y); необходимо проверить правильность вызова этой функции по ее прототипу, т.е. найти функцию, найти соответствующий прототип и посчитать количество отправляемых в функцию параметров и по возможности соответствие типу (ограниченному количество, там например int, float, char)

Помогите пожалуйста разобраться с такой задачей)

Это сообщение отредактировал(а) Octane - 27.12.2007, 00:40
PM MAIL WWW ICQ   Вверх
KSURi
Дата 27.12.2007, 03:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 887
Регистрация: 8.6.2006
Где: Russia

Репутация: 20
Всего: 27



Организовать сбор и парсинг прототипов можно так: (писал прямо в форум, но должно работать)
Код

my %funcs;
foreach(split("\n", <DATA>)) # в __DATA__ - исходный Си код
{
    /(?:int|float|bool(?#void,etc.))\s*(\w+)\s*\((.+?)\);$/ || next; # цепляем прототипы ф-ий
    my($name, $params) = ($1, $2);
    foreach(split(/\s*,\s*/, $params)) # парсим параметры ф-ии
    {
        my($type, $var) = split /\s+/;
        push(@{$funcs{$name}{$type}}, $var);
    }
}

Над проверкой уже лень думать, но имхо сложно быть не должно... Завтречка, в смысле уже сегодня, может накидаю)


--------------------
Died at Life.pl line 21
PM Jabber   Вверх
Octane
  Дата 28.12.2007, 01:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 17
Регистрация: 14.5.2007
Где: Волгоград

Репутация: нет
Всего: нет



Спасибо) 
Вот что получилось  smile :
Код

open(FILE, "code.cpp") or die("Can't open file: $!");
print "~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
@s = <FILE>;
foreach (@s){
    /(?:void|int|float|char)\s+?(\w+)\(\s*(.*?)\s*\)\s*;/ || next;
    ($fname, $fparams) = ($1, $2);
    print " prototype: <$fname>";
    @s1 = split(/,/,$fparams);
    $i = 0;
    foreach (@s1) {
        /(\w+)\s+?(\w+)/ || next;
        ($type, $var) = ($1, $2);
        print "\n - var: $var, type: $type;";
        $i++;
    }
    $p{$fname} = $i;
    print "\n\n";
}
print "~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
foreach (@s){
    /\s*(\w+|\d*)\s{1}\(\s*(.*?)\s*\)\s*/ || next;
    ($fname, $fparams) = ($1, $2);
    print " function: <$fname>";
    @s1 = split(/,/, $fparams);
    $i = 0;
    foreach (@s1) {
        /\s*(\w+|\d*)/ || next;
        $var = $1;
        print "\n - var: $var;";
        $i++;
    }
    $f{$fname} = $i;
    print "\n\n";
}
print "~~~~~~~~~~~~~~~~~~~~~~~~~~";
foreach $k (keys %p) {
    if ($p{$k} == $f{$k}) {
        print "\n $k: Ok";
    }
    else {
        print "\n $k: error";
    }
}
close (FILE);


Код

#include<stdio.h>
#include<iostream.h>

int f1(int a, int b, int c);

float f2(float x, float y);

void f3(char cc);

int main(void) {

 int d;

 float z;

 char s = 'x';

 d = f1 (8, 12, 457);

 z = f2 (5.25, 3.75)

 f3 (s, v);

 return 1;

}

int f1(int a, int b, int c) {
return a+b+c;
}

float f2(float x, float y) {
return x*y;
}

void f3(char cc) {
cout>>cc;
}


Помогите довести до ума плиз))) 

и еще есть одна проблема, когда мы ищем функцию в коде программы то   повторно находим и прототипы, избавился от этого только добавлением пробела между именем функции и открывающей скобочкой, надо как то исправить, чтобы везде работало  smile 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0939 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.