Seite 1 von 1

probleme beim parsen von lisp-listen

Verfasst: Freitag 18. Mai 2007, 14:12
von Costi
ich krieg es urgendwie nicht hin lisp-programme/listen in normale python listen umzuwandlen.
also wenn zb etwas so gegeben ist:

Code: Alles auswählen

(while (True) (add 7 (raw_input)))
muss es so geparst werden:

Code: Alles auswählen

['while', ['True'], ['add', '7', ['raw_input']]]
danke

edit:
hier mein nicht funktionierenden ansatz:

Code: Alles auswählen

    
def parse(block):
    block = block[1:-1]
    print block
    def_name = block.split(' ')[0]
    level = 0
    args = []
    sub = ''
    for char in block:
        if char == '(':
            level += 1
        elif char == ')':
            level -= 1
        if level:
            sub += char
        else:
            if sub:
                args.append(parse(sub+')'))
            sub = ''
    print def_name, '\t',args
    print
    if args:
        return [def_name, args]
    else:
        return def_name

Re: probleme beim parsen von lisp-listen

Verfasst: Freitag 18. Mai 2007, 15:03
von keppla
irgendwie verstehe ich deinen code nicht, habe aber auch nicht den eindruck, dass er zielführend ist.
ich würde versuchen, deinen code erstmal zu tokenizen, so dass du eine liste aus '(', ')' und atomen hast.
Wenn du die hast, dann kannst du wenn du eine klammer auf machst, eine leere liste auf den stack legen, wenn du ein atom findest, es an die liste anhängen, und wenn du eine geschlossene klammer findest, die oberste liste im stack an die vorletze anhängen.

Code: Alles auswählen

tokens = "( while ( True ) ( add 7 ( raw_input ) ) )".split(" ")

stack = [[]]
for token in tokens:
    if token == '(':
        stack.append([])
    elif token == ')':
        lst = stack.pop()
        stack[-1].append(lst)
    else:
        stack[-1].append(token)
        
result = stack[0][0]