正则表达式获取pascal函数

时间:2009-08-10 13:56:52

标签: regex parsing

我有一个pascal代码文件,需要解析它(使用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”和“published”之间的所有函数,并将其返回到一行......

2 个答案:

答案 0 :(得分:5)

如果不是不可能的话,这将很难做到。只需考虑字符串,注释和转义序列的所有问题。如果我是你,我会使用Pascal解析器。

这是一个用于Pascal的lexx / yacc语法的页面:

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

以下是关于yacc和lexx的一些信息:

http://dinosaur.compilertools.net/

使用这些工具为您预先制作,您可以立即生成一个解析器,它可以比任何正则表达式做得更好。

答案 1 :(得分:1)

我给你一些正则表达式来获取有或没有参数的程序和函数

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*;"

但它们是一种启发式方法。不要指望匹配所有可能的函数声明。