Forráskód Böngészése

syantax relxation: allow semicolon after RETURN

Vladislav Folts 10 éve
szülő
commit
03c7f2e9c1

BIN
bin/compiled.zip


+ 5 - 0
src/eberon/eberon_grammar.js

@@ -90,6 +90,10 @@ function makeFormalArray(){
     return and("ARRAY", optional("*"), "OF");
 }
 
+function makeReturn(base){
+    return and(base, optional(";"));
+}
+
 exports.language = {
     grammar: Grammar.make(
         makeIdentdef,
@@ -101,6 +105,7 @@ exports.language = {
         makeForInit,
         makeArrayDimensions,
         makeFormalArray,
+        makeReturn,
         { 
             constDeclaration:   EbContext.ConstDecl, 
             typeDeclaration:    EbContext.TypeDeclaration,

+ 2 - 1
src/grammar.js

@@ -31,6 +31,7 @@ function make(makeIdentdef,
               makeForInit,
               makeArrayDimensions,
               makeFormalArray,
+              makeReturn,
               contexts,
               reservedWords
               ){
@@ -211,7 +212,7 @@ result.declarationSequence
 result.procedureBody
     = and(result.declarationSequence,
           optional(and("BEGIN", statementSequence)),
-          optional(context(and("RETURN", expression), contexts.Return)),
+          optional(context(makeReturn(and("RETURN", expression)), contexts.Return)),
           required("END", "END expected (PROCEDURE)"));
 result.module
     = context(and("MODULE", ident, ";",

+ 3 - 0
src/oberon/oberon_grammar.js

@@ -70,6 +70,8 @@ function makeFormalArray(){
     return and("ARRAY", "OF");
 }
 
+function makeReturn(base){return base;}
+
 exports.language = {
     grammar: Grammar.make(
         makeIdentdef,
@@ -81,6 +83,7 @@ exports.language = {
         makeForInit,
         makeArrayDimensions,
         makeFormalArray,
+        makeReturn,
         {
             constDeclaration:   Context.ConstDecl, 
             typeDeclaration:    Context.TypeDeclaration,

+ 5 - 1
test/test_unit_eberon.js

@@ -1034,6 +1034,10 @@ exports.suite = {
 "syntax relaxation": testWithGrammar(
     grammar.declarationSequence, 
     pass("PROCEDURE p; END;",
-         "TYPE T = RECORD field: INTEGER; END;")
+         "TYPE T = RECORD field: INTEGER; END;",
+         "TYPE T = RECORD PROCEDURE method(); END;",
+         "TYPE T = RECORD PROCEDURE method(); END; PROCEDURE T.method(); END;",
+         "PROCEDURE p(): INTEGER; RETURN 0; END;"
+         )
     )
 };

+ 2 - 1
test/test_unit_oberon.js

@@ -109,6 +109,7 @@ exports.suite = {
 "syntax strictness": testWithGrammar(
     grammar.procedureDeclaration,
     pass(),
-    fail(["TYPE T = RECORD field: INTEGER; END;", "not parsed"])
+    fail(["TYPE T = RECORD field: INTEGER; END;", "not parsed"],
+         ["PROCEDURE p(): INTEGER; RETURN 0; END;", "END expected (PROCEDURE)"])
     )
 };