瀏覽代碼

empty statement sequence before RETURN is a valid case

Vladislav Folts 12 年之前
父節點
當前提交
3cbba535a7
共有 4 個文件被更改,包括 28 次插入14 次删除
  1. 1 1
      src/lexer.js
  2. 7 0
      test/expected/proc.js
  3. 6 0
      test/input/proc.ob
  4. 14 13
      test/test_unit.js

+ 1 - 1
src/lexer.js

@@ -72,7 +72,7 @@ exports.ident = function(stream, context){
 		return true;
 		return true;
 	});
 	});
 
 
-	var keywords = ["ARRAY", "END", "VAR", "TYPE", "IF", "CASE", "WHILE", "REPEAT", "FOR", "NIL", "TRUE", "FALSE", "IS"];
+	var keywords = ["ARRAY", "END", "VAR", "TYPE", "IF", "CASE", "WHILE", "REPEAT", "FOR", "RETURN", "NIL", "TRUE", "FALSE", "IS"];
 	if (keywords.indexOf(result) != -1){
 	if (keywords.indexOf(result) != -1){
 		stream.setPos(savePos);
 		stream.setPos(savePos);
 		return false;
 		return false;

+ 7 - 0
test/expected/proc.js

@@ -54,4 +54,11 @@ function p4(){
 function p5(){
 function p5(){
 	return p5;
 	return p5;
 }
 }
+
+function emptyBegin(){
+}
+
+function emptyBeginWithReturn(){
+	return 0;
+}
 }();
 }();

+ 6 - 0
test/input/proc.ob

@@ -41,4 +41,10 @@ PROCEDURE p5(): P2;
 	RETURN p5
 	RETURN p5
 END p5;
 END p5;
 
 
+PROCEDURE emptyBegin; BEGIN END emptyBegin;
+PROCEDURE emptyBeginWithReturn(): INTEGER;
+BEGIN 
+	RETURN 0 
+END emptyBeginWithReturn;
+
 END m.
 END m.

+ 14 - 13
test/test_unit.js

@@ -778,19 +778,20 @@ procedure: function(){
 
 
     test.parse("PROCEDURE p(): ProcType; RETURN p END p");
     test.parse("PROCEDURE p(): ProcType; RETURN p END p");
 },
 },
-"procedure RETURN": function(){
-    var test = setupWithContext(Grammar.procedureDeclaration
-                              , "VAR i: INTEGER; PROCEDURE int(): INTEGER; RETURN 1 END int;");
-    test.parse("PROCEDURE p(): BOOLEAN; RETURN TRUE END p");
-    test.parse("PROCEDURE p(): BOOLEAN; RETURN int() = 1 END p");
-    test.expectError("PROCEDURE p; RETURN TRUE END p"
-                   , "unexpected RETURN in PROCEDURE declared with no result type");
-    test.expectError("PROCEDURE p(): BOOLEAN; END p", "RETURN expected at the end of PROCEDURE declared with 'BOOLEAN' result type");
-    test.expectError("PROCEDURE p(): undeclared; END p", "undeclared identifier: 'undeclared'");
-    test.expectError("PROCEDURE p(): i; END p", "type name expected");
-    test.expectError("PROCEDURE p(): INTEGER; RETURN TRUE END p"
-                   , "RETURN 'INTEGER' expected, got 'BOOLEAN'");
-},
+"procedure RETURN": testWithContext(
+    context(Grammar.procedureDeclaration,
+            "VAR i: INTEGER; PROCEDURE int(): INTEGER; RETURN 1 END int;"),
+    pass("PROCEDURE p(): BOOLEAN; RETURN TRUE END p",
+         "PROCEDURE p(): BOOLEAN; RETURN int() = 1 END p",
+         "PROCEDURE p; BEGIN END p",
+         "PROCEDURE p(): INTEGER; BEGIN RETURN 0 END p"),
+    fail(["PROCEDURE p; RETURN TRUE END p", "unexpected RETURN in PROCEDURE declared with no result type"],
+         ["PROCEDURE p(): BOOLEAN; END p", "RETURN expected at the end of PROCEDURE declared with 'BOOLEAN' result type"],
+         ["PROCEDURE p(): undeclared; END p", "undeclared identifier: 'undeclared'"],
+         ["PROCEDURE p(): i; END p", "type name expected"],
+         ["PROCEDURE p(): INTEGER; RETURN TRUE END p", "RETURN 'INTEGER' expected, got 'BOOLEAN'"]
+         )
+),
 "PROCEDURE relations": testWithContext(
 "PROCEDURE relations": testWithContext(
     context(Grammar.expression,
     context(Grammar.expression,
             "VAR p1: PROCEDURE; p2: PROCEDURE;"),
             "VAR p1: PROCEDURE; p2: PROCEDURE;"),