2
0
Эх сурвалжийг харах

improve compile error messages

Vladislav Folts 12 жил өмнө
parent
commit
10c89b1043

+ 7 - 3
browser/oberonjs.html

@@ -33,15 +33,19 @@ function require(){}
 <script>
 <script>
 function compile(){
 function compile(){
 	var src = document.getElementById("source").value;
 	var src = document.getElementById("source").value;
-	var result = "";
+	var result;
 	var errors = "";
 	var errors = "";
 	try {
 	try {
-		result = require("oc.js").compile(src);
+		result = require("oc.js").compile(src, function(e){
+			errors += e;
+		});
 		}
 		}
 	catch (e) {
 	catch (e) {
-		errors = "" + e;
+		errors += e;
 		}
 		}
 
 
+	if (!result)
+		result = "";
 	document.getElementById("result").value = result;
 	document.getElementById("result").value = result;
 	document.getElementById("errors").textContent = errors;
 	document.getElementById("errors").textContent = errors;
 }
 }

+ 1 - 1
src/oc.js

@@ -10,7 +10,7 @@ exports.compile = function(text, handleErrors){
 	var context = new Context.Context();
 	var context = new Context.Context();
 	try {
 	try {
 		if (!Grammar.module(stream, context))
 		if (!Grammar.module(stream, context))
-			throw new Errors.Error("syntax error, position: " + stream.pos());
+			throw new Errors.Error("syntax error");
 	}
 	}
 	catch (x) {
 	catch (x) {
 		if (x instanceof Errors.Error) {
 		if (x instanceof Errors.Error) {

+ 1 - 4
src/parser.js

@@ -7,7 +7,6 @@ exports.and = function(/*...*/){
 	assert(args.length >= 2);
 	assert(args.length >= 2);
 
 
 	return function(stream, context){
 	return function(stream, context){
-		var savePos = stream.pos();
 		for(var i = 0; i < args.length; ++i){
 		for(var i = 0; i < args.length; ++i){
 			if (i != 0)
 			if (i != 0)
 				Lexer.skipSpaces(stream, context);
 				Lexer.skipSpaces(stream, context);
@@ -16,10 +15,8 @@ exports.and = function(/*...*/){
 			if (typeof p == "string")
 			if (typeof p == "string")
 				p = Lexer.literal(p);
 				p = Lexer.literal(p);
 			
 			
-			if (!p(stream, context)){
-				stream.setPos(savePos);
+			if (!p(stream, context))
 				return false;
 				return false;
-			}
 		}
 		}
 	 	return true;
 	 	return true;
 	}
 	}

+ 1 - 0
test/expected/errors/syntax.txt

@@ -0,0 +1 @@
+line 4: syntax error

+ 5 - 0
test/input/errors/syntax.ob

@@ -0,0 +1,5 @@
+MODULE m1;
+VAR i: INTEGER;
+BEGIN
+	i := 1; (* extra semicolon *)
+END m1.