C# 用C语言解析语法字符串#

C# 用C语言解析语法字符串#,c#,regex,C#,Regex,我试图解析一个头并从接口/方法声明中创建方法存根 我想采用C++的COM方法声明: STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) PURE; HRESULT __stdcall WrapIDirect3DCubeTexture9::GetCubeMapSurface(D3DCUBEMAP_FACES FaceType, U

我试图解析一个头并从接口/方法声明中创建方法存根

我想采用C++的COM方法声明:

STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) PURE;
HRESULT __stdcall WrapIDirect3DCubeTexture9::GetCubeMapSurface(D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9 * * ppCubeMapSurface) 
{

}

然后修改它,生成一个C++方法存根,如:< /P>

STDMETHOD(GetCubeMapSurface)(THIS_ D3DCUBEMAP_FACES FaceType,UINT Level,IDirect3DSurface9** ppCubeMapSurface) PURE;
HRESULT __stdcall WrapIDirect3DCubeTexture9::GetCubeMapSurface(D3DCUBEMAP_FACES FaceType, UINT Level, IDirect3DSurface9 * * ppCubeMapSurface) 
{

}
我有点不确定是应该使用正则表达式还是使用.net字符串函数,我不知道如何准确地实现它

我有很多方法要做,所以创建一个工具似乎是正确的

有人能帮我指引正确的方向吗

编辑:我应该补充一下,我正在寻找一些关于如何实施它的帮助。我不确定是否应该标记所有单词/特殊字符和空格,然后从那里开始,使用这样的正则表达式,然后解析和处理它

"(\d[x0-9a-fA-F.UL]*|\w+|\s+|"[^"]*"|.)"
虽然现在看起来有点过分了,而且我对这整件事分析过度了。我很快就用.net字符串函数创建了一个实现,然后看到Caesay在正则表达式方面帮了我的忙。所以我提出了两个实现

我已经决定使用regex实现。因为我会做一些其他的高级处理和解析,正则表达式会让这更容易。实现如下

基于字符串的实现:

                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);

                }
                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);
                }
从()获取的字符串扩展类:


我将为您编写一些代码来帮助您开始

如果从包含变量的最小输出字符串开始,则更容易看到需要执行的操作,因此:

String.Format(@"HRESULT __stdcall WrapIDirect3DCubeTexture9::{0}({1}) 
{{

}}", "methodName", "arguments");

在这里,我们可以看到需要从原始字符串中提取两项:方法名和参数。我建议使用正则表达式来匹配原始字符串中括号中的内容。这将提供两个匹配项,即方法名和参数。您需要对参数字符串进行后处理,但这会给出一个想法。

我不太确定您想要什么。你想让我们给你写个正则表达式?或者你想让我们告诉你哪一个更好?它们都能工作,细节才是关键。这就是你要问的:“这是一个输入字符串,一个输出字符串。请给我写一段代码来翻译它。”。我建议您自己尝试实现它,使用regex或.Net字符串操作(两者都可以)。在你试过之后,就可能遇到的问题寻求帮助会更合适。@caesay抱歉,我以前不清楚。我决定两者都实现,并将您的string.format思想用于正则表达式。我已经修复了我的问题和解决方案。当不执行
{0}
{1}
时,大括号必须是
{{{code>,然后是
}
。否则你会得到一个例外。谢谢。最后我两个都做了,并将您的想法用于正则表达式的实现。我把它们贴在问题上。我将使用regex变量。