annotate python/ppci/errors.py @ 248:b10d46e5c8dd

ide refactor
author Windel Bouwman
date Fri, 26 Jul 2013 16:46:02 +0200
parents 1c7364bd74c7
children 6ed3d3a82a63
rev   line source
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
1 """
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
2 Error handling routines
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
3 Diagnostic utils
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
4 """
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
5
194
b01429a5d695 Fixed test
Windel Bouwman
parents: 191
diff changeset
6 from . import SourceLocation
b01429a5d695 Fixed test
Windel Bouwman
parents: 191
diff changeset
7
152
b73bc14a3aa3 Light coupling ide and c3 frontend
Windel Bouwman
parents: 148
diff changeset
8 class CompilerError(Exception):
200
5e391d9a3381 Split off asm nodes
Windel Bouwman
parents: 194
diff changeset
9 def __init__(self, msg, loc=None):
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 182
diff changeset
10 self.msg = msg
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 182
diff changeset
11 self.loc = loc
200
5e391d9a3381 Split off asm nodes
Windel Bouwman
parents: 194
diff changeset
12 if loc:
5e391d9a3381 Split off asm nodes
Windel Bouwman
parents: 194
diff changeset
13 assert type(loc) is SourceLocation, '{0} must be SourceLocation'.format(type(loc))
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
14 self.row = loc.row
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
15 self.col = loc.col
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
16 else:
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
17 self.row = self.col = None
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
18
191
6b2bec5653f1 Added assembler testset
Windel Bouwman
parents: 182
diff changeset
19 def __repr__(self):
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
20 if self.row:
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
21 return 'Compilererror: "{0}" at row {1}'.format(self.msg, self.row)
200
5e391d9a3381 Split off asm nodes
Windel Bouwman
parents: 194
diff changeset
22 else:
5e391d9a3381 Split off asm nodes
Windel Bouwman
parents: 194
diff changeset
23 return 'Compilererror: "{0}"'.format(self.msg)
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
24
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
25 def printError(source, e):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
26 def printLine(row, txt):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
27 print(str(row)+':'+txt)
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
28 if e.loc.row == 0:
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
29 print('Error: {0}'.format(e.msg))
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
30 else:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
31 lines = source.split('\n')
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
32 ro, co = e.row, e.col
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
33 prerow = ro - 2
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
34 if prerow < 1:
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
35 prerow = 1
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
36 afterrow = ro + 3
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
37 if afterrow > len(lines):
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
38 afterrow = len(lines)
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
39
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
40 # print preceding source lines:
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
41 for r in range(prerow, ro):
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
42 printLine(r, lines[r-1])
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
43 # print source line containing error:
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
44 printLine(ro, lines[ro-1])
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
45 print(' '*(len(str(ro)+':')+co-1) + '^ Error: {0}'.format(e.msg))
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
46 # print trailing source line:
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
47 for r in range(ro+1, afterrow+1):
1
92df07bc2081 Initial import of compiler
windel
parents:
diff changeset
48 printLine(r, lines[r-1])
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
49
152
b73bc14a3aa3 Light coupling ide and c3 frontend
Windel Bouwman
parents: 148
diff changeset
50 class DiagnosticsManager:
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
51 def __init__(self):
248
b10d46e5c8dd ide refactor
Windel Bouwman
parents: 225
diff changeset
52 self.diags = []
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
53
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
54 def addDiag(self, d):
248
b10d46e5c8dd ide refactor
Windel Bouwman
parents: 225
diff changeset
55 self.diags.append(d)
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
56
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
57 def error(self, msg, loc):
248
b10d46e5c8dd ide refactor
Windel Bouwman
parents: 225
diff changeset
58 self.addDiag(CompilerError(msg, loc))
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
59
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
60 def clear(self):
248
b10d46e5c8dd ide refactor
Windel Bouwman
parents: 225
diff changeset
61 del self.diags[:]
215
c1ccb1cb4cef Major changes in c3 frontend
Windel Bouwman
parents: 200
diff changeset
62
225
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
63 def printErrors(self, src):
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
64 if len(self.diags) > 0:
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
65 print('==============')
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
66 print('{0} Errors'.format(len(self.diags)))
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
67 for d in self.diags:
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
68 print('==============')
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
69 printError(src, d)
1c7364bd74c7 Fixed pointer deref
Windel Bouwman
parents: 215
diff changeset
70 print('==============')
148
e5263f74b287 Added c3 language frontend initial parser
Windel Bouwman
parents: 147
diff changeset
71