[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'}
|