probleme beim parsen von lisp-listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Freitag 18. Mai 2007, 14:12

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
cp != mv
Benutzeravatar
keppla
User
Beiträge: 483
Registriert: Montag 31. Oktober 2005, 00:12

Freitag 18. Mai 2007, 15:03

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]
Antworten