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

在 C# 中解析语法字符串

我会给你写一些代码来帮助你入门。

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

String.Format(@"HRESULT __stdcall WrapIDirect3DCubeTexture9::{0}({1}) 
{{
}}", "methodName", "arguments");

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