在C#中解析语法字符串

时间:2014-11-24 21:07:05

标签: c# regex

我正在尝试解析头文件并从接口/方法声明创建方法存根。

我想采用这样的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);
                }

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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