在 C# 中解析语法字符串
本文关键字:语法 字符串 | 更新日期: 2023-09-27 18:31:44
我正在尝试解析标头并从接口/方法声明创建方法存根。
我想采用这样的 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# - 从另一个字符串中删除子字符串的第一个出现的最简单方法):
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);
}
}
现在对于正则表达式实现:
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");
在这里,我们可以看到我们需要从原始字符串中提取两个项目,方法名称和参数。我建议使用正则表达式来匹配原始字符串中括号中的内容。这将为您提供两个匹配项,方法名称 - 和参数。您将需要对参数字符串进行后处理,但这会给出一个想法。