Quellcode durchsuchen

eberon: methods in process

Vladislav Folts vor 11 Jahren
Ursprung
Commit
3343c8bfb2
4 geänderte Dateien mit 52 neuen und 22 gelöschten Zeilen
  1. 18 2
      src/eberon/eberon_grammar.js
  2. 3 6
      src/grammar.js
  3. 19 2
      src/oberon/oberon_grammar.js
  4. 12 12
      test/test_unit.js

+ 18 - 2
src/eberon/eberon_grammar.js

@@ -1,4 +1,20 @@
-var grammar = require("grammar.js");
+"use strict";
 
-exports.grammar = grammar.make(grammar.makeProcedureDeclaration);
+var Context = require("context.js");
+var Grammar = require("grammar.js");
+var Parser = require("parser.js");
 
+var and = Parser.and;
+var context = Parser.context;
+var optional = Parser.optional;
+
+var procedureHeading = and("PROCEDURE"
+                         , and(optional(and(Grammar.ident, ".")), Grammar.identdef)
+                         , context(optional(Grammar.formalParameters), Context.FormalParametersProcDecl));
+
+function makeProcedureDeclaration(procedureBody){
+    return Grammar.makeProcedureDeclaration(procedureHeading, procedureBody);
+}
+
+exports.grammar = Grammar.make(makeProcedureDeclaration);
+exports.grammar.procedureHeading = procedureHeading;

+ 3 - 6
src/grammar.js

@@ -156,11 +156,7 @@ var procedureType = and("PROCEDURE"
 var strucType = or(arrayType, recordType, pointerType, procedureType);
 var typeDeclaration = context(and(identdef, "=", strucType), Context.TypeDeclaration);
 
-var procedureHeading = and("PROCEDURE"
-                         , identdef
-                         , context(optional(formalParameters), Context.FormalParametersProcDecl));
-
-exports.makeProcedureDeclaration = function(procedureBody){
+exports.makeProcedureDeclaration = function(procedureHeading, procedureBody){
     return context(and(procedureHeading, ";",
                        procedureBody,
                        ident),
@@ -202,8 +198,9 @@ function make(makeProcedureDeclaration){
 
 exports.make = make;
 exports.expression = expression;
+exports.formalParameters = formalParameters;
 exports.ident = ident;
-exports.procedureHeading = procedureHeading;
+exports.identdef = identdef;
 exports.statement = statement;
 exports.typeDeclaration = typeDeclaration;
 exports.variableDeclaration = variableDeclaration;

+ 19 - 2
src/oberon/oberon_grammar.js

@@ -1,4 +1,21 @@
-var grammar = require("grammar.js");
+"use strict";
 
-exports.grammar = grammar.make(grammar.makeProcedureDeclaration);
+var Context = require("context.js");
+var Grammar = require("grammar.js");
+var Parser = require("parser.js");
+
+var and = Parser.and;
+var context = Parser.context;
+var optional = Parser.optional;
+
+var procedureHeading = and("PROCEDURE"
+                         , Grammar.identdef
+                         , context(optional(Grammar.formalParameters), Context.FormalParametersProcDecl));
+
+function makeProcedureDeclaration(procedureBody){
+    return Grammar.makeProcedureDeclaration(procedureHeading, procedureBody);
+}
+
+exports.grammar = Grammar.make(makeProcedureDeclaration);
+exports.grammar.procedureHeading = procedureHeading;
 

+ 12 - 12
test/test_unit.js

@@ -688,18 +688,6 @@ var testSuite = {
          ["EXCL(set1, -1)", "value (0..31) expected as a second argument of EXCL, got -1"]
         )
     ),
-"procedure heading": testWithSetup(
-    function(){
-        function innerMakeContext(cx){
-            return new Context.ProcDecl(TestUnitCommon.makeContext());}
-        return setupParser(Grammar.procedureHeading, innerMakeContext);
-    },
-    pass("PROCEDURE p",
-         "PROCEDURE p(a1: INTEGER)",
-         "PROCEDURE p(a1, a2: INTEGER; b1: BOOLEAN)"),
-    fail(["PROCEDURE p(a1: INTEGER; a1: BOOLEAN)", "'a1' already declared"],
-         ["PROCEDURE p(p: INTEGER)", "argument 'p' has the same name as procedure"])
-    ),
 "PROCEDURE relations": testWithContext(
     context(Grammar.expression,
             "VAR p1: PROCEDURE; p2: PROCEDURE;"),
@@ -1050,6 +1038,18 @@ function makeSuiteForGrammar(grammar){
          "VAR a: ARRAY 10, 5 OF BOOLEAN; BEGIN a[0][0] := TRUE END",
          "VAR a: ARRAY 10, 5 OF BOOLEAN; BEGIN a[0, 0] := TRUE END")
     ),
+"procedure heading": testWithSetup(
+    function(){
+        function innerMakeContext(cx){
+            return new Context.ProcDecl(TestUnitCommon.makeContext());}
+        return setupParser(grammar.procedureHeading, innerMakeContext);
+    },
+    pass("PROCEDURE p",
+         "PROCEDURE p(a1: INTEGER)",
+         "PROCEDURE p(a1, a2: INTEGER; b1: BOOLEAN)"),
+    fail(["PROCEDURE p(a1: INTEGER; a1: BOOLEAN)", "'a1' already declared"],
+         ["PROCEDURE p(p: INTEGER)", "argument 'p' has the same name as procedure"])
+    ),
 "procedure body": testWithGrammar(
     grammar.procedureBody,
     pass("END",