#!/usr/bin/env python """A preprocessor for Python scripts implementing the *detect* statement. Uses blockparser.py. TODO: Use class exceptions instead of string exceptions.""" import blockparser from types import ListType, StringType from string import strip from re import sub def process(block, inDetect=0, extraIndent=0): def eventReplacement(matchObject): return "raise "+matchObject.group(1) lineNum = 0 while lineNum < len(block): element = block[lineNum] if type(element) == StringType: indent = blockparser.getIndent(element) if strip(element)[:6] == 'detect': events = strip(strip(element)[6:-1]) del block[lineNum] block[lineNum:lineNum] = [' '*(indent+extraIndent) +'try:', ' '*(indent+extraIndent) +' while 1:'] lineNum = lineNum+2 process(block[lineNum], 1, extraIndent+4) lineNum = lineNum+1 block[lineNum:lineNum] = [' '*(indent+extraIndent)+ "except ("+events+"): pass"] else: if extraIndent != 0: block[lineNum] = ' '*extraIndent+block[lineNum] block[lineNum] = sub(r"(?=\s*)('[^']*')", eventReplacement, block[lineNum]) else: process(element, inDetect, extraIndent) lineNum = lineNum+1 return block def output(structure): result = "" for element in structure: if type(element) == ListType: result = result + output(element) else: result = result + element + "\n" return result if __name__=="__main__": import sys structure = blockparser.parse(sys.argv[1]) structure = process(structure) print output(structure)