comparison src/goodjava/parser/ParseException.java @ 1402:27efb1fcbcb5

move luan.lib to goodjava
author Franklin Schmidt <fschmidt@gmail.com>
date Tue, 17 Sep 2019 01:35:01 -0400
parents src/luan/lib/parser/ParseException.java@540e1940170f
children 764723436f05
comparison
equal deleted inserted replaced
1401:ef1620aa99cb 1402:27efb1fcbcb5
1 package goodjava.parser;
2
3
4 public final class ParseException extends Exception {
5 public final String text;
6 public final int errorIndex;
7 public final int highIndex;
8
9 public ParseException(Parser parser,String msg) {
10 super(msg);
11 this.text = parser.text;
12 this.errorIndex = parser.currentIndex();
13 this.highIndex = parser.highIndex();
14 }
15
16 public ParseException(Parser parser,Exception cause) {
17 this(parser,cause.getMessage(),cause);
18 }
19
20 public ParseException(Parser parser,String msg,Exception cause) {
21 super(msg,cause);
22 this.text = parser.text;
23 this.errorIndex = parser.currentIndex();
24 this.highIndex = parser.highIndex();
25 }
26
27 private class Location {
28 final int line;
29 final int pos;
30
31 Location(int index) {
32 int line = 0;
33 int i = -1;
34 while(true) {
35 int j = text.indexOf('\n',i+1);
36 if( j == -1 || j >= index )
37 break;
38 i = j;
39 line++;
40 }
41 this.line = line;
42 this.pos = index - i - 1;
43 }
44 }
45
46 private String[] lines() {
47 return text.split("\n",-1);
48 }
49
50 @Override public String getMessage() {
51 String line;
52 int pos;
53 StringBuilder sb = new StringBuilder(super.getMessage());
54 if( text.indexOf('\n') == -1 ) {
55 line = text;
56 pos = errorIndex;
57 sb.append( " (position " + (pos+1) + ")\n" );
58 } else {
59 Location loc = new Location(errorIndex);
60 line = lines()[loc.line];
61 pos = loc.pos;
62 sb.append( " (line " + (loc.line+1) + ", pos " + (pos+1) + ")\n" );
63 }
64 sb.append( line + "\n" );
65 for( int i=0; i<pos; i++ ) {
66 sb.append( line.charAt(i)=='\t' ? '\t' : ' ' );
67 }
68 sb.append("^\n");
69 return sb.toString();
70 }
71 }