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}作为一个有两个孩子的项目来处理,我认为应该这样。此外,文本节点包含前导空格和尾随空格,我认为它们不应该包含。