[Wisp-cvs] wisp/users/dig tran-builtins,1.15,1.16 tran.py,1.86,1.87
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2003-05-17 09:25:36
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv25886 Modified Files: tran-builtins tran.py Log Message: implemented register group hanging Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- tran-builtins 17 May 2003 08:46:24 -0000 1.15 +++ tran-builtins 17 May 2003 09:25:33 -0000 1.16 @@ -78,26 +78,42 @@ :regs|family def regs_state0 (family): - if Meaning.has_key(family): raise 'duplicate declaration', family - f = interpreter.regpath - Meaning[family] = f - Registers[f] = family - interpreter.regpath = interpreter.regpath.child() + if Meaning.has_key(family): + f = Meaning[family] + if not isinstance(f, Register): + raise 'unable to declare subregisters for', f + if not interpreter.hanging.has_key(f): + raise 'unable to re-enter non-hanging register group', f + if interpreter.regpaths[-1].parent() <> f.parent(): + raise 'unable to enter miscontexted register group', f + interpreter.regpaths.append(f.child(interpreter.hanging[f])) + del interpreter.hanging[f] + else: + f = interpreter.regpaths[-1] + interpreter.regpaths[-1] = f.next() + interpreter.regpaths.append(f.child()) + Meaning[family] = f + Registers[f] = family interpreter.state = regs_state def regs_state (tok): if tok == Semicolon: - interpreter.regpath = interpreter.regpath.parent().next() - if len(interpreter.regpath) == 1: + interpreter.regpaths.pop() + if len(interpreter.regpaths) == 1: interpreter.state = outer_state - elif Meaning.has_key(tok): - if Meaning[tok] == Meaning[':regs']: - interpreter.state = regs_state0 - else: raise 'duplicate declaration', tok else: - r = interpreter.regpath - Meaning[tok] = r - Registers[r] = tok - interpreter.regpath = interpreter.regpath.next() + r = interpreter.regpaths[-1] + if interpreter.hanging.has_key(r.parent()): + raise 'misplaced ellipsis' + elif Meaning.has_key(tok): + if Meaning[tok] == Meaning[':regs']: + interpreter.state = regs_state0 + elif Meaning[tok] == Meaning['...']: + interpreter.hanging[r.parent()] = r[-1] + else: raise 'duplicate declaration', tok + else: + interpreter.regpaths[-1] = r.next() + Meaning[tok] = r + Registers[r] = tok regs_state0(family) align int Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.86 retrieving revision 1.87 diff -u -d -r1.86 -r1.87 --- tran.py 17 May 2003 08:46:24 -0000 1.86 +++ tran.py 17 May 2003 09:25:33 -0000 1.87 @@ -284,7 +284,7 @@ interpreter.bss = Linkie('<') interpreter.current = interpreter.text interpreter.recordee = None -interpreter.regpath = Register(0) # for generating new registers +interpreter.regpaths = [Register(0)] # for generating new registers interpreter.hanging = {} default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} |