Commit 6837c592 authored by Robert Griesemer's avatar Robert Griesemer

- initial better error reporting

SVN=126578
parent 92bb6762
...@@ -64,7 +64,7 @@ func (P *Parser) Open(S *Scanner.Scanner, verbose int) { ...@@ -64,7 +64,7 @@ func (P *Parser) Open(S *Scanner.Scanner, verbose int) {
func (P *Parser) Error(msg string) { func (P *Parser) Error(msg string) {
panic "error: ", msg, "\n"; P.S.Error(P.S.pos, msg);
P.Next(); // make progress P.Next(); // make progress
} }
......
...@@ -376,11 +376,39 @@ func Init () { ...@@ -376,11 +376,39 @@ func Init () {
} }
// Compute (line, column) information for a given source position.
func (S *Scanner) LineCol(pos int) (line, col int) {
line = 1;
lpos := 0;
src := S.src;
if pos > len(src) {
pos = len(src);
}
for i := 0; i < pos; i++ {
if src[i] != '\n' {
line++;
lpos = i;
}
}
return line, pos - lpos;
}
func (S *Scanner) Error(pos int, msg string) {
line, col := S.LineCol(pos);
print "error ", line, ":", col, ": ", msg, "\n";
}
func (S *Scanner) Open (src string) { func (S *Scanner) Open (src string) {
if Keywords == nil { if Keywords == nil {
Init(); Init();
} }
//S.nerrors = 0;
S.src = src; S.src = src;
S.pos = 0; S.pos = 0;
S.Next(); S.Next();
...@@ -389,9 +417,9 @@ func (S *Scanner) Open (src string) { ...@@ -389,9 +417,9 @@ func (S *Scanner) Open (src string) {
func (S *Scanner) Expect (ch int) { func (S *Scanner) Expect (ch int) {
if S.ch != ch { if S.ch != ch {
panic "expected ", string(ch), " found ", string(S.ch); S.Error(S.pos, "expected " + string(ch) + ", found " + string(S.ch));
} }
S.Next(); S.Next(); // make always progress
} }
...@@ -412,6 +440,7 @@ func (S *Scanner) SkipComment () { ...@@ -412,6 +440,7 @@ func (S *Scanner) SkipComment () {
} else { } else {
/* comment */ /* comment */
pos := S.pos;
S.Next(); S.Next();
for S.ch >= 0 { for S.ch >= 0 {
ch := S.ch; ch := S.ch;
...@@ -421,7 +450,7 @@ func (S *Scanner) SkipComment () { ...@@ -421,7 +450,7 @@ func (S *Scanner) SkipComment () {
return; return;
} }
} }
panic "comment not terminated"; S.Error(pos, "comment not terminated");
} }
} }
...@@ -505,7 +534,7 @@ func (S *Scanner) ScanDigits(n int, base int) { ...@@ -505,7 +534,7 @@ func (S *Scanner) ScanDigits(n int, base int) {
n--; n--;
} }
if n > 0 { if n > 0 {
panic "illegal char escape"; S.Error(S.pos, "illegal char escape");
} }
} }
...@@ -536,7 +565,7 @@ func (S *Scanner) ScanEscape () string { ...@@ -536,7 +565,7 @@ func (S *Scanner) ScanEscape () string {
return ""; // TODO fix this return ""; // TODO fix this
default: default:
panic "illegal char escape"; S.Error(S.pos, "illegal char escape");
} }
} }
...@@ -558,11 +587,12 @@ func (S *Scanner) ScanChar () int { ...@@ -558,11 +587,12 @@ func (S *Scanner) ScanChar () int {
func (S *Scanner) ScanString () int { func (S *Scanner) ScanString () int {
// '"' already consumed // '"' already consumed
pos := S.pos - 1; // TODO maybe incorrect (Unicode)
for S.ch != '"' { for S.ch != '"' {
ch := S.ch; ch := S.ch;
S.Next(); S.Next();
if ch == '\n' || ch < 0 { if ch == '\n' || ch < 0 {
panic "string not terminated"; S.Error(pos, "string not terminated");
} }
if ch == '\\' { if ch == '\\' {
S.ScanEscape(); S.ScanEscape();
...@@ -577,11 +607,12 @@ func (S *Scanner) ScanString () int { ...@@ -577,11 +607,12 @@ func (S *Scanner) ScanString () int {
func (S *Scanner) ScanRawString () int { func (S *Scanner) ScanRawString () int {
// '`' already consumed // '`' already consumed
pos := S.pos - 1; // TODO maybe incorrect (Unicode)
for S.ch != '`' { for S.ch != '`' {
ch := S.ch; ch := S.ch;
S.Next(); S.Next();
if ch == '\n' || ch < 0 { if ch == '\n' || ch < 0 {
panic "string not terminated"; S.Error(pos, "string not terminated");
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment