使用C#和regex解析源代码并使用参数查找函数调用

时间:2009-02-24 16:25:14

标签: c# regex parsing

我有一个存储在数据库中的函数调用列表,对于某些函数调用,我关心函数调用的参数是什么。我用我的程序(在C#中)解析C源代码。我正在尝试找到使用参数获取函数调用的最佳方法。我在解析它之前将源代码读入一个字符串(这样我就不在文件上使用流阅读器了)。我尝试使用一些正则表达式(这对我来说有点新)来解析源文件,但在使用这样的正则表达式字符串时检索的不仅仅是函数调用:functionCall +“。* \\)”; (我正在逃避开场(在函数调用中)

函数调用以下列格式存储在DB

Function Call
============
some_Call(

他们以这种方式存储是有原因的,并且不会改变。

有没有通过正则表达式做到这一点的好方法,还是我更适合浏览源代码内容?

如果需要澄清,请告诉我。

3 个答案:

答案 0 :(得分:6)

您的解决方案失败的部分原因是您可能应该使用.*?),而不是贪婪匹配。

完整的答案必须至少遵循这些:

忽略字符串和字符中的括号(可以使用正则表达式进行括号,尽管转义它可能有点复杂)

functionCall("\")", ')')

忽略评论中的括号(可以使用正则表达式)

functionCall(/*)*/ 1, // )
2)

不要匹配太多(你可以使用正则表达式)

functionCall(1) + functionCall(2) + (2 * 3) // Don't match past the first )

但它也必须忽略平衡的括号

functionCall((1+(1))*(2+2))

最后一个是正常的正则表达式无法做到的,因为它涉及计算括号,并且通常是正则表达式不适合的东西。但是,它似乎是.NET has ways to do this

(从技术上讲,你必须处理宏,我可以想象一下

#define close_paren )

会破坏你的一天......)

那就是说,你可能会想出一个天真的解决方案(类似于你所拥有的,或其他一些海报推荐的解决方案),并且它适用于许多情况,特别是如果你正在使用已知的输入。

答案 1 :(得分:1)

我已经编写了一个快速正则表达式并对其进行了测试,请检查以下内容:

            string tst = "some_function(type<whatever> tesxt_112,type<whatever> tesxt_113){";

        Regex r = new Regex(".*\\((.*)\\)");
        Match m = r.Match(tst);
        if (m.Success)
        {
            string[] arguments = m.Groups[1].Value.Split(',');
            for (int i = 0; i < arguments.Length; i++)
            {
                Console.WriteLine("Argument " + (i + 1) + " = " + arguments[i]);
            }
        }

        Console.ReadKey();

因此上述字符串的输出为:

参数1 =类型&lt; whatever&gt; tesxt_112

参数2 =类型&lt; whatever&gt; tesxt_113

希望这会有所帮助:

安德鲁: - )

答案 2 :(得分:0)

不要让你恶化但是......在C中,我相信(含糊地)你可以这样做:

void secondFunction() { /* no-op */ }

void firstFunction()
{
    void* xyz = secondFunction;

    xyz(); // this should call secondFunction
}

这是一种可能的情况吗?那么指针用法的其他变种呢?!?

说,输入功能样式?!?

int a;
float b = float(a); // call to the "float" function?!? NO! it's a type casting

使用预定义类型列表?如果转换为自定义结构并且typedef怎么办?现在你也必须解析它们了!

说真的,使用解析器!!已经有several available options可以解析C。

我认为正则表达式对于这项工作来说是一个相当糟糕的工具。