ソースを参照

improve compile error messages

Vladislav Folts 12 年 前
コミット
10c89b1043
5 ファイル変更15 行追加8 行削除
  1. 7 3
      browser/oberonjs.html
  2. 1 1
      src/oc.js
  3. 1 4
      src/parser.js
  4. 1 0
      test/expected/errors/syntax.txt
  5. 5 0
      test/input/errors/syntax.ob

+ 7 - 3
browser/oberonjs.html

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

+ 1 - 1
src/oc.js

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

+ 1 - 4
src/parser.js

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