[Wisp-cvs] wisp/users/dig interpreter.py,1.7,1.8 tran-builtins,1.22,1.23 tran.py,1.96,1.97
Status: Alpha
Brought to you by:
digg
From: <di...@us...> - 2003-05-17 12:50:52
|
Update of /cvsroot/wisp/wisp/users/dig In directory sc8-pr-cvs1:/tmp/cvs-serv11083 Modified Files: interpreter.py tran-builtins tran.py Log Message: made interpreter.py importable Index: interpreter.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/interpreter.py,v retrieving revision 1.7 retrieving revision 1.8 diff -u -d -r1.7 -r1.8 --- interpreter.py 17 May 2003 12:29:16 -0000 1.7 +++ interpreter.py 17 May 2003 12:50:49 -0000 1.8 @@ -6,7 +6,14 @@ # #### @(#) $Id$ -# Not yet importable! +from __future__ import generators, nested_scopes + +from linkie import Linkie +from shlex import shlex +import string + +def abstract (this, *arg, **narg): + raise 'abstract method was called', (this, arg, narg) def simplest_summable (scalar, symbols, registers): if len(symbols) == len(registers) == 0: @@ -123,11 +130,11 @@ this.current += 1 return datum -class Preprocessor (Lexer): +class Preprocessor (Token_Source): __slots__ = ['tss'] - def __init__ (this, filename): - Lexer.__init__(this, filename) - this.tss = [] + def __init__ (this, toksrc): + object.__init__(this) + this.tss = [toksrc] def push (this, toksrc): this.tss.append(toksrc) def get_token (this): @@ -135,8 +142,7 @@ 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) + return tok class Register (tuple, Stackable): def __new__ (cls, items, names = None): @@ -213,7 +219,7 @@ return um class Interpreter (object): - __slots__ = 'sections current recordee regpaths hanging regstack state meaning register_names'.split() + __slots__ = 'sections current recordee regpaths hanging regstack state meaning register_names toksrc'.split() universal_meaning = make_universal_meaning('tran-builtins') def make_section_switcher (this, name): @@ -237,6 +243,7 @@ this.hanging = {} this.regstack = [] this.state = this.outer_state + this.toksrc = None # only used during interpretation def match_generator (this, root): yield root if len(this.regstack) < 1: yield None # want more registers @@ -269,13 +276,13 @@ except StopIteration: raise 'meaningless word', root m = this.meaning[tok] - if isinstance(m, list): prep.push(Macro_Cursor(m)) + if isinstance(m, list): this.toksrc.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() + tok = this.toksrc.get_token() if not isinstance(tok, str): raise 'word expected', tok m[1](this, tok) else: @@ -283,4 +290,12 @@ else: raise 'Unknown meaning type in', `this.meaning[tok]` else: raise 'Unknown meaning format for', tok else: raise 'bad token', tok - + def run (this, toksrc, verbose = 0): + this.toksrc = Preprocessor(toksrc) + tok = this.toksrc.get_token() + while tok <> None: + if verbose: + print '(%s) %s' % (' '.join(map(str, this.regstack)), tok) + this.state(tok) + tok = this.toksrc.get_token() + this.toksrc = None Index: tran-builtins =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran-builtins,v retrieving revision 1.22 retrieving revision 1.23 diff -u -d -r1.22 -r1.23 --- tran-builtins 17 May 2003 12:12:53 -0000 1.22 +++ tran-builtins 17 May 2003 12:50:49 -0000 1.23 @@ -129,7 +129,7 @@ commit interpreter.regstack.reverse() - prep.push(Macro_Cursor(['$push'] * len(interpreter.regstack))) + interpreter.toksrc.push(Macro_Cursor(['$push'] * len(interpreter.regstack))) drop any interpreter.regstack.pop() @@ -144,7 +144,7 @@ interpreter.regstack.append(Integer_Literal(interpreter.regstack.pop()[-1])) include|name - prep.push_file(str(name) + '.tran') + interpreter.toksrc.push(Lexer(str(name) + '.tran')) ref|name interpreter.regstack.append(Symbol_Literal('&' + name)) Index: tran.py =================================================================== RCS file: /cvsroot/wisp/wisp/users/dig/tran.py,v retrieving revision 1.96 retrieving revision 1.97 diff -u -d -r1.96 -r1.97 --- tran.py 17 May 2003 12:12:53 -0000 1.96 +++ tran.py 17 May 2003 12:50:49 -0000 1.97 @@ -12,18 +12,12 @@ from __future__ import nested_scopes from getopt import getopt -from linkie import Linkie -from shlex import shlex +from interpreter import Lexer, Interpreter, Preprocessor import elf import pe import string import sys -def abstract (this, *arg, **narg): - raise 'abstract method was called', this - -exec open('interpreter.py') - interpreter = Interpreter('<', ['.text', '.data', '.bss']) default_output_names = {'elf': 'a.out', 'pe': 'untitled.exe'} @@ -31,7 +25,7 @@ format = 'elf' def main (): - global prep, verbose, format + global verbose, format opts, args = getopt(sys.argv[1:], 'vo:b:f:', ['verbose', 'output=', 'base=', 'format=', 'list-words']) output_name = None @@ -56,12 +50,7 @@ print ' ', ' '.join(w) if len(args) != 1: raise 'Invalid argument count -- must be 1', args - prep = Preprocessor(args[0]) - tok = prep.get_token() - while tok <> None: - if verbose: print '(%s) %s' % (' '.join(map(str, interpreter.regstack)), tok) - interpreter.state(tok) - tok = prep.get_token() + interpreter.run(Lexer(args[0]), verbose = verbose) interpreter.sections['.text'].dump(title = 'TEXT') interpreter.sections['.data'].dump(title = 'DATA') interpreter.sections['.bss'].dump(title = 'BSS') |