Регулярное выражение для получения функций Паскаля - PullRequest
0 голосов
/ 10 августа 2009

У меня есть файл кода на паскале, и мне нужно проанализировать его (используя c #) и отобразить все общедоступные функции, мой файл выглядит примерно так (не фактический код):

public
  function Test(str: string):bool;
  function Test1(str: string):bool;
  function Test2(str,str1,str2,str3
                 str4: string):bool;
  function Test3(str: string):bool;
published

Обратите внимание на Test2 там и на несколько строк. Я могу сделать некоторые базовые (очень простые) регулярные выражения, но не могу заставить что-либо работать с этим. В основном то, что мне нужно, это: получить все функции между строками "public" и "опубликовано" и вернуть их в одну строку ...

Ответы [ 2 ]

5 голосов
/ 10 августа 2009

Это будет очень сложно сделать, если не невозможно. Просто подумайте обо всех проблемах со строками, комментариями и escape-последовательностями. На вашем месте я бы использовал парсер Pascal.

Вот страница с грамматиками lexx / yacc для Паскаля:

http://www.moorecad.com/standardpascal/yacclex.html

Вот некоторая информация о yacc и lexx:

http://dinosaur.compilertools.net/

С помощью этих инструментов, подготовленных специально для вас, вы можете в мгновение ока сгенерировать парсер, который сделает работу намного лучше, чем любое регулярное выражение.

1 голос
/ 10 августа 2009

Я даю вам несколько регулярных выражений для получения процедур и функций, которые имеют или не имеют параметров

rproc1 = "(?<!\w)procedure\s+[\w\s.]+;"
rproc2 = "(?<!\w)procedure\s+[\w\s.]+\([\w\s,.=':;$/*()]*?\)\s*;"

rfunc1 = "(?<!\w)function\s+[\w\s.]+:\s*\w+\s*;"
rfunc2 = "(?<!\w)function\s+[\w\s.]+\([\w\s,.=':;$/*()]*?\)\s*:\s*\w+\s*;"

Хотя это своего рода эвристика. Не ожидайте совпадения с каждым возможным объявлением функции.

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