wisp-cvs Mailing List for Wisp interpreter (Page 6)
Status: Alpha
Brought to you by:
digg
You can subscribe to this list here.
| 2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(30) |
Sep
(312) |
Oct
|
Nov
|
Dec
|
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2003 |
Jan
(5) |
Feb
(131) |
Mar
(17) |
Apr
(184) |
May
(252) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
| 2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(2) |
Nov
|
Dec
|
|
From: <di...@us...> - 2003-05-17 12:02:01
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv23206
Modified Files:
interpreter.py
Log Message:
introduced Register.names
Index: interpreter.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/interpreter.py,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- interpreter.py 17 May 2003 11:46:36 -0000 1.2
+++ interpreter.py 17 May 2003 12:01:58 -0000 1.3
@@ -139,22 +139,24 @@
else: return Lexer.get_token(this)
class Register (tuple, Stackable):
- def __new__ (cls, items):
- return tuple.__new__(cls, items)
+ def __new__ (cls, items, names = None):
+ this = tuple.__new__(cls, items)
+ this.names = names
+ return this
def parent (this):
- if len(this): return Register(this[:-1])
+ if len(this): return Register(this[:-1], this.names)
else: return None
def next (this):
l = list(this)
l[-1] += 1
- return Register(l)
+ return Register(l, this.names)
def child (this, index = 0):
- return Register(this + (index,))
+ return Register(this + (index,), this.names)
def __repr__ (this):
return 'Register' + tuple.__repr__(this)
def __str__ (this):
- if Registers.has_key(this):
- return Registers[this]
+ if this.names != None and this.names.has_key(this):
+ return this.names[this]
else:
return '%' + '.'.join(map(str, this))
def contained_registers (this):
|
|
From: <di...@us...> - 2003-05-17 11:46:41
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv13944
Modified Files:
interpreter.py
Log Message:
changed Register.__new__'s interface to take all items in a single argument
Index: interpreter.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/interpreter.py,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- interpreter.py 17 May 2003 11:35:29 -0000 1.1
+++ interpreter.py 17 May 2003 11:46:36 -0000 1.2
@@ -139,17 +139,17 @@
else: return Lexer.get_token(this)
class Register (tuple, Stackable):
- def __new__ (cls, *args):
- return tuple.__new__(cls, args)
+ def __new__ (cls, items):
+ return tuple.__new__(cls, items)
def parent (this):
- if len(this): return apply(Register, this[:-1])
+ if len(this): return Register(this[:-1])
else: return None
def next (this):
l = list(this)
l[-1] += 1
- return apply(Register, l)
+ return Register(l)
def child (this, index = 0):
- return apply(Register, this + (index,))
+ return Register(this + (index,))
def __repr__ (this):
return 'Register' + tuple.__repr__(this)
def __str__ (this):
@@ -203,7 +203,7 @@
except StopIteration: pass
except StopIteration: pass
-Generic_Register = Register()
+Generic_Register = Register([])
MA_PREFIX = 1
@@ -248,7 +248,7 @@
this.meaning[s] = 'builtin', this.make_section_switcher(s), 0
this.current = this.sections[sections[0]]
this.recordee = None
- this.regpaths = [Register(0)] # for generating new registers
+ this.regpaths = [Register([0])] # for generating new registers
this.hanging = {}
this.regstack = []
this.state = this.outer_state
|
|
From: <di...@us...> - 2003-05-17 11:35:32
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv7583a
Modified Files:
Makefile.am tran.py
Added Files:
interpreter.py
Log Message:
extracted interpreter.py from tran.py
--- NEW FILE: interpreter.py ---
#### interpreter.py
#
# Copyleft © 2003 by Andres Soolo (di...@us...)
# This file is licensed under the GNU GPL v2. If you
# don't know what that means, please do read the GPL.
#
#### @(#) $Id: interpreter.py,v 1.1 2003/05/17 11:35:29 digg Exp $
# Not yet importable!
def simplest_summable (scalar, symbols, registers):
if len(symbols) == len(registers) == 0:
return Integer_Literal(scalar)
elif scalar == len(registers) == 0 and len(symbols) == 1:
return symbols[0]
elif len(registers) == 0:
return Sum((Integer_Literal(scalar),) + tuple(symbols))
else:
return NotImplemented
class Summable (object):
def get_scalar (this): return 0
def get_symbols (this): return ()
def get_registers (this): return ()
def __add__ (this, that):
scalar = this.get_scalar() + that.get_scalar()
symbols = this.get_symbols() + that.get_symbols()
registers = this.get_registers() + that.get_registers()
return simplest_summable(scalar, symbols, registers)
def __sub__ (this, that):
if len(that.get_symbols()) <> 0 or len(that.get_registers()) <> 0:
return NotImplemented
scalar = this.get_scalar() - that.get_scalar()
symbols = this.get_symbols()
registers = this.get_registers()
return simplest_summable(scalar, symbols, registers)
class Token (object): pass
class Stackable (object):
def contained_registers (this):
return ()
class Integer_Literal (long, Stackable, Token, Summable):
def __new__ (cls, i):
return long.__new__(cls, i)
def __add__ (this, that):
return Integer_Literal(long(this) + long(that))
def __sub__ (this, that):
return Integer_Literal(long(this) - long(that))
def __repr__ (this):
return 'Integer_Literal(%i)' % long(this)
def get_scalar (this):
return long(this)
class Symbol_Literal (str, Stackable, Summable):
def __new__ (cls, s):
return str.__new__(cls, s)
def __repr__ (this):
return 'Symbol_Literal(%r)' % str(this)
def get_symbols (this):
return this,
class Sum (tuple, Summable):
def __new__ (cls, addends):
scalar = 0
me = []
for a in addends:
if isinstance(a, Integer_Literal): scalar += long(a)
elif isinstance(a, Symbol_Literal): me.append(a)
else: raise 'improper addend', a
return tuple.__new__(cls, [Integer_Literal(scalar)] + me)
def __repr__ (this):
return 'Sum(%s)' % repr(tuple(this))
def __str__ (this):
return '+'.join(map(str, this))
class Unique (object):
def __init__ (this, name):
this.name = name
def __repr__ (this):
return 'Unique(%r)' % this.name
def __str__ (this):
return this.name
class Unique_Token (Unique, Token): pass
Semicolon = Unique_Token(';')
class Token_Source (object):
"""After creation, a Token_Source instance will deliver one token
each time its get_token method is called, until the token stream ends.
After that, it will return None."""
get_token = abstract
class Lexer (shlex, Token_Source):
def __init__ (this, filename):
shlex.__init__(this, instream = open(filename, 'r'), infile = filename)
this.commenters = '\\'
this.quotes = '"'
this.wordchars += '!#$%*+,-./:;<=>?@[]'
def get_token (this):
tok = shlex.get_token(this)
if tok == '': tok = None
elif tok[:2] == '#o': tok = Integer_Literal(string.atol(tok[2:], 8))
elif tok[:2] == '#x': tok = Integer_Literal(string.atol(tok[2:], 16))
elif tok[:2] == '#/' and len(tok) == 3:
tok = Integer_Literal(ord(tok[2]))
else:
try: tok = Integer_Literal(string.atol(tok, 10))
except: pass
if tok == ';': return Semicolon
else: return tok
def push_file (this, filename):
this.push_source(open(filename, 'r'), filename)
class Macro_Cursor (Token_Source):
def __init__ (this, sequence):
this.sequence = sequence
this.current = 0
def get_token (this):
if this.current >= len(this.sequence): return None
datum = this.sequence[this.current]
this.current += 1
return datum
class Preprocessor (Lexer):
__slots__ = ['tss']
def __init__ (this, filename):
Lexer.__init__(this, filename)
this.tss = []
def push (this, toksrc):
this.tss.append(toksrc)
def get_token (this):
tok = None
while this.tss and tok == None:
tok = this.tss[-1].get_token()
if tok == None: this.tss.pop()
if tok <> None: return tok
else: return Lexer.get_token(this)
class Register (tuple, Stackable):
def __new__ (cls, *args):
return tuple.__new__(cls, args)
def parent (this):
if len(this): return apply(Register, this[:-1])
else: return None
def next (this):
l = list(this)
l[-1] += 1
return apply(Register, l)
def child (this, index = 0):
return apply(Register, this + (index,))
def __repr__ (this):
return 'Register' + tuple.__repr__(this)
def __str__ (this):
if Registers.has_key(this):
return Registers[this]
else:
return '%' + '.'.join(map(str, this))
def contained_registers (this):
return this,
class Class_Marker (object, Stackable):
def __init__ (this, id):
this.id = id
def matchers (object):
if isinstance(object, Class_Marker):
yield object.id
elif isinstance(object, Integer_Literal):
yield 'int'
yield 'lit'
yield 'const'
elif isinstance(object, Symbol_Literal):
yield 'sym'
yield 'lit'
yield 'const'
elif isinstance(object, Sum):
yield 'sum'
yield 'const'
elif isinstance(object, Register):
while object <> None:
yield Registers[object]
object = object.parent()
yield 'any'
def match_generator (root):
yield root
if len(interpreter.regstack) < 1: yield None # want more registers
m = matchers(interpreter.regstack[-1])
try:
while 1:
yield root + ' ' + m.next()
except StopIteration: pass
if len(interpreter.regstack) < 2: yield None
m1 = matchers(interpreter.regstack[-2])
try:
while 1:
n1 = m1.next()
m2 = matchers(interpreter.regstack[-1])
try:
while 1: yield root + ' ' + n1 + ' ' + m2.next()
except StopIteration: pass
except StopIteration: pass
Generic_Register = Register()
MA_PREFIX = 1
def make_universal_meaning (fn):
um = {
'reg': Generic_Register,
'...': Unique('...'),
'tetras': ['dup', '+', 'dup', '+'], # FIXME
}
for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m)
# load builtins
bf = open(fn, 'r')
builtins = bf.read()
bf.close()
for b in builtins.split('\n\n'):
if b[0] != '#':
name, code = b.split('\n', 1)
np = (name + '|').split('|')
name = np[0]
pa = np[1]
exec 'def _p (%s):\n%s\n' % (pa, code)
flags = 0
if pa: flags |= MA_PREFIX
um[name] = 'builtin', _p, flags
return um
class Interpreter (object):
__slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
universal_meaning = make_universal_meaning('tran-builtins')
def make_section_switcher (this, name):
def switcher (): this.current = this.sections[name]
return switcher
def __init__ (this, byte_order, sections = ['.text']):
this.sections = {}
this.meaning = Interpreter.universal_meaning.copy()
for s in sections:
this.sections[s] = Linkie(byte_order)
this.meaning[s] = 'builtin', this.make_section_switcher(s), 0
this.current = this.sections[sections[0]]
this.recordee = None
this.regpaths = [Register(0)] # for generating new registers
this.hanging = {}
this.regstack = []
this.state = this.outer_state
def outer_state (this, tok):
if isinstance(tok, Integer_Literal):
this.regstack.append(tok)
elif isinstance(tok, str):
root = tok
mg = match_generator(root)
try:
while not interpreter.meaning.has_key(tok):
tok = mg.next()
if tok == None:
raise 'stack too empty or meaningless word', root
except StopIteration:
raise 'meaningless word', root
m = interpreter.meaning[tok]
if isinstance(m, list): prep.push(Macro_Cursor(m))
elif isinstance(m, Stackable): this.regstack.append(m)
elif isinstance(m, tuple):
mtype = m[0]
if mtype == 'builtin':
if m[2] & MA_PREFIX:
tok = prep.get_token()
if not isinstance(tok, str): raise 'word expected', tok
m[1](tok)
else:
m[1]()
else: raise 'Unknown meaning type in', `interpreter.meaning[tok]`
else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
Index: Makefile.am
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/Makefile.am,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- Makefile.am 17 May 2003 10:03:50 -0000 1.16
+++ Makefile.am 17 May 2003 11:35:28 -0000 1.17
@@ -8,6 +8,7 @@
EXTRA_DIST = .cvsignore .pycheckrc struburn.wisp bits.py linkie.py \
coff.py elf.py pe.py \
+ interpreter.py \
i8086.tran i80386.tran ia16.tran ia32.tran \
winapi.tran \
hello.tran mswhello.tran \
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.94
retrieving revision 1.95
diff -u -d -r1.94 -r1.95
--- tran.py 17 May 2003 11:27:27 -0000 1.94
+++ tran.py 17 May 2003 11:35:29 -0000 1.95
@@ -22,278 +22,7 @@
def abstract (this, *arg, **narg):
raise 'abstract method was called', this
-def simplest_summable (scalar, symbols, registers):
- if len(symbols) == len(registers) == 0:
- return Integer_Literal(scalar)
- elif scalar == len(registers) == 0 and len(symbols) == 1:
- return symbols[0]
- elif len(registers) == 0:
- return Sum((Integer_Literal(scalar),) + tuple(symbols))
- else:
- return NotImplemented
-
-class Summable (object):
- def get_scalar (this): return 0
- def get_symbols (this): return ()
- def get_registers (this): return ()
- def __add__ (this, that):
- scalar = this.get_scalar() + that.get_scalar()
- symbols = this.get_symbols() + that.get_symbols()
- registers = this.get_registers() + that.get_registers()
- return simplest_summable(scalar, symbols, registers)
- def __sub__ (this, that):
- if len(that.get_symbols()) <> 0 or len(that.get_registers()) <> 0:
- return NotImplemented
- scalar = this.get_scalar() - that.get_scalar()
- symbols = this.get_symbols()
- registers = this.get_registers()
- return simplest_summable(scalar, symbols, registers)
-
-class Token (object): pass
-
-class Stackable (object):
- def contained_registers (this):
- return ()
-
-class Integer_Literal (long, Stackable, Token, Summable):
- def __new__ (cls, i):
- return long.__new__(cls, i)
- def __add__ (this, that):
- return Integer_Literal(long(this) + long(that))
- def __sub__ (this, that):
- return Integer_Literal(long(this) - long(that))
- def __repr__ (this):
- return 'Integer_Literal(%i)' % long(this)
- def get_scalar (this):
- return long(this)
-
-class Symbol_Literal (str, Stackable, Summable):
- def __new__ (cls, s):
- return str.__new__(cls, s)
- def __repr__ (this):
- return 'Symbol_Literal(%r)' % str(this)
- def get_symbols (this):
- return this,
-
-class Sum (tuple, Summable):
- def __new__ (cls, addends):
- scalar = 0
- me = []
- for a in addends:
- if isinstance(a, Integer_Literal): scalar += long(a)
- elif isinstance(a, Symbol_Literal): me.append(a)
- else: raise 'improper addend', a
- return tuple.__new__(cls, [Integer_Literal(scalar)] + me)
- def __repr__ (this):
- return 'Sum(%s)' % repr(tuple(this))
- def __str__ (this):
- return '+'.join(map(str, this))
-
-class Unique (object):
- def __init__ (this, name):
- this.name = name
- def __repr__ (this):
- return 'Unique(%r)' % this.name
- def __str__ (this):
- return this.name
-class Unique_Token (Unique, Token): pass
-
-Semicolon = Unique_Token(';')
-
-class Token_Source (object):
- """After creation, a Token_Source instance will deliver one token
-each time its get_token method is called, until the token stream ends.
-After that, it will return None."""
- get_token = abstract
-
-class Lexer (shlex, Token_Source):
- def __init__ (this, filename):
- shlex.__init__(this, instream = open(filename, 'r'), infile = filename)
- this.commenters = '\\'
- this.quotes = '"'
- this.wordchars += '!#$%*+,-./:;<=>?@[]'
- def get_token (this):
- tok = shlex.get_token(this)
- if tok == '': tok = None
- elif tok[:2] == '#o': tok = Integer_Literal(string.atol(tok[2:], 8))
- elif tok[:2] == '#x': tok = Integer_Literal(string.atol(tok[2:], 16))
- elif tok[:2] == '#/' and len(tok) == 3:
- tok = Integer_Literal(ord(tok[2]))
- else:
- try: tok = Integer_Literal(string.atol(tok, 10))
- except: pass
- if tok == ';': return Semicolon
- else: return tok
- def push_file (this, filename):
- this.push_source(open(filename, 'r'), filename)
-
-class Macro_Cursor (Token_Source):
- def __init__ (this, sequence):
- this.sequence = sequence
- this.current = 0
- def get_token (this):
- if this.current >= len(this.sequence): return None
- datum = this.sequence[this.current]
- this.current += 1
- return datum
-
-class Preprocessor (Lexer):
- __slots__ = ['tss']
- def __init__ (this, filename):
- Lexer.__init__(this, filename)
- this.tss = []
- def push (this, toksrc):
- this.tss.append(toksrc)
- def get_token (this):
- tok = None
- while this.tss and tok == None:
- tok = this.tss[-1].get_token()
- if tok == None: this.tss.pop()
- if tok <> None: return tok
- else: return Lexer.get_token(this)
-
-class Register (tuple, Stackable):
- def __new__ (cls, *args):
- return tuple.__new__(cls, args)
- def parent (this):
- if len(this): return apply(Register, this[:-1])
- else: return None
- def next (this):
- l = list(this)
- l[-1] += 1
- return apply(Register, l)
- def child (this, index = 0):
- return apply(Register, this + (index,))
- def __repr__ (this):
- return 'Register' + tuple.__repr__(this)
- def __str__ (this):
- if Registers.has_key(this):
- return Registers[this]
- else:
- return '%' + '.'.join(map(str, this))
- def contained_registers (this):
- return this,
-
-class Class_Marker (object, Stackable):
- def __init__ (this, id):
- this.id = id
-
-def matchers (object):
- if isinstance(object, Class_Marker):
- yield object.id
- elif isinstance(object, Integer_Literal):
- yield 'int'
- yield 'lit'
- yield 'const'
- elif isinstance(object, Symbol_Literal):
- yield 'sym'
- yield 'lit'
- yield 'const'
- elif isinstance(object, Sum):
- yield 'sum'
- yield 'const'
- elif isinstance(object, Register):
- while object <> None:
- yield Registers[object]
- object = object.parent()
- yield 'any'
-
-def match_generator (root):
- yield root
- if len(interpreter.regstack) < 1: yield None # want more registers
- m = matchers(interpreter.regstack[-1])
- try:
- while 1:
- yield root + ' ' + m.next()
- except StopIteration: pass
- if len(interpreter.regstack) < 2: yield None
- m1 = matchers(interpreter.regstack[-2])
- try:
- while 1:
- n1 = m1.next()
- m2 = matchers(interpreter.regstack[-1])
- try:
- while 1: yield root + ' ' + n1 + ' ' + m2.next()
- except StopIteration: pass
- except StopIteration: pass
-
-Generic_Register = Register()
-
-MA_PREFIX = 1
-
-def make_universal_meaning (fn):
- um = {
- 'reg': Generic_Register,
- '...': Unique('...'),
- 'tetras': ['dup', '+', 'dup', '+'], # FIXME
- }
- for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m)
-
- # load builtins
- bf = open(fn, 'r')
- builtins = bf.read()
- bf.close()
-
- for b in builtins.split('\n\n'):
- if b[0] != '#':
- name, code = b.split('\n', 1)
- np = (name + '|').split('|')
- name = np[0]
- pa = np[1]
- exec 'def _p (%s):\n%s\n' % (pa, code)
- flags = 0
- if pa: flags |= MA_PREFIX
- um[name] = 'builtin', _p, flags
- return um
-
-class Interpreter (object):
- __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
- universal_meaning = make_universal_meaning('tran-builtins')
-
- def make_section_switcher (this, name):
- def switcher (): this.current = this.sections[name]
- return switcher
-
- def __init__ (this, byte_order, sections = ['.text']):
- this.sections = {}
- this.meaning = Interpreter.universal_meaning.copy()
- for s in sections:
- this.sections[s] = Linkie(byte_order)
- this.meaning[s] = 'builtin', this.make_section_switcher(s), 0
- this.current = this.sections[sections[0]]
- this.recordee = None
- this.regpaths = [Register(0)] # for generating new registers
- this.hanging = {}
- this.regstack = []
- this.state = this.outer_state
- def outer_state (this, tok):
- if isinstance(tok, Integer_Literal):
- this.regstack.append(tok)
- elif isinstance(tok, str):
- root = tok
- mg = match_generator(root)
- try:
- while not interpreter.meaning.has_key(tok):
- tok = mg.next()
- if tok == None:
- raise 'stack too empty or meaningless word', root
- except StopIteration:
- raise 'meaningless word', root
- m = interpreter.meaning[tok]
- if isinstance(m, list): prep.push(Macro_Cursor(m))
- elif isinstance(m, Stackable): this.regstack.append(m)
- elif isinstance(m, tuple):
- mtype = m[0]
- if mtype == 'builtin':
- if m[2] & MA_PREFIX:
- tok = prep.get_token()
- if not isinstance(tok, str): raise 'word expected', tok
- m[1](tok)
- else:
- m[1]()
- else: raise 'Unknown meaning type in', `interpreter.meaning[tok]`
- else: raise 'Unknown meaning format for', tok
- else: raise 'bad token', tok
+exec open('interpreter.py')
interpreter = Interpreter('<', ['.text', '.data', '.bss'])
|
|
From: <di...@us...> - 2003-05-17 11:27:30
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv1347
Modified Files:
tran.py
Log Message:
extracted make_universal_meaning from Interpreter
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.93
retrieving revision 1.94
diff -u -d -r1.93 -r1.94
--- tran.py 17 May 2003 11:05:35 -0000 1.93
+++ tran.py 17 May 2003 11:27:27 -0000 1.94
@@ -219,38 +219,39 @@
Generic_Register = Register()
-class Interpreter (object):
- __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
+MA_PREFIX = 1
- universal_meaning = {
+def make_universal_meaning (fn):
+ um = {
'reg': Generic_Register,
'...': Unique('...'),
'tetras': ['dup', '+', 'dup', '+'], # FIXME
}
- for m in 'any const int lit sum sym'.split(' '):
- universal_meaning[m] = Class_Marker(m)
+ for m in 'any const int lit sum sym'.split(' '): um[m] = Class_Marker(m)
# load builtins
- _bf = open('tran-builtins', 'r')
- _builtins = _bf.read()
- _bf.close()
+ bf = open(fn, 'r')
+ builtins = bf.read()
+ bf.close()
- MA_PREFIX = 1
+ for b in builtins.split('\n\n'):
+ if b[0] != '#':
+ name, code = b.split('\n', 1)
+ np = (name + '|').split('|')
+ name = np[0]
+ pa = np[1]
+ exec 'def _p (%s):\n%s\n' % (pa, code)
+ flags = 0
+ if pa: flags |= MA_PREFIX
+ um[name] = 'builtin', _p, flags
+ return um
- for _b in _builtins.split('\n\n'):
- if _b[0] != '#':
- _name, _code = _b.split('\n', 1)
- _np = (_name + '|').split('|')
- _name = _np[0]
- _pa = _np[1]
- exec 'def _p (%s):\n%s\n' % (_pa, _code)
- _flags = 0
- if _pa: _flags |= MA_PREFIX
- universal_meaning[_name] = 'builtin', _p, _flags
+class Interpreter (object):
+ __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
+ universal_meaning = make_universal_meaning('tran-builtins')
def make_section_switcher (this, name):
- def switcher ():
- this.current = this.sections[name]
+ def switcher (): this.current = this.sections[name]
return switcher
def __init__ (this, byte_order, sections = ['.text']):
@@ -284,7 +285,7 @@
elif isinstance(m, tuple):
mtype = m[0]
if mtype == 'builtin':
- if m[2] & Interpreter.MA_PREFIX:
+ if m[2] & MA_PREFIX:
tok = prep.get_token()
if not isinstance(tok, str): raise 'word expected', tok
m[1](tok)
|
|
From: <di...@us...> - 2003-05-17 11:11:33
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv21916
Modified Files:
elf.py
Log Message:
fixed symbol values in ELF32 files
Index: elf.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/elf.py,v
retrieving revision 1.57
retrieving revision 1.58
diff -u -d -r1.57 -r1.58
--- elf.py 17 May 2003 10:16:53 -0000 1.57
+++ elf.py 17 May 2003 11:11:30 -0000 1.58
@@ -605,7 +605,7 @@
symtab = sections['.symtab']
for symbol, value in section.get_symbols():
if symbol[0] == '&': # only process memory references
- symtab.emit_entry(symbol, value, shentnames.index(name) + 1)
+ symtab.emit_entry(symbol, None, shentnames.index(name) + 1)
memory_boundary += section.memsz()
memory_boundary = (memory_boundary + 0xFFF) & ~0xFFF
@@ -618,8 +618,3 @@
binary.place_symbol('#elf/shstrndx', shentnames.index('.shstrtab') + 1)
binary.link()
return binary
-
-# Thoughts of generating ELF32 files
-# * In ELF parlance, linker notes are called relocations.
-# We need to solve relocations only when generating an
-# executable file.
|
|
From: <di...@us...> - 2003-05-17 11:05:40
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv17356
Modified Files:
tran-builtins tran.py
Log Message:
implemented automatic section management for Interpreter
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -d -r1.20 -r1.21
--- tran-builtins 17 May 2003 10:54:46 -0000 1.20
+++ tran-builtins 17 May 2003 11:05:34 -0000 1.21
@@ -40,15 +40,6 @@
n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
interpreter.regstack.append(m - n)
-.bss
- interpreter.current = interpreter.bss
-
-.data
- interpreter.current = interpreter.data
-
-.text
- interpreter.current = interpreter.text
-
//
interpreter.regstack = []
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.92
retrieving revision 1.93
diff -u -d -r1.92 -r1.93
--- tran.py 17 May 2003 10:54:46 -0000 1.92
+++ tran.py 17 May 2003 11:05:35 -0000 1.93
@@ -220,7 +220,7 @@
Generic_Register = Register()
class Interpreter (object):
- __slots__ = 'text data bss current recordee regpaths hanging regstack state meaning'.split()
+ __slots__ = 'sections current recordee regpaths hanging regstack state meaning'.split()
universal_meaning = {
'reg': Generic_Register,
@@ -248,17 +248,23 @@
if _pa: _flags |= MA_PREFIX
universal_meaning[_name] = 'builtin', _p, _flags
- def __init__ (this, byte_order):
- this.text = Linkie('<')
- this.data = Linkie('<')
- this.bss = Linkie('<')
- this.current = this.text
+ def make_section_switcher (this, name):
+ def switcher ():
+ this.current = this.sections[name]
+ return switcher
+
+ def __init__ (this, byte_order, sections = ['.text']):
+ this.sections = {}
+ this.meaning = Interpreter.universal_meaning.copy()
+ for s in sections:
+ this.sections[s] = Linkie(byte_order)
+ this.meaning[s] = 'builtin', this.make_section_switcher(s), 0
+ this.current = this.sections[sections[0]]
this.recordee = None
this.regpaths = [Register(0)] # for generating new registers
this.hanging = {}
this.regstack = []
this.state = this.outer_state
- this.meaning = Interpreter.universal_meaning.copy()
def outer_state (this, tok):
if isinstance(tok, Integer_Literal):
this.regstack.append(tok)
@@ -288,7 +294,7 @@
else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
-interpreter = Interpreter('<')
+interpreter = Interpreter('<', ['.text', '.data', '.bss'])
Registers = {Generic_Register: 'reg'} # for reverse translation
@@ -328,15 +334,15 @@
if verbose: print '(%s) %s' % (' '.join(map(str, interpreter.regstack)), tok)
interpreter.state(tok)
tok = prep.get_token()
- interpreter.text.dump(title = 'TEXT')
- interpreter.data.dump(title = 'DATA')
- interpreter.bss.dump(title = 'BSS')
+ interpreter.sections['.text'].dump(title = 'TEXT')
+ interpreter.sections['.data'].dump(title = 'DATA')
+ interpreter.sections['.bss'].dump(title = 'BSS')
if interpreter.regstack:
raise 'Regstack not empty after parsing ended', interpreter.regstack
argum = {
- 'text': interpreter.text,
- 'data': interpreter.data,
- 'bss': interpreter.bss,
+ 'text': interpreter.sections['.text'],
+ 'data': interpreter.sections['.data'],
+ 'bss': interpreter.sections['.bss'],
}
if base <> None: argum['base_address'] = base
if format == 'elf':
|
|
From: <di...@us...> - 2003-05-17 10:54:49
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv9695
Modified Files:
tran-builtins tran.py
Log Message:
replaced Meaning by interpreter.meaning
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -d -r1.19 -r1.20
--- tran-builtins 17 May 2003 10:43:54 -0000 1.19
+++ tran-builtins 17 May 2003 10:54:46 -0000 1.20
@@ -77,8 +77,8 @@
raise 'too long argument pattern', interpreter.regstack
name = ' '.join([name] + [matchers(i).next() for i in interpreter.regstack])
interpreter.regstack = []
- if Meaning.has_key(name): raise 'duplicate declaration', name
- interpreter.recordee = Meaning[name] = []
+ if interpreter.meaning.has_key(name): raise 'duplicate declaration', name
+ interpreter.recordee = interpreter.meaning[name] = []
def record_state (tok):
if tok == Semicolon:
interpreter.state = interpreter.outer_state
@@ -89,8 +89,8 @@
:regs|family
def regs_state0 (family):
- if Meaning.has_key(family):
- f = Meaning[family]
+ if interpreter.meaning.has_key(family):
+ f = interpreter.meaning[family]
if not isinstance(f, Register):
raise 'unable to declare subregisters for', f
if not interpreter.hanging.has_key(f):
@@ -103,7 +103,7 @@
f = interpreter.regpaths[-1]
interpreter.regpaths[-1] = f.next()
interpreter.regpaths.append(f.child())
- Meaning[family] = f
+ interpreter.meaning[family] = f
Registers[f] = family
interpreter.state = regs_state
def regs_state (tok):
@@ -115,15 +115,15 @@
r = interpreter.regpaths[-1]
if interpreter.hanging.has_key(r.parent()):
raise 'misplaced ellipsis'
- elif Meaning.has_key(tok):
- if Meaning[tok] == Meaning[':regs']:
+ elif interpreter.meaning.has_key(tok):
+ if interpreter.meaning[tok] == interpreter.meaning[':regs']:
interpreter.state = regs_state0
- elif Meaning[tok] == Meaning['...']:
+ elif interpreter.meaning[tok] == interpreter.meaning['...']:
interpreter.hanging[r.parent()] = r[-1]
else: raise 'duplicate declaration', tok
else:
interpreter.regpaths[-1] = r.next()
- Meaning[tok] = r
+ interpreter.meaning[tok] = r
Registers[r] = tok
regs_state0(family)
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.91
retrieving revision 1.92
diff -u -d -r1.91 -r1.92
--- tran.py 17 May 2003 10:43:54 -0000 1.91
+++ tran.py 17 May 2003 10:54:46 -0000 1.92
@@ -219,33 +219,35 @@
Generic_Register = Register()
-MA_PREFIX = 1
-Meaning = {'reg': Generic_Register,
- '...': Unique('...'),
- 'tetras': ['dup', '+', 'dup', '+'], # FIXME
-}
-for m in 'any const int lit sum sym'.split(' '):
- Meaning[m] = Class_Marker(m)
+class Interpreter (object):
+ __slots__ = 'text data bss current recordee regpaths hanging regstack state meaning'.split()
-bf = open('tran-builtins', 'r')
-builtins = bf.read()
-bf.close()
+ universal_meaning = {
+ 'reg': Generic_Register,
+ '...': Unique('...'),
+ 'tetras': ['dup', '+', 'dup', '+'], # FIXME
+ }
+ for m in 'any const int lit sum sym'.split(' '):
+ universal_meaning[m] = Class_Marker(m)
-for b in builtins.split('\n\n'):
- if b[0] != '#':
- name, code = b.split('\n', 1)
- np = (name + '|').split('|')
- name = np[0]
- pa = np[1]
- exec 'def _p (%s):\n%s\n' % (pa, code)
- flags = 0
- if pa: flags |= MA_PREFIX
- Meaning[name] = 'builtin', _p, flags
+ # load builtins
+ _bf = open('tran-builtins', 'r')
+ _builtins = _bf.read()
+ _bf.close()
-Registers = {Generic_Register: 'reg'} # for reverse translation
+ MA_PREFIX = 1
+
+ for _b in _builtins.split('\n\n'):
+ if _b[0] != '#':
+ _name, _code = _b.split('\n', 1)
+ _np = (_name + '|').split('|')
+ _name = _np[0]
+ _pa = _np[1]
+ exec 'def _p (%s):\n%s\n' % (_pa, _code)
+ _flags = 0
+ if _pa: _flags |= MA_PREFIX
+ universal_meaning[_name] = 'builtin', _p, _flags
-class Interpreter (object):
- __slots__ = 'text data bss current recordee regpaths hanging regstack state'.split()
def __init__ (this, byte_order):
this.text = Linkie('<')
this.data = Linkie('<')
@@ -256,6 +258,7 @@
this.hanging = {}
this.regstack = []
this.state = this.outer_state
+ this.meaning = Interpreter.universal_meaning.copy()
def outer_state (this, tok):
if isinstance(tok, Integer_Literal):
this.regstack.append(tok)
@@ -263,30 +266,32 @@
root = tok
mg = match_generator(root)
try:
- while not Meaning.has_key(tok):
+ while not interpreter.meaning.has_key(tok):
tok = mg.next()
if tok == None:
raise 'stack too empty or meaningless word', root
except StopIteration:
raise 'meaningless word', root
- m = Meaning[tok]
+ m = interpreter.meaning[tok]
if isinstance(m, list): prep.push(Macro_Cursor(m))
elif isinstance(m, Stackable): this.regstack.append(m)
elif isinstance(m, tuple):
mtype = m[0]
if mtype == 'builtin':
- if m[2] & MA_PREFIX:
+ if m[2] & Interpreter.MA_PREFIX:
tok = prep.get_token()
if not isinstance(tok, str): raise 'word expected', tok
m[1](tok)
else:
m[1]()
- else: raise 'Unknown meaning type in', `Meaning[tok]`
+ else: raise 'Unknown meaning type in', `interpreter.meaning[tok]`
else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
interpreter = Interpreter('<')
+Registers = {Generic_Register: 'reg'} # for reverse translation
+
default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'}
verbose = 0
format = 'elf'
@@ -307,7 +312,7 @@
if output_name == None: output_name = default_output_names[format]
if list_words:
wd = {}
- for w in Meaning.keys():
+ for w in interpreter.meaning.keys():
s = w.find(' ')
if s != -1: w = w[:s]
wd[w] = 1
|
|
From: <di...@us...> - 2003-05-17 10:43:59
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv1440
Modified Files:
tran-builtins tran.py
Log Message:
converted outer_state into a method of the Interpreter class
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -d -r1.18 -r1.19
--- tran-builtins 17 May 2003 10:29:40 -0000 1.18
+++ tran-builtins 17 May 2003 10:43:54 -0000 1.19
@@ -81,7 +81,7 @@
interpreter.recordee = Meaning[name] = []
def record_state (tok):
if tok == Semicolon:
- interpreter.state = outer_state
+ interpreter.state = interpreter.outer_state
interpreter.recordee = None
else:
interpreter.recordee.append(tok)
@@ -110,7 +110,7 @@
if tok == Semicolon:
interpreter.regpaths.pop()
if len(interpreter.regpaths) == 1:
- interpreter.state = outer_state
+ interpreter.state = interpreter.outer_state
else:
r = interpreter.regpaths[-1]
if interpreter.hanging.has_key(r.parent()):
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.90
retrieving revision 1.91
diff -u -d -r1.90 -r1.91
--- tran.py 17 May 2003 10:38:09 -0000 1.90
+++ tran.py 17 May 2003 10:43:54 -0000 1.91
@@ -217,35 +217,6 @@
except StopIteration: pass
except StopIteration: pass
-def outer_state (tok):
- if isinstance(tok, Integer_Literal):
- interpreter.regstack.append(tok)
- elif isinstance(tok, str):
- root = tok
- mg = match_generator(root)
- try:
- while not Meaning.has_key(tok):
- tok = mg.next()
- if tok == None:
- raise 'stack too empty or meaningless word', root
- except StopIteration:
- raise 'meaningless word', root
- m = Meaning[tok]
- if isinstance(m, list): prep.push(Macro_Cursor(m))
- elif isinstance(m, Stackable): interpreter.regstack.append(m)
- elif isinstance(m, tuple):
- mtype = m[0]
- if mtype == 'builtin':
- if m[2] & MA_PREFIX:
- tok = prep.get_token()
- if not isinstance(tok, str): raise 'word expected', tok
- m[1](tok)
- else:
- m[1]()
- else: raise 'Unknown meaning type in', `Meaning[tok]`
- else: raise 'Unknown meaning format for', tok
- else: raise 'bad token', tok
-
Generic_Register = Register()
MA_PREFIX = 1
@@ -284,7 +255,35 @@
this.regpaths = [Register(0)] # for generating new registers
this.hanging = {}
this.regstack = []
- this.state = outer_state
+ this.state = this.outer_state
+ def outer_state (this, tok):
+ if isinstance(tok, Integer_Literal):
+ this.regstack.append(tok)
+ elif isinstance(tok, str):
+ root = tok
+ mg = match_generator(root)
+ try:
+ while not Meaning.has_key(tok):
+ tok = mg.next()
+ if tok == None:
+ raise 'stack too empty or meaningless word', root
+ except StopIteration:
+ raise 'meaningless word', root
+ m = Meaning[tok]
+ if isinstance(m, list): prep.push(Macro_Cursor(m))
+ elif isinstance(m, Stackable): this.regstack.append(m)
+ elif isinstance(m, tuple):
+ mtype = m[0]
+ if mtype == 'builtin':
+ if m[2] & MA_PREFIX:
+ tok = prep.get_token()
+ if not isinstance(tok, str): raise 'word expected', tok
+ m[1](tok)
+ else:
+ m[1]()
+ else: raise 'Unknown meaning type in', `Meaning[tok]`
+ else: raise 'Unknown meaning format for', tok
+ else: raise 'bad token', tok
interpreter = Interpreter('<')
|
|
From: <di...@us...> - 2003-05-17 10:38:17
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv28954
Modified Files:
tran.py
Log Message:
introduced the Interpreter class
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- tran.py 17 May 2003 10:29:41 -0000 1.89
+++ tran.py 17 May 2003 10:38:09 -0000 1.90
@@ -273,18 +273,20 @@
Registers = {Generic_Register: 'reg'} # for reverse translation
-class container (object): pass
+class Interpreter (object):
+ __slots__ = 'text data bss current recordee regpaths hanging regstack state'.split()
+ def __init__ (this, byte_order):
+ this.text = Linkie('<')
+ this.data = Linkie('<')
+ this.bss = Linkie('<')
+ this.current = this.text
+ this.recordee = None
+ this.regpaths = [Register(0)] # for generating new registers
+ this.hanging = {}
+ this.regstack = []
+ this.state = outer_state
-interpreter = container()
-interpreter.state = outer_state
-interpreter.text = Linkie('<')
-interpreter.data = Linkie('<')
-interpreter.bss = Linkie('<')
-interpreter.current = interpreter.text
-interpreter.recordee = None
-interpreter.regpaths = [Register(0)] # for generating new registers
-interpreter.hanging = {}
-interpreter.regstack = []
+interpreter = Interpreter('<')
default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'}
verbose = 0
|
|
From: <di...@us...> - 2003-05-17 10:29:45
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv22927
Modified Files:
tran-builtins tran.py
Log Message:
renamed Regstack to interpreter.regstack
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -d -r1.17 -r1.18
--- tran-builtins 17 May 2003 09:51:15 -0000 1.17
+++ tran-builtins 17 May 2003 10:29:40 -0000 1.18
@@ -7,38 +7,38 @@
#### @(#) $Id$
$-t, sum
- s = Regstack.pop()
+ s = interpreter.regstack.pop()
scalar = long(s[0])
symbols = map(str, s[1:])
interpreter.current.emit_tetra_sum(symbols, delta = scalar % 0x100000000L, relative = 1)
$-t, sym
- interpreter.current.emit_tetra_sum([str(Regstack.pop())], relative = 1)
+ interpreter.current.emit_tetra_sum([str(interpreter.regstack.pop())], relative = 1)
$-w, sum
- s = Regstack.pop()
+ s = interpreter.regstack.pop()
scalar = long(s[0])
symbols = map(str, s[1:])
interpreter.current.emit_wyde_sum(symbols, delta = scalar % 0x10000L, relative = 1)
$-w, sym
- interpreter.current.emit_wyde_sum([str(Regstack.pop())], relative = 1)
+ interpreter.current.emit_wyde_sum([str(interpreter.regstack.pop())], relative = 1)
+ int int
- n = Regstack.pop(); m = Regstack.pop()
- Regstack.append(m + n)
+ n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
+ interpreter.regstack.append(m + n)
- int int
- n = Regstack.pop(); m = Regstack.pop()
- Regstack.append(m - n)
+ n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
+ interpreter.regstack.append(m - n)
- sum int
- n = Regstack.pop(); m = Regstack.pop()
- Regstack.append(m - n)
+ n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
+ interpreter.regstack.append(m - n)
- sym int
- n = Regstack.pop(); m = Regstack.pop()
- Regstack.append(m - n)
+ n = interpreter.regstack.pop(); m = interpreter.regstack.pop()
+ interpreter.regstack.append(m - n)
.bss
interpreter.current = interpreter.bss
@@ -50,31 +50,33 @@
interpreter.current = interpreter.text
//
- Regstack = []
+ interpreter.regstack = []
3rev
- if len(Regstack) < 3: raise 'unstacking is not implemented yet'
- r = Regstack[-3:]; r.reverse()
- Regstack = Regstack[:-3] + r
+ if len(interpreter.regstack) < 3: raise 'unstacking is not implemented yet'
+ r = interpreter.regstack[-3:]; r.reverse()
+ interpreter.regstack = interpreter.regstack[:-3] + r
4rev
- if len(Regstack) < 4: raise 'unstacking is not implemented yet'
- r = Regstack[-4:]; r.reverse()
- Regstack = Regstack[:-4] + r
+ if len(interpreter.regstack) < 4: raise 'unstacking is not implemented yet'
+ r = interpreter.regstack[-4:]; r.reverse()
+ interpreter.regstack = interpreter.regstack[:-4] + r
5rev
- if len(Regstack) < 5: raise 'unstacking is not implemented yet'
- r = Regstack[-5:]; r.reverse()
- Regstack = Regstack[:-5] + r
+ if len(interpreter.regstack) < 5: raise 'unstacking is not implemented yet'
+ r = interpreter.regstack[-5:]; r.reverse()
+ interpreter.regstack = interpreter.regstack[:-5] + r
:[
# intended to be used before the macro's pattern
- if Regstack: raise 'stack not empty for :[', Regstack
+ if interpreter.regstack:
+ raise 'stack not empty for :[', interpreter.regstack
]|name
- if len(Regstack) > 2: raise 'too long argument pattern', Regstack
- name = ' '.join([name] + [matchers(i).next() for i in Regstack])
- Regstack = []
+ if len(interpreter.regstack) > 2:
+ raise 'too long argument pattern', interpreter.regstack
+ name = ' '.join([name] + [matchers(i).next() for i in interpreter.regstack])
+ interpreter.regstack = []
if Meaning.has_key(name): raise 'duplicate declaration', name
interpreter.recordee = Meaning[name] = []
def record_state (tok):
@@ -126,53 +128,53 @@
regs_state0(family)
align int
- interpreter.current.align(long(Regstack.pop()))
+ interpreter.current.align(long(interpreter.regstack.pop()))
b, int
- interpreter.current[::1] = long(Regstack.pop())
+ interpreter.current[::1] = long(interpreter.regstack.pop())
b, sym
- interpreter.current[::1] = str(Regstack.pop())
+ interpreter.current[::1] = str(interpreter.regstack.pop())
commit
- Regstack.reverse()
- prep.push(Macro_Cursor(['$push'] * len(Regstack)))
+ interpreter.regstack.reverse()
+ prep.push(Macro_Cursor(['$push'] * len(interpreter.regstack)))
drop any
- Regstack.pop()
+ interpreter.regstack.pop()
dup any
- Regstack.append(Regstack[-1])
+ interpreter.regstack.append(interpreter.regstack[-1])
label|name
interpreter.current.place_symbol('&' + name)
minor reg
- Regstack.append(Integer_Literal(Regstack.pop()[-1]))
+ interpreter.regstack.append(Integer_Literal(interpreter.regstack.pop()[-1]))
include|name
prep.push_file(str(name) + '.tran')
ref|name
- Regstack.append(Symbol_Literal('&' + name))
+ interpreter.regstack.append(Symbol_Literal('&' + name))
reserve int
- interpreter.current.skip(Regstack.pop())
+ interpreter.current.skip(interpreter.regstack.pop())
swap any any
- y = Regstack.pop(); x = Regstack.pop()
- Regstack.append(y); Regstack.append(x)
+ y = interpreter.regstack.pop(); x = interpreter.regstack.pop()
+ interpreter.regstack.append(y); interpreter.regstack.append(x)
t, int
- interpreter.current[::4] = long(Regstack.pop())
+ interpreter.current[::4] = long(interpreter.regstack.pop())
t, sym
- interpreter.current[::4] = str(Regstack.pop())
+ interpreter.current[::4] = str(interpreter.regstack.pop())
w, int
- interpreter.current[::2] = long(Regstack.pop())
+ interpreter.current[::2] = long(interpreter.regstack.pop())
w, sym
- interpreter.current[::2] = str(Regstack.pop())
+ interpreter.current[::2] = str(interpreter.regstack.pop())
# vim: ft=python
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.88
retrieving revision 1.89
diff -u -d -r1.88 -r1.89
--- tran.py 17 May 2003 10:16:53 -0000 1.88
+++ tran.py 17 May 2003 10:29:41 -0000 1.89
@@ -200,27 +200,26 @@
def match_generator (root):
yield root
- if len(Regstack) < 1: yield None # want more registers
- m = matchers(Regstack[-1])
+ if len(interpreter.regstack) < 1: yield None # want more registers
+ m = matchers(interpreter.regstack[-1])
try:
while 1:
yield root + ' ' + m.next()
except StopIteration: pass
- if len(Regstack) < 2: yield None
- m1 = matchers(Regstack[-2])
+ if len(interpreter.regstack) < 2: yield None
+ m1 = matchers(interpreter.regstack[-2])
try:
while 1:
n1 = m1.next()
- m2 = matchers(Regstack[-1])
+ m2 = matchers(interpreter.regstack[-1])
try:
while 1: yield root + ' ' + n1 + ' ' + m2.next()
except StopIteration: pass
except StopIteration: pass
def outer_state (tok):
- global Regstack
if isinstance(tok, Integer_Literal):
- Regstack.append(tok)
+ interpreter.regstack.append(tok)
elif isinstance(tok, str):
root = tok
mg = match_generator(root)
@@ -233,7 +232,7 @@
raise 'meaningless word', root
m = Meaning[tok]
if isinstance(m, list): prep.push(Macro_Cursor(m))
- elif isinstance(m, Stackable): Regstack.append(m)
+ elif isinstance(m, Stackable): interpreter.regstack.append(m)
elif isinstance(m, tuple):
mtype = m[0]
if mtype == 'builtin':
@@ -247,7 +246,6 @@
else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
-Regstack = []
Generic_Register = Register()
MA_PREFIX = 1
@@ -268,7 +266,7 @@
np = (name + '|').split('|')
name = np[0]
pa = np[1]
- exec 'def _p (%s):\n global Regstack\n%s\n' % (pa, code)
+ exec 'def _p (%s):\n%s\n' % (pa, code)
flags = 0
if pa: flags |= MA_PREFIX
Meaning[name] = 'builtin', _p, flags
@@ -286,6 +284,7 @@
interpreter.recordee = None
interpreter.regpaths = [Register(0)] # for generating new registers
interpreter.hanging = {}
+interpreter.regstack = []
default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'}
verbose = 0
@@ -320,14 +319,14 @@
prep = Preprocessor(args[0])
tok = prep.get_token()
while tok <> None:
- if verbose: print '(%s) %s' % (' '.join(map(str, Regstack)), tok)
+ if verbose: print '(%s) %s' % (' '.join(map(str, interpreter.regstack)), tok)
interpreter.state(tok)
tok = prep.get_token()
interpreter.text.dump(title = 'TEXT')
interpreter.data.dump(title = 'DATA')
interpreter.bss.dump(title = 'BSS')
- if Regstack:
- raise 'Regstack not empty after parsing ended', Regstack
+ if interpreter.regstack:
+ raise 'Regstack not empty after parsing ended', interpreter.regstack
argum = {
'text': interpreter.text,
'data': interpreter.data,
|
|
From: <di...@us...> - 2003-05-17 10:17:05
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv11686
Modified Files:
elf.py pe.py tran.py
Log Message:
implemented the --base option
Index: elf.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/elf.py,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -d -r1.56 -r1.57
--- elf.py 16 May 2003 13:37:20 -0000 1.56
+++ elf.py 17 May 2003 10:16:53 -0000 1.57
@@ -490,7 +490,7 @@
return p_flags
def make_ELF32_object (text = None, data = None, bss = None, flags = '',
- memory_bottom = 0x08048000):
+ base_address = 0x08048000):
# Will NOT set given sections' origins.
want_symbols = 's' in flags
want_relocatable = 'r' in flags
@@ -502,7 +502,7 @@
if bss <> None: sections['.bss'] = bss
binary = Linkie('<')
- memory_boundary = memory_bottom # must be at page boundary
+ memory_boundary = base_address # must be at page boundary
binary.glue(0, make_ELF32_header('<', reloc = want_relocatable), None)
if want_relocatable:
binary.place_symbol('#elf/type', ET.REL)
Index: pe.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/pe.py,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -d -r1.6 -r1.7
--- pe.py 16 May 2003 17:14:29 -0000 1.6
+++ pe.py 17 May 2003 10:16:53 -0000 1.7
@@ -298,8 +298,8 @@
e.place_symbol('#aout/text-size', roundup(text.memsz(), 0x200))
e.place_symbol('#aout/data-size', roundup(data.memsz(), 0x200))
e.place_symbol('#aout/bss-size', roundup(bss.memsz(), 0x200))
- e.place_symbol('#aout/image-base', 0x00400000)
- e.place_symbol('#rva', -0x00400000) # adding this to an address will yield RVA
+ e.place_symbol('#aout/image-base', base_address)
+ e.place_symbol('#rva', -base_address) # adding this to an address will yield RVA
e.place_symbol('#aout/memory-align', 4096)
e.place_symbol('#aout/file-align', 512)
# 4.0 = MSW95
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -d -r1.87 -r1.88
--- tran.py 17 May 2003 09:25:33 -0000 1.87
+++ tran.py 17 May 2003 10:16:53 -0000 1.88
@@ -293,12 +293,15 @@
def main ():
global prep, verbose, format
- opts, args = getopt(sys.argv[1:], 'vo:f:', ['verbose', 'output=', 'format=', 'list-words'])
+ opts, args = getopt(sys.argv[1:], 'vo:b:f:',
+ ['verbose', 'output=', 'base=', 'format=', 'list-words'])
output_name = None
list_words = 0
+ base = None
for opt, arg in opts:
- if opt in ('-o', '--output'): output_name = arg
if opt in ('-v', '--verbose'): verbose = 1
+ if opt in ('-o', '--output'): output_name = arg
+ if opt in ('-b', '--base'): base = string.atol(arg, 16)
if opt in ('-f', '--format'): format = arg
if opt == '--list-words': list_words = 1
if output_name == None: output_name = default_output_names[format]
@@ -325,15 +328,17 @@
interpreter.bss.dump(title = 'BSS')
if Regstack:
raise 'Regstack not empty after parsing ended', Regstack
+ argum = {
+ 'text': interpreter.text,
+ 'data': interpreter.data,
+ 'bss': interpreter.bss,
+ }
+ if base <> None: argum['base_address'] = base
if format == 'elf':
- binary = elf.make_ELF32_object(text = interpreter.text,
- data = interpreter.data,
- bss = interpreter.bss,
- flags = 's')
+ argum['flags'] = 's'
+ binary = apply(elf.make_ELF32_object, [], argum)
elif format == 'pe':
- binary = pe.make_pe_executable(text = interpreter.text,
- data = interpreter.data,
- bss = interpreter.bss)
+ binary = apply(pe.make_pe_executable, [], argum)
f = open(output_name, 'w')
binary.get_file().tofile(f)
f.close()
|
|
From: <di...@us...> - 2003-05-17 10:03:54
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv5296
Modified Files:
Makefile.am ia32.tran
Added Files:
ia16.tran
Log Message:
created ia16.tran
--- NEW FILE: ia16.tran ---
\\\\ ia16.tran - 16-bit Intel architecture
\
\ Copyleft © 2003 by Andres Soolo (di...@us...)
\ This file is licensed under the GNU GPL v2. If you
\ don't know what that means, please do read the GPL.
\
\\\\ @(#) $Id: ia16.tran,v 1.1 2003/05/17 10:03:51 digg Exp $
\ Note that ia16 is not generally supported.
\ This file is presented merely for completeness' sake.
:[ ] $o16 ;
:[ ] $o32 #x66 b, ;
:[ ] $a16 ;
:[ ] $a32 #x67 b, ;
\ Note that $osize don't remove the matched register from the stack.
:[ reg16 ] $osize ; \ or $o16
:[ reg32 ] $osize #x66 b, ; \ or $o32
\ Processor Word for ia16 is wyde
:[ ] pw, w, ;
:[ ] pw-size 2 ;
:[ ] $-pw, $-w, ;
\ vim: ft=tran
Index: Makefile.am
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/Makefile.am,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- Makefile.am 17 May 2003 05:37:51 -0000 1.15
+++ Makefile.am 17 May 2003 10:03:50 -0000 1.16
@@ -8,7 +8,9 @@
EXTRA_DIST = .cvsignore .pycheckrc struburn.wisp bits.py linkie.py \
coff.py elf.py pe.py \
- i8086.tran i80386.tran ia32.tran hello.tran winapi.tran mswhello.tran \
+ i8086.tran i80386.tran ia16.tran ia32.tran \
+ winapi.tran \
+ hello.tran mswhello.tran \
makehello.py elfdump.py
all:
Index: ia32.tran
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- ia32.tran 17 May 2003 09:55:40 -0000 1.16
+++ ia32.tran 17 May 2003 10:03:51 -0000 1.17
@@ -6,15 +6,14 @@
\
\\\\ @(#) $Id$
-\ These are prefixes for 32-bit mode
:[ ] $o16 #x66 b, ;
:[ ] $o32 ;
:[ ] $a16 #x67 b, ;
:[ ] $a32 ;
\ Note that $osize don't remove the matched register from the stack.
-:[ reg32 ] $osize ; \ or $o32
:[ reg16 ] $osize #x66 b, ; \ or $o16
+:[ reg32 ] $osize ; \ or $o32
\ Processor Word for ia32 is tetra
:[ ] pw, t, ;
|
|
From: <di...@us...> - 2003-05-17 09:55:43
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv2790 Modified Files: i8086.tran ia32.tran Log Message: introduced the |$-pw,| word Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.6 retrieving revision 1.7 diff -u -d -r1.6 -r1.7 --- i8086.tran 17 May 2003 09:47:27 -0000 1.6 +++ i8086.tran 17 May 2003 09:55:40 -0000 1.7 @@ -28,4 +28,6 @@ :[ reg16/32 ] $push $osize minor #o120 + b, ; :[ lit ] $push #x68 b, pw, ; +:[ lit ] $call #xe8 b, pw-size - $-pw, ; + \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.15 retrieving revision 1.16 diff -u -d -r1.15 -r1.16 --- ia32.tran 17 May 2003 09:48:57 -0000 1.15 +++ ia32.tran 17 May 2003 09:55:40 -0000 1.16 @@ -16,11 +16,9 @@ :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 -:[ ] pw, t, ; \ Processor Word for ia32 is tetra +\ Processor Word for ia32 is tetra +:[ ] pw, t, ; :[ ] pw-size 4 ; - -\ These instructions are not completely operand width portable: - -:[ lit ] $call #xe8 b, pw-size - $-t, ; +:[ ] $-pw, $-t, ; \ vim: ft=tran |
|
From: <di...@us...> - 2003-05-17 09:51:18
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv1272
Modified Files:
tran-builtins
Log Message:
implemented the |$-w,| builtin
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -d -r1.16 -r1.17
--- tran-builtins 17 May 2003 09:25:33 -0000 1.16
+++ tran-builtins 17 May 2003 09:51:15 -0000 1.17
@@ -15,6 +15,15 @@
$-t, sym
interpreter.current.emit_tetra_sum([str(Regstack.pop())], relative = 1)
+$-w, sum
+ s = Regstack.pop()
+ scalar = long(s[0])
+ symbols = map(str, s[1:])
+ interpreter.current.emit_wyde_sum(symbols, delta = scalar % 0x10000L, relative = 1)
+
+$-w, sym
+ interpreter.current.emit_wyde_sum([str(Regstack.pop())], relative = 1)
+
+ int int
n = Regstack.pop(); m = Regstack.pop()
Regstack.append(m + n)
|
|
From: <di...@us...> - 2003-05-17 09:49:00
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv554 Modified Files: ia32.tran Log Message: introduced the |pw-size| word Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.14 retrieving revision 1.15 diff -u -d -r1.14 -r1.15 --- ia32.tran 17 May 2003 09:47:28 -0000 1.14 +++ ia32.tran 17 May 2003 09:48:57 -0000 1.15 @@ -17,9 +17,10 @@ :[ reg16 ] $osize #x66 b, ; \ or $o16 :[ ] pw, t, ; \ Processor Word for ia32 is tetra +:[ ] pw-size 4 ; \ These instructions are not completely operand width portable: -:[ lit ] $call #xe8 b, 4 - $-t, ; +:[ lit ] $call #xe8 b, pw-size - $-t, ; \ vim: ft=tran |
|
From: <di...@us...> - 2003-05-17 09:47:31
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv32552 Modified Files: i8086.tran ia32.tran Log Message: introduced the |pw,| word Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- i8086.tran 17 May 2003 09:36:39 -0000 1.5 +++ i8086.tran 17 May 2003 09:47:27 -0000 1.6 @@ -26,5 +26,6 @@ :[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; :[ reg16/32 ] $push $osize minor #o120 + b, ; +:[ lit ] $push #x68 b, pw, ; \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.13 retrieving revision 1.14 diff -u -d -r1.13 -r1.14 --- ia32.tran 17 May 2003 09:36:39 -0000 1.13 +++ ia32.tran 17 May 2003 09:47:28 -0000 1.14 @@ -16,9 +16,10 @@ :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 +:[ ] pw, t, ; \ Processor Word for ia32 is tetra + \ These instructions are not completely operand width portable: -:[ lit ] $push #x68 b, t, ; :[ lit ] $call #xe8 b, 4 - $-t, ; \ vim: ft=tran |
|
From: <di...@us...> - 2003-05-17 09:41:25
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv30748
Modified Files:
hello.tran
Log Message:
syntax highlighting
Index: hello.tran
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/hello.tran,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- hello.tran 17 May 2003 05:37:51 -0000 1.3
+++ hello.tran 17 May 2003 09:41:22 -0000 1.4
@@ -27,4 +27,4 @@
label message
#/H b, #/E b, #/L b, #/L b, #/O b, 10 b,
-\ vim: ft=forth
+\ vim: ft=tran
|
|
From: <di...@us...> - 2003-05-17 09:36:43
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv29087 Modified Files: i8086.tran ia32.tran Log Message: replaced |$push reg32| by |$push reg16/32| Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.4 retrieving revision 1.5 diff -u -d -r1.4 -r1.5 --- i8086.tran 17 May 2003 09:33:36 -0000 1.4 +++ i8086.tran 17 May 2003 09:36:39 -0000 1.5 @@ -25,4 +25,6 @@ :[ reg16 lit ] $mov $o16 swap minor #o270 + b, w, ; :[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ; +:[ reg16/32 ] $push $osize minor #o120 + b, ; + \ vim: ft=tran Index: ia32.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- ia32.tran 17 May 2003 09:33:36 -0000 1.12 +++ ia32.tran 17 May 2003 09:36:39 -0000 1.13 @@ -12,12 +12,9 @@ :[ ] $a16 #x67 b, ; :[ ] $a32 ; +\ Note that $osize don't remove the matched register from the stack. :[ reg32 ] $osize ; \ or $o32 :[ reg16 ] $osize #x66 b, ; \ or $o16 - -\ instructions - -:[ reg32 ] $push minor #o120 + b, ; \ These instructions are not completely operand width portable: |
|
From: <di...@us...> - 2003-05-17 09:33:39
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv28178
Modified Files:
ia32.tran i8086.tran
Log Message:
moved |$mov reg32 lit| to i8086.tran and wrote |$mov reg16 lit|
Index: ia32.tran
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/ia32.tran,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -d -r1.11 -r1.12
--- ia32.tran 17 May 2003 05:37:51 -0000 1.11
+++ ia32.tran 17 May 2003 09:33:36 -0000 1.12
@@ -17,7 +17,6 @@
\ instructions
-:[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ;
:[ reg32 ] $push minor #o120 + b, ;
\ These instructions are not completely operand width portable:
Index: i8086.tran
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -d -r1.3 -r1.4
--- i8086.tran 17 May 2003 09:28:34 -0000 1.3
+++ i8086.tran 17 May 2003 09:33:36 -0000 1.4
@@ -15,10 +15,14 @@
:regs reg16/32 \ for extensibility to i80386
:regs reg16 %ax %cx %dx %bx %sp %bp %si %di ;
- ... \ and leave it hanging
+ :regs reg32 ... ;
+ ...
;
\ instructions
:[ lit ] $int #xCD b, b, ;
+
+:[ reg16 lit ] $mov $o16 swap minor #o270 + b, w, ;
+:[ reg32 lit ] $mov $o32 swap minor #o270 + b, t, ;
\ vim: ft=tran
|
|
From: <di...@us...> - 2003-05-17 09:28:37
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv26624 Modified Files: i8086.tran i80386.tran Log Message: implemented the reg16/reg32 register group Index: i8086.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i8086.tran,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- i8086.tran 17 May 2003 05:17:42 -0000 1.2 +++ i8086.tran 17 May 2003 09:28:34 -0000 1.3 @@ -11,8 +11,12 @@ \ or ia32, too in the future to specify the mode. \ registers -:regs reg16 %ax %cx %dx %bx %sp %bp %si %di ; :regs reg8 %al %cl %dl %bl %ah %ch %dh %bh ; + +:regs reg16/32 \ for extensibility to i80386 + :regs reg16 %ax %cx %dx %bx %sp %bp %si %di ; + ... \ and leave it hanging +; \ instructions :[ lit ] $int #xCD b, b, ; Index: i80386.tran =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/i80386.tran,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- i80386.tran 17 May 2003 05:52:49 -0000 1.2 +++ i80386.tran 17 May 2003 09:28:34 -0000 1.3 @@ -9,6 +9,8 @@ include i8086 \ registers -:regs reg32 %eax %ecx %edx %ebx %esp %ebp %esi %edi ; +:regs reg16/32 + :regs reg32 %eax %ecx %edx %ebx %esp %ebp %esi %edi ; +; \ vim: ft=tran |
|
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'}
|
|
From: <di...@us...> - 2003-05-17 08:46:27
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv14469
Modified Files:
tran-builtins tran.py
Log Message:
let interpreter.regpath be an instance of Register
Index: tran-builtins
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- tran-builtins 17 May 2003 06:44:35 -0000 1.14
+++ tran-builtins 17 May 2003 08:46:24 -0000 1.15
@@ -79,15 +79,14 @@
:regs|family
def regs_state0 (family):
if Meaning.has_key(family): raise 'duplicate declaration', family
- f = apply(Register, interpreter.regpath)
+ f = interpreter.regpath
Meaning[family] = f
Registers[f] = family
- interpreter.regpath.append(0)
+ interpreter.regpath = interpreter.regpath.child()
interpreter.state = regs_state
def regs_state (tok):
if tok == Semicolon:
- interpreter.regpath.pop()
- interpreter.regpath[-1] += 1
+ interpreter.regpath = interpreter.regpath.parent().next()
if len(interpreter.regpath) == 1:
interpreter.state = outer_state
elif Meaning.has_key(tok):
@@ -95,10 +94,10 @@
interpreter.state = regs_state0
else: raise 'duplicate declaration', tok
else:
- r = apply(Register, interpreter.regpath)
+ r = interpreter.regpath
Meaning[tok] = r
Registers[r] = tok
- interpreter.regpath[-1] += 1
+ interpreter.regpath = interpreter.regpath.next()
regs_state0(family)
align int
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.85
retrieving revision 1.86
diff -u -d -r1.85 -r1.86
--- tran.py 17 May 2003 08:37:23 -0000 1.85
+++ tran.py 17 May 2003 08:46:24 -0000 1.86
@@ -161,7 +161,7 @@
def next (this):
l = list(this)
l[-1] += 1
- return apply(Register, this)
+ return apply(Register, l)
def child (this, index = 0):
return apply(Register, this + (index,))
def __repr__ (this):
@@ -284,7 +284,7 @@
interpreter.bss = Linkie('<')
interpreter.current = interpreter.text
interpreter.recordee = None
-interpreter.regpath = [0] # for generating new registers
+interpreter.regpath = Register(0) # for generating new registers
interpreter.hanging = {}
default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'}
|
|
From: <di...@us...> - 2003-05-17 08:37:27
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv11799
Modified Files:
tran.py
Log Message:
wrote Register.next and Register.child
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.84
retrieving revision 1.85
diff -u -d -r1.84 -r1.85
--- tran.py 17 May 2003 08:34:21 -0000 1.84
+++ tran.py 17 May 2003 08:37:23 -0000 1.85
@@ -158,6 +158,12 @@
def parent (this):
if len(this): return apply(Register, this[:-1])
else: return None
+ def next (this):
+ l = list(this)
+ l[-1] += 1
+ return apply(Register, this)
+ def child (this, index = 0):
+ return apply(Register, this + (index,))
def __repr__ (this):
return 'Register' + tuple.__repr__(this)
def __str__ (this):
|
|
From: <di...@us...> - 2003-05-17 08:34:25
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv10845
Modified Files:
tran.py
Log Message:
added interpreter.hanging
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.83
retrieving revision 1.84
diff -u -d -r1.83 -r1.84
--- tran.py 17 May 2003 08:10:38 -0000 1.83
+++ tran.py 17 May 2003 08:34:21 -0000 1.84
@@ -279,6 +279,7 @@
interpreter.current = interpreter.text
interpreter.recordee = None
interpreter.regpath = [0] # for generating new registers
+interpreter.hanging = {}
default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'}
verbose = 0
|
|
From: <di...@us...> - 2003-05-17 08:10:41
|
Update of /cvsroot/wisp/wisp/users/dig
In directory sc8-pr-cvs1:/tmp/cvs-serv3315
Modified Files:
tran.py
Log Message:
implemented |...|
Index: tran.py
===================================================================
RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v
retrieving revision 1.82
retrieving revision 1.83
diff -u -d -r1.82 -r1.83
--- tran.py 17 May 2003 06:08:31 -0000 1.82
+++ tran.py 17 May 2003 08:10:38 -0000 1.83
@@ -228,7 +228,7 @@
m = Meaning[tok]
if isinstance(m, list): prep.push(Macro_Cursor(m))
elif isinstance(m, Stackable): Regstack.append(m)
- else: # assume tuple
+ elif isinstance(m, tuple):
mtype = m[0]
if mtype == 'builtin':
if m[2] & MA_PREFIX:
@@ -238,6 +238,7 @@
else:
m[1]()
else: raise 'Unknown meaning type in', `Meaning[tok]`
+ else: raise 'Unknown meaning format for', tok
else: raise 'bad token', tok
Regstack = []
@@ -245,6 +246,7 @@
MA_PREFIX = 1
Meaning = {'reg': Generic_Register,
+ '...': Unique('...'),
'tetras': ['dup', '+', 'dup', '+'], # FIXME
}
for m in 'any const int lit sum sym'.split(' '):
|