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变量。