是否有一个良好的、可重复使用的分析器,这转换为字符串成一个层次结构的清单?

StackOverflow https://stackoverflow.com/questions/456259

我想要一串,例如:

[One, Two[A, B[i, ii, iii, iv], C], Three]

并将其转换成一个层次结构中的名单,所以,如果我的执行代码如下:

Console.Write(myList[1][1][2]);

输出将是:

iii

我希望这是一种常见的足要求,有一些简单的分析代码写在C#这一点。

让我知道如果我的问题可以措辞更加明确。

有帮助吗?

解决方案

XML或 JSON 是优异的方法来存储这样的事情。

由于Spence说 - 这是一个困难的问题 - 我不建议使用您自己

向下滚动到在大多数语言该JSON链接实现的底部。

其他提示

我必须去一个经常的表达。Substring匹配和子的表情可以给你递归获得子...水平。

使用的东西喜欢/^\[(.+)\]$/ 在浸料收集单个级别的项目。处理它,直到你没有收到一个水平了,爆炸上'、'后,你的胆量的一个单一的系列。

分裂的结果通过一个','.

应该出来像

  • [一、二[A、B[i,ii,iii,iv],C],三]
    • 一个
    • 两个
    • [A、B[i,ii,iii,iv],C]
      • 一个
      • B
      • [i,ii,iii,iv]
        • ii
        • iii
        • iv
      • C

最后剪掉左右的空间,以获得您抛光的结果。

您数组或列表后?

这将是极其困难与弦做,因为你要处理的空间,或元素的使用逗号等。

如果你有控制的,什么是在这个名单,我建议你看看XML或二进制序列化,其中有库,帮助你做到这一点。

这不是一个实用的答案,但如果你能使用.NET 4.0测试版,你可以看看奥斯陆(及后续加工),微软为文本DSL的发展中,这似乎是你所需要的东西。

我的投票也是XML或JSON或其它格式,如果你要控制格式的能力。但缺乏的,这里有一个Python实现解析器的,因为我很无聊。

class ExprParser(object):
current = []
list_stack = []

def __init__(self):
    pass

def parse(self,input):
    for atom in [s.strip() for s in input.split(',')]:
        self.parse_atom(atom)
    return self.current

def do_pushes(self,atom):
    """ Strip off the '[' and push new lists """
    i = 0
    while i < len(atom) and atom[i] == '[':
        self.push()
        i += 1
    return atom[i:]

def do_pops(self,atom):
    """ Pop the lists """
    i = 0
    while i < len(atom) and atom[i] == ']':
        self.pop()
        i += 1

def parse_atom(self,atom):
    push_start = atom.find('[')

    rest = self.do_pushes(atom[push_start:]) if push_start >= 0 else atom

    pop_start = rest.find(']')

    val = rest[:pop_start] if pop_start >= 0 else rest

    self.add(val)

    if pop_start >= 0:
        self.do_pops(rest[pop_start:])

def push(self):
    self.current = []
    self.list_stack.append(self.current)

def pop(self):
    done = self.list_stack.pop()
    self.current = self.list_stack[-1] if self.list_stack else done
    if self.current is not done:
        self.add(done)

def add(self,val):
    self.current.append(val)

使用这样的:

parser = ExprParser()
parser.parse('[One, Two[A, B[i, ii, iii, iv], C], Three]')

没有错误处理虽然对错误输入。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top