我有一个存储在数据库中的函数调用列表,对于某些函数调用,我关心函数调用的参数是什么。我用我的程序(在C#中)解析C源代码。我正在尝试找到使用参数获取函数调用的最佳方法。我在解析它之前将源代码读入一个字符串(这样我就不在文件上使用流阅读器了)。我尝试使用一些正则表达式(这对我来说有点新)来解析源文件,但在使用这样的正则表达式字符串时检索的不仅仅是函数调用:functionCall +“。* \\)”; (我正在逃避开场(在函数调用中)
函数调用以下列格式存储在DB
中Function Call
============
some_Call(
他们以这种方式存储是有原因的,并且不会改变。
有没有通过正则表达式做到这一点的好方法,还是我更适合浏览源代码内容?
如果需要澄清,请告诉我。
答案 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。
我认为正则表达式对于这项工作来说是一个相当糟糕的工具。