我正在尝试解析头文件并从接口/方法声明创建方法存根。
我想采用这样的c ++ com方法声明:
STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) PURE;
然后修改它以从中生成c ++方法存根:
HRESULT __stdcall WrapIDirect3DCubeTexture9::GetCubeMapSurface(D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9 * * ppCubeMapSurface)
{
}
我有点不确定我是否应该使用正则表达式或使用.net字符串函数,我对如何以任何方式实现它而感到困惑。
我有很多方法可以做,所以创建一个工具似乎是正确的做法。
任何人都可以帮助指导我朝正确的方向发展吗?
编辑:我应该补充一点,我正在寻找一些关于如何实施它的帮助。我不确定我是否应该对所有单词/特殊字符和空格进行标记,然后从那里开始,使用这样的正则表达式,然后解析并处理它。
"(\d[x0-9a-fA-F.UL]*|\w+|\s+|"[^"]*"|.)"
虽然现在看起来有点矫枉过正,而且我正在分析这一切。我最终快速创建了一个带有.net字符串函数的实现,然后看到Caesay在正则表达式方向帮助我。所以我想出了两个实现。
我已决定使用正则表达式实现。因为我将进行一些其他高级处理和解析,正则表达式会使这更容易。实现如下。
基于字符串的实施:
if (line.StartsWith(" STDMETHOD"))
{
string newstr = line.Replace(" STDMETHOD(", "HRESULT __stdcall WrapIDirect3DCubeTexture9::");
newstr = StringExtensions.RemoveFirst(newstr, ")");
newstr = newstr.Replace("THIS_ ", "");
newstr = newstr.Replace(" PURE;", Environment.NewLine + "{ " + Environment.NewLine + Environment.NewLine + "}");
textBox2.AppendText(newstr + Environment.NewLine);
}
取自(C# - Simplest way to remove first occurrence of a substring from another string)的字符串扩展类:
public static class StringExtensions
{
public static string RemoveFirst(this string source, string remove)
{
int index = source.IndexOf(remove);
return (index < 0)
? source
: source.Remove(index, remove.Length);
}
}
现在正在进行Regex实施:
if (line.StartsWith(" STDMETHOD"))
{
Regex regex = new Regex(@"\(.*?\)");
MatchCollection matches = regex.Matches(line);
string newstr = String.Format(@"HRESULT __stdcall WrapIDirect3DCubeTexture9::{0}({1})", matches[0].Value.Trim('(', ')'), matches[1].Value.Trim('(', ')'));
newstr = newstr.Replace("THIS_ ", "");
textBox2.AppendText(newstr + Environment.NewLine + "{" + Environment.NewLine + Environment.NewLine + "}" + Environment.NewLine);
}
答案 0 :(得分:1)
我会写一些代码来帮助你入门。
如果从包含变量的最小输出字符串开始,则更容易看到需要执行的操作,因此:
String.Format(@"HRESULT __stdcall WrapIDirect3DCubeTexture9::{0}({1})
{{
}}", "methodName", "arguments");
在这里我们可以看到我们需要从原始字符串,方法名称和参数中提取两个项目。我建议使用正则表达式来匹配原始字符串中括号中的内容。这将为您提供两个匹配项,方法名称和参数。您将需要对参数字符串进行后处理,但这会给出一个想法。