Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如何解析代码字符串并基于字符串中的{和}构建分层数组_Algorithm_Parsing - Fatal编程技术网

Algorithm 如何解析代码字符串并基于字符串中的{和}构建分层数组

Algorithm 如何解析代码字符串并基于字符串中的{和}构建分层数组,algorithm,parsing,Algorithm,Parsing,我有一个类似于字符串的代码,如下所示: a { bcd { ef { gh { i } j } } k { lmn { op } qr { st

我有一个类似于字符串的代码,如下所示:

a
{
    bcd
    {
        ef
        {
            gh
            {
                i
            }
            j
        }
    }
    k
    {
        lmn
        {
            op
        }
        qr
        {
            st
        }
        uv
        {
            wx
        }
        y
    }
    z
}
我希望解析这个字符串,这样我就可以从代码中创建一个层次数组,其中每个树都是基于{创建的,一个树以}结尾

该阵列的外观如下所示:

[
    "a",

    "{",

    [

        "bcd",

        "{",

        [
            "ef",

            "{",

            [
                "gh",

                "{",

                [
                    "i"
                ],

                "}",

                "j"
            ],

            "}"
        ],

        "}",

        "k",

        "{",

        [
            "lmn",
            "{",
            [
                "op"
            ],

            "}",
            "qr",

            "{",

            [
                "st"
            ],

            "}",

            "uv",

            "{",
            [
                "wx"
            ],

            "}",
            "y"
        ],

        "}",
        "z"
    ],

"}"
]
有人能帮我弄个算法吗


你也可以给我一个Java/C/PHP/VB.NET/JavaScript/ActionScript语言的代码。

你对这门语言不是很挑剔,所以我很好奇你为什么想要这个。下面是一些代码,可以在C中实现您想要的功能:

public static object[] ParseSpecial(string s)
{
    string dummy = "";
    Stack<List<object>> result = new Stack<List<object>>();
    result.Push(new List<object>());
    foreach (char character in s)
    {
        switch (character)
        {
            case '{':
                if (dummy.Length > 0)
                    result.Peek().Add(dummy);
                dummy = "";

                result.Peek().Add("{");
                result.Push(new List<object>());
                break;

            case '}':
                if (dummy.Length > 0)
                    result.Peek().Add(dummy);
                dummy = "";

                List<object> temp = result.Pop();
                result.Peek().Add(temp.ToArray());
                result.Peek().Add("}");
                break;

            default:
                dummy += character;
                break;
        }
    }

    if (dummy.Length > 0)
        result.Peek().Add(dummy);

    return result.Peek().ToArray();
}

如果这就是你想要做的,你可以这样写C:

类节点 { 公共字符串名称{get;private set;} 公共IEnumerable子项{get;private set;} 公共节点名称,IEnumerable children { 名称=名称; 儿童=儿童; } } 类解析器 { 公共节点解析字符串 { 返回Parses.Splitnew char[0],StringSplitOptions.RemoveEmptyEntries; } 公共节点ParseIEnumerable令牌 { 使用var enumerator=tokens.GetEnumerator { enumerator.MoveNext;//移动到第一个令牌 返回分析器枚举器; } } 节点ParseIEnumerator枚举器 { 字符串名称=枚举数.Current; enumerator.MoveNext; var children=新列表; 如果枚举数.Current=={ { enumerator.MoveNext; 而枚举数.Current!=} { children.AddParseenumerator; } enumerator.MoveNext; } 返回新节点名,孩子们; } } 这段代码不检查MoveNext的返回值,这意味着它将在无效输入上产生奇怪的结果,包括无限循环的可能性

它还要求标记用空格分隔。所以像a{b{c}这样的字符串将被解析为一个名为a{b{c}的节点

即使使用弱类型语言,创建特殊类型节点也比使用弱类型数组要好得多。结果中不需要包含大括号

如果您想做更复杂的事情,我建议您使用一些解析器库


如果字符串可能很长,并且您正在从文件或网络读取它,那么您可能希望使用某种形式的流而不是普通字符串。

编译器也会解析代码!!!因为对于正则数组,您需要指定数组嵌套在编译时的深度,这不能用正则数组来完成。您必须创建包含字符串数组和节点数组的节点。@MrFox:使用PHP或ActionScript/JavaScript如何?@MrFox:不正确。例如,如果所有{}都替换为,那么他正在查看一个常规的Lisp列表。对于大多数其他语言,逗号也是必需的。只要用你喜欢的任何语言将文件转换成数组的自然形式,然后让语言进行解析。当有人发布一个完整的任务而不是一个问题,并搜索完整的解决方案而不是提示时,我就会想:这到底是怎么回事。你有没有出过一些代码。。这只是一个简单的算法。没那么难!你甚至可以在网上搜索一分钟就找到一些解决方案。我没有选择一种明确的语言,只是为了得到不同语言开发人员的响应。谢谢你的代码。你的代码没有把案例a{bc}作为一个有两个孩子的项目来处理,我认为应该这样。此外,文本节点包含前导空格和尾随空格,我认为它们不应该包含。