我有一个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”之间的所有函数,并将其返回到一行......
答案 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*;"
但它们是一种启发式方法。不要指望匹配所有可能的函数声明。