view ide/compiler/errors.py @ 26:dcce92b1efbc

Added mm.c
author windel
date Tue, 27 Dec 2011 17:36:52 +0100
parents de004f808e56
children
line wrap: on
line source

""" Error handling routines """

class CompilerException(Exception):
  def __init__(self, msg, row=0, col=0, filename=None):
    self.msg = msg
    self.row = row
    self.col = col
    self.filename = filename
  def __repr__(self):
     return self.msg
  def __str__(self):
     return self.msg

class ErrorNode:
   def __init__(self, row, col, msg):
      self.row, self.col = row,col
      self.msg = msg

def Error(msg, node=None):
   if node is None:
      raise CompilerException(msg)
   else:
      raise CompilerException(msg, node.row, node.col)

def printError(source, e):
     def printLine(row, txt):
        print(str(row)+':'+txt)
     if e.row == 0:
        print('Error: {0}'.format(e.msg))
     else:
        lines = source.split('\n')
        prerow = e.row - 3
        if prerow < 1:
           prerow = 1
        afterrow = e.row + 3
        if afterrow > len(lines):
           afterrow = len(lines)

        # print preceding source lines:
        for r in range(prerow, e.row):
           printLine(r, lines[r-1])
        # print source line containing error:
        printLine(e.row, lines[e.row-1])
        print(' '*(len(str(e.row)+':')+e.col-1) + '^ Error: {0}'.format(e.msg))
        # print trailing source line:
        for r in range(e.row+1, afterrow+1):
          printLine(r, lines[r-1])