Использование регулярных выражений для извлечения функций и заголовков функций из исходного кода - PullRequest
1 голос
/ 12 июля 2010

Я пытаюсь извлечь функции и заголовки функций из некоторых файлов исходного кода.Вот пример типа кода:

################################################################################
# test module
#
# Description : Test module
#
DATABASE test

###
# Global Vars
GLOBALS
    DEFINE G_test_string    STRING
END GLOBALS

###
# Modular Vars
DEFINE M_counter            INTEGER

###
# Constants
CONSTANT MAX_ARR_SIZE = 100

##################################
# Alternative header
##################################
FUNCTION test_function_1()
    DEFINE  F_x     INTEGER

    LET F_x = 1

    RETURN F_x
END FUNCTION

###################################
# Function:
#   This is a test function
#
# Parameters:
#   in - test
#
# Returns:
#   out - result
#
FUNCTION test_function_2( P_in_var )
    DEFINE  P_in_var    INTEGER

    DEFINE  F_out_var   INTEGER


    LET F_out_var = P_in_var

    RETURN F_out_var
END FUNCTION

FUNCTION test_init_array()
    DEFINE  F_array     ARRAY[ MAX_ARR_SIZE ] OF INTEGER
    DEFINE  F_element   INTEGER

    FOR F_element = 1 TO MAX_ARR_SIZE

        LET F_array[ F_element ] = F_element * F_element

    END FOR

END FUNCTION

Функции могут иметь или не иметь заголовок над ними.Я пытаюсь захватить источник функции, заголовок функции, имя функции и любые параметры, переданные в функцию в группах.Вот выражение, которое я придумал (я делаю это с использованием регулярных выражений .Net и тестирую с использованием Regex Hero):

^([#]{0,1}.*?)(FUNCTION\s+(.*?)[(](.*?)[)].*?END FUNCTION) 

Это работает нормально для всех, кроме первой функции (test_function_1) вфайл.Первоначальная группировка для test_function_1 захватывает все, начиная с первой строки (в верхней части исходного файла) и заканчивая функцией FUNCTION test_function_1.Я понимаю, что это потому, что в файле есть # для других комментариев, но я хочу только захватить заголовок функции.

1 Ответ

1 голос
/ 12 июля 2010

Если я правильно вижу, у вас проблемы с определением строк, начинающихся с #. Для этого вы можете включить флаг RegexOptions.Multiline и сопоставить заголовок функции с

((?:^#.*\s)*)

Edit: Чтобы это работало, вам нужно выключить RegexOptions.Singleline и заменить .*? на [\s\S]*? в вашей части тела функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...