Mercurial Hosting > luan
annotate src/goodjava/parser/ParseException.java @ 1824:92860f763715
smtpcorp change
author | Franklin Schmidt <fschmidt@gmail.com> |
---|---|
date | Mon, 19 Aug 2024 19:34:24 -0400 |
parents | 764723436f05 |
children |
rev | line source |
---|---|
1402
27efb1fcbcb5
move luan.lib to goodjava
Franklin Schmidt <fschmidt@gmail.com>
parents:
1114
diff
changeset
|
1 package goodjava.parser; |
585 | 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 | |
1110
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
9 public ParseException(Parser parser,String msg) { |
585 | 10 super(msg); |
11 this.text = parser.text; | |
12 this.errorIndex = parser.currentIndex(); | |
13 this.highIndex = parser.highIndex(); | |
14 } | |
15 | |
1110
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
16 public ParseException(Parser parser,Exception cause) { |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
17 this(parser,cause.getMessage(),cause); |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
18 } |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
19 |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
20 public ParseException(Parser parser,String msg,Exception cause) { |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
21 super(msg,cause); |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
22 this.text = parser.text; |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
23 this.errorIndex = parser.currentIndex(); |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
24 this.highIndex = parser.highIndex(); |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
25 } |
38a42f437fd2
queryparser now uses parsers.Parser
Franklin Schmidt <fschmidt@gmail.com>
parents:
775
diff
changeset
|
26 |
585 | 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 | |
1774
764723436f05
better json_parse exception
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
50 public String getSuperMessage() { |
764723436f05
better json_parse exception
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
51 return super.getMessage(); |
764723436f05
better json_parse exception
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
52 } |
764723436f05
better json_parse exception
Franklin Schmidt <fschmidt@gmail.com>
parents:
1402
diff
changeset
|
53 |
585 | 54 @Override public String getMessage() { |
1114
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
55 String line; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
56 int pos; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
57 StringBuilder sb = new StringBuilder(super.getMessage()); |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
58 if( text.indexOf('\n') == -1 ) { |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
59 line = text; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
60 pos = errorIndex; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
61 sb.append( " (position " + (pos+1) + ")\n" ); |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
62 } else { |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
63 Location loc = new Location(errorIndex); |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
64 line = lines()[loc.line]; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
65 pos = loc.pos; |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
66 sb.append( " (line " + (loc.line+1) + ", pos " + (pos+1) + ")\n" ); |
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
67 } |
585 | 68 sb.append( line + "\n" ); |
1114
540e1940170f
improve ParseException
Franklin Schmidt <fschmidt@gmail.com>
parents:
1111
diff
changeset
|
69 for( int i=0; i<pos; i++ ) { |
585 | 70 sb.append( line.charAt(i)=='\t' ? '\t' : ' ' ); |
71 } | |
72 sb.append("^\n"); | |
73 return sb.toString(); | |
74 } | |
75 } |