gpt4 book ai didi

c# - 从文件中修剪函数,以便仅剩下的字符是函数名称和参数

转载 作者:行者123 更新时间:2023-11-30 16:43:01 24 4
gpt4 key购买 nike

我正在编写一些代码来替换旧的 C exe。原始的 c 文件会读取一个文件,然后修剪内容并将它们放入两个新文件,一个 .c 和一个 .h 文件。我正在做同样的事情,但是是在 C# 中。我已经弄清楚了一切,除了如何修剪函数以便仅将函数名称和参数放入 .h 文件中。这是其中两个函数的示例:

void
M_SCP_Msg_ClearNVMemory(
Marshal_dataFunc* _argDataFunc_, Marshal_dataFuncArg _argDataFuncArg_, void const* _argSrc_)
{
SCP_Msg_ClearNVMemory const* _src_ = (SCP_Msg_ClearNVMemory const*)_argSrc_;

M_uint8_t(_argDataFunc_, _argDataFuncArg_, &_src_->operation);

}

void
MA_SCP_Msg_ClearNVMemory(
Marshal_dataFunc* argDataFunc, Marshal_dataFuncArg argDataFuncArg,
void const* argSrc, unsigned argNSrcElem)
{

SCP_Msg_ClearNVMemory const* src = (SCP_Msg_ClearNVMemory const*)argSrc;

for (; argNSrcElem > 0; --argNSrcElem)
{
M_SCP_Msg_ClearNVMemory(argDataFunc, argDataFuncArg, src++);
}
}

这将是预期的输出:

extern void M_SCP_Msg_ClearNVMemory(
Marshal_dataFunc* argDataFunc, Marshal_dataFuncArg argDataFuncArg, void const* argSrc);

extern void MA_SCP_Msg_ClearNVMemory(
Marshal_dataFunc* argDataFunc, Marshal_dataFuncArg argDataFuncArg,
void const* argSrc, unsigned argNSrcElem);

目前,原始文件的行作为字符串读取,这些字符串通过流读取器分配,然后将该字符串写入流写入器,因此我认为迭代并查找包含任何函数的任何字符串将是一个好地方首先,一旦我有了这些字符串,我就可以以某种方式编辑它们。这就是我到目前为止所拥有的,finList 是字符串列表,fin 是我将写入输出文件的字符串。

 List<string> finList = new List<string>();
finList.AddRange(fin.Split('\n'));
for (int x = 0; x < finList.Count; x++)
{
if (finList[x] == "void" || finList[x] == "_Bool" || finList[x] == "bool" || finList[x] == "unsigned")
{
finList[x] = im not sure what to do here
fin = string.Empty;
}
}

for (int x = 0; x < finList.Count; x++)
{
fin += finList[x];
}

任何指导或帮助将不胜感激。我对 C# 和 C 比较陌生,所以如果我没有使用正确的术语,请耐心等待。我认为在“)”处结束函数的字符串/行是最有意义的,但我不确定如何做到这一点。提前致谢!

最佳答案

快速而肮脏的解决方案将是这样的:

int bracketLevel = 0;
int squareBracketLevel = 0;
var methods = new List<string>();
var isMethodMode = true; // track if we are in method definition or in method body
var isMethod = false; // if we have seen parenthesis in definition
var builder = new StringBuilder();

for (int i = 0; i < fin.Length; i++)
{
if (isMethodMode)
{
switch (fin[i])
{
case '(':
isMethod = true;
builder.Append(fin[i]);
bracketLevel++;
break;
case ')':
builder.Append(fin[i]);
bracketLevel--;
break;
case '{':
if (bracketLevel > 0) continue;
if (isMethod)
{
methods.Add(builder.ToString().Trim());
builder.Clear();
isMethod = false;
}
isMethodMode = false;
squareBracketLevel++;
break;
default:
builder.Append(fin[i]);
break;
}
}
else
{
switch (fin[i])
{
case '{':
squareBracketLevel++;
break;
case '}':
squareBracketLevel--;
if (squareBracketLevel == 0)
{
isMethodMode = true;
}
break;
}
}
}

变量fin包含加载的C文件。虽然这适用于您的示例,但有几个假设:

  1. C 代码有效(没有不匹配的括号)
  2. 没有包含括号的注释(这包括注释中已注释的函数)
  3. 正文 block 在字符串常量中不包含大括号

如果这些假设不适合您,那么您将不得不查看解析器生成器,它将解析 C 文件并为您生成抽象语法树,您可以从中提取所需的信息。一个例子是 ANTLR 。 C 语法也可在 C.g4 获取。 .

关于c# - 从文件中修剪函数,以便仅剩下的字符是函数名称和参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45577068/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com