view python/ppci/errors.py @ 148:e5263f74b287

Added c3 language frontend initial parser
author Windel Bouwman
date Fri, 01 Mar 2013 10:24:01 +0100
parents 4e79484a9d47
children b73bc14a3aa3
line wrap: on
line source

""" 
   Error handling routines 
   Diagnostic utils
"""

from collections import namedtuple

SourceLocation = namedtuple('SourceLocation', ['row', 'col'])
SourceRange = namedtuple('SourceRange', ['p1', 'p2'])

class CompilerException(Exception):
  def __init__(self, msg, loc):
    self.msg = msg
    self.loc = loc
  def __repr__(self):
     return 'error {0} at {1}'.format(self.msg, self.loc)
  def __str__(self):
     return 'error {0} at {1}'.format(self.msg, self.loc)

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.loc.row == 0:
        print('Error: {0}'.format(e.msg))
     else:
        lines = source.split('\n')
        ro, co = e.loc.row, e.loc.col
        prerow = ro - 2
        if prerow < 1:
           prerow = 1
        afterrow = ro + 3
        if afterrow > len(lines):
           afterrow = len(lines)

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

class Diagnostics:
   def __init__(self):
      self.diags = []
   def diag(self, d):
      self.diags.append(d)