occam-furtle 3.0.519 → 3.0.521
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/context/block.js +9 -1
- package/lib/context/file/furtle.js +60 -10
- package/lib/element/importBinding.js +58 -8
- package/lib/element/importStatement.js +5 -4
- package/lib/element/label.js +5 -4
- package/lib/element/parameters.js +5 -4
- package/lib/element/procedureCall.js +10 -4
- package/lib/element/reference.js +5 -4
- package/lib/element/type.js +5 -4
- package/lib/example/furtle/bnf.js +45 -31
- package/lib/example/furtle/entries.js +2 -2
- package/package.json +5 -5
- package/src/context/block.js +14 -0
- package/src/context/file/furtle.js +92 -14
- package/src/element/importBinding.js +98 -14
- package/src/element/importStatement.js +6 -4
- package/src/element/label.js +6 -4
- package/src/element/parameters.js +6 -4
- package/src/element/procedureCall.js +12 -3
- package/src/element/reference.js +6 -4
- package/src/element/type.js +6 -4
- package/src/example/furtle/bnf.js +44 -30
- package/src/example/furtle/entries.js +1 -1
|
@@ -5,6 +5,7 @@ import { Element } from "occam-languages";
|
|
|
5
5
|
import { define } from "../elements";
|
|
6
6
|
import { instantiateImportBinding } from "../process/instantiate";
|
|
7
7
|
import { labelFromJSON, labelToLabelJSON, referenceFromJSON, referenceToReferenceJSON } from "../utilities/json";
|
|
8
|
+
import {instantiate} from "../utilities/context";
|
|
8
9
|
|
|
9
10
|
export default define(class ImportBinding extends Element {
|
|
10
11
|
constructor(context, string, node, breakPoint, label, reference) {
|
|
@@ -22,11 +23,33 @@ export default define(class ImportBinding extends Element {
|
|
|
22
23
|
return this.reference;
|
|
23
24
|
}
|
|
24
25
|
|
|
25
|
-
|
|
26
|
+
getLabelledProcedureName() {
|
|
27
|
+
const labelName = this.label.getName(),
|
|
28
|
+
labelledProcedureName = labelName; ///
|
|
29
|
+
|
|
30
|
+
return labelledProcedureName;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
getReferencedProcedureName() {
|
|
26
34
|
const referenceName = this.reference.getName(),
|
|
27
|
-
|
|
35
|
+
referencedProcedureName = referenceName; ///
|
|
36
|
+
|
|
37
|
+
return referencedProcedureName;
|
|
38
|
+
}
|
|
28
39
|
|
|
29
|
-
|
|
40
|
+
isAllowed() {
|
|
41
|
+
const labelledProcedureName = this.getLabelledProcedureName(),
|
|
42
|
+
referencedProcedureName = this.getReferencedProcedureName(),
|
|
43
|
+
aliased = (labelledProcedureName !== referencedProcedureName);
|
|
44
|
+
|
|
45
|
+
return aliased;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
compareLablledProcedureName(labelledProcedureName) {
|
|
49
|
+
const labelName = this.label.getName(),
|
|
50
|
+
labelledProcedureNameCompares = (labelName === labelledProcedureName);
|
|
51
|
+
|
|
52
|
+
return labelledProcedureNameCompares;
|
|
30
53
|
}
|
|
31
54
|
|
|
32
55
|
verify(releaseName, context, forward, back) {
|
|
@@ -34,17 +57,73 @@ export default define(class ImportBinding extends Element {
|
|
|
34
57
|
|
|
35
58
|
context.trace(`Verifying the '${importBindingString}' import binding...`);
|
|
36
59
|
|
|
37
|
-
|
|
38
|
-
|
|
60
|
+
let procedureName,
|
|
61
|
+
procedurePresent;
|
|
62
|
+
|
|
63
|
+
const referencedProcedureName = this.getReferencedProcedureName();
|
|
39
64
|
|
|
40
|
-
|
|
65
|
+
procedureName = referencedProcedureName; ///
|
|
66
|
+
|
|
67
|
+
procedurePresent = context.isProcedurePresentByProcedureName(procedureName);
|
|
68
|
+
|
|
69
|
+
if (!procedurePresent) {
|
|
41
70
|
context.trace(`The '${procedureName}' procedure is not present.`);
|
|
42
71
|
|
|
43
72
|
return back();
|
|
44
73
|
}
|
|
45
74
|
|
|
46
|
-
const
|
|
75
|
+
const labelledProcedureName = this.getLabelledProcedureName();
|
|
76
|
+
|
|
77
|
+
procedureName = labelledProcedureName; ///
|
|
78
|
+
|
|
79
|
+
const aliased = this.isAllowed();
|
|
80
|
+
|
|
81
|
+
if (aliased) {
|
|
82
|
+
procedurePresent = context.isProcedurePresentByProcedureName(procedureName);
|
|
83
|
+
|
|
84
|
+
if (procedurePresent) {
|
|
85
|
+
context.trace(`The '${procedureName}' procedure is already present.`);
|
|
86
|
+
|
|
87
|
+
return back();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const importBindingPresent = context.isImportBindingPresentByLabelledProcedureName(labelledProcedureName);
|
|
92
|
+
|
|
93
|
+
if (importBindingPresent) {
|
|
94
|
+
const labelString = this.label.getString();
|
|
95
|
+
|
|
96
|
+
context.trace(`The '${importBindingString}' import binding's '${labelString}' label is already present...`);
|
|
97
|
+
|
|
98
|
+
return back();
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
procedureName = referencedProcedureName; ///
|
|
102
|
+
|
|
103
|
+
const procedure = context.findProcedureByProcedureName(procedureName),
|
|
104
|
+
releaseNameCompares = procedure.compareReleaseName(releaseName);
|
|
105
|
+
|
|
106
|
+
if (!releaseNameCompares) {
|
|
107
|
+
context.trace(`The '${procedureName}' procedure is not in the '${releaseName}' package.`);
|
|
108
|
+
|
|
109
|
+
return back();
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
const exported = procedure.isExported();
|
|
113
|
+
|
|
114
|
+
if (!exported) {
|
|
115
|
+
context.trace(`The '${procedureName}' procedure is not exported.`);
|
|
116
|
+
|
|
117
|
+
return back();
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const importBinding = this;
|
|
121
|
+
|
|
122
|
+
context.addImportBinding(importBinding);
|
|
123
|
+
|
|
124
|
+
context.debug(`...verified the '${importBindingString}' import binding.`);
|
|
47
125
|
|
|
126
|
+
return forward(context, back);
|
|
48
127
|
}
|
|
49
128
|
|
|
50
129
|
toJSON() {
|
|
@@ -68,13 +147,18 @@ export default define(class ImportBinding extends Element {
|
|
|
68
147
|
static name = "ImportBinding";
|
|
69
148
|
|
|
70
149
|
static fromJSON(json, context) {
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
150
|
+
let importBinding;
|
|
151
|
+
|
|
152
|
+
instantiate((context) => {
|
|
153
|
+
const { string } = json,
|
|
154
|
+
breakPoint = null,
|
|
155
|
+
importBindingNode = instantiateImportBinding(string, context),
|
|
156
|
+
label = labelFromJSON(json, context),
|
|
157
|
+
reference = referenceFromJSON(json, context),
|
|
158
|
+
node = importBindingNode; ///
|
|
159
|
+
|
|
160
|
+
importBinding = new ImportBinding(context, string, node, breakPoint, label, reference);
|
|
161
|
+
}, context);
|
|
78
162
|
|
|
79
163
|
return importBinding;
|
|
80
164
|
}
|
|
@@ -69,7 +69,9 @@ export default define(class ImportStatement extends Element {
|
|
|
69
69
|
static name = "ImportStatement";
|
|
70
70
|
|
|
71
71
|
static fromJSON(json, context) {
|
|
72
|
-
|
|
72
|
+
let importStatement;
|
|
73
|
+
|
|
74
|
+
instantiate((context) => {
|
|
73
75
|
const { string } = json,
|
|
74
76
|
importStatementNode = instantiateImportStatement(string, context),
|
|
75
77
|
node = importStatementNode, ///
|
|
@@ -79,9 +81,9 @@ export default define(class ImportStatement extends Element {
|
|
|
79
81
|
|
|
80
82
|
context = null;
|
|
81
83
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
return importStatement;
|
|
84
|
+
importStatement = new ImportStatement(context, string, node, breakPoint, releaseName, importBindings);
|
|
85
85
|
}, context);
|
|
86
|
+
|
|
87
|
+
return importStatement;
|
|
86
88
|
}
|
|
87
89
|
});
|
package/src/element/label.js
CHANGED
|
@@ -39,7 +39,9 @@ export default define(class Label extends Element {
|
|
|
39
39
|
static name = "Label";
|
|
40
40
|
|
|
41
41
|
static fromJSON(json, context) {
|
|
42
|
-
|
|
42
|
+
let label;
|
|
43
|
+
|
|
44
|
+
instantiate((context) => {
|
|
43
45
|
const { string } = json,
|
|
44
46
|
labelNode = instantiateLabel(string, context),
|
|
45
47
|
node = labelNode, ///
|
|
@@ -48,9 +50,9 @@ export default define(class Label extends Element {
|
|
|
48
50
|
|
|
49
51
|
context = null;
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return label;
|
|
53
|
+
label = new Label(context, string, node, breakPoint, name);
|
|
54
54
|
}, context);
|
|
55
|
+
|
|
56
|
+
return label;
|
|
55
57
|
}
|
|
56
58
|
});
|
|
@@ -84,7 +84,9 @@ export default define(class Parameters extends Element {
|
|
|
84
84
|
static name = "Parameters";
|
|
85
85
|
|
|
86
86
|
static fromJSON(json, context) {
|
|
87
|
-
|
|
87
|
+
let parameters;
|
|
88
|
+
|
|
89
|
+
instantiate((context) => {
|
|
88
90
|
const { string } = json,
|
|
89
91
|
parametersNode = instantiateParameters(string, context),
|
|
90
92
|
node = parametersNode, ///
|
|
@@ -94,9 +96,9 @@ export default define(class Parameters extends Element {
|
|
|
94
96
|
|
|
95
97
|
context = null;
|
|
96
98
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return parameters;
|
|
99
|
+
parameters = new Parameters(context, string, node, breakPoint, array);
|
|
100
100
|
}, context);
|
|
101
|
+
|
|
102
|
+
return parameters;
|
|
101
103
|
}
|
|
102
104
|
});
|
|
@@ -31,16 +31,25 @@ export default define(class ProcedureCall extends Element {
|
|
|
31
31
|
context.trace(`Evaluating the '${procedureCallString}' function call...`);
|
|
32
32
|
|
|
33
33
|
const procedureName = this.getProcedureName(),
|
|
34
|
-
procedurePresent = context.isProcedurePresentByProcedureName(procedureName)
|
|
34
|
+
procedurePresent = context.isProcedurePresentByProcedureName(procedureName),
|
|
35
|
+
importedProcedurePresent = context.isImportedProcedurePresentByProcedureName(procedureName);
|
|
35
36
|
|
|
36
|
-
if (!procedurePresent) {
|
|
37
|
+
if (!procedurePresent && !importedProcedurePresent) {
|
|
37
38
|
const message = `The '${procedureCallString}' function is not present.'`,
|
|
38
39
|
exception = Exception.fromMessage(message);
|
|
39
40
|
|
|
40
41
|
return back(exception);
|
|
41
42
|
}
|
|
42
43
|
|
|
43
|
-
|
|
44
|
+
let procedure;
|
|
45
|
+
|
|
46
|
+
if (!importedProcedurePresent) {
|
|
47
|
+
procedure = context.findProcedureByProcedureName(procedureName);
|
|
48
|
+
} else {
|
|
49
|
+
const importedProcedure = context.findImportedProcedureByProcedureName(procedureName);
|
|
50
|
+
|
|
51
|
+
procedure = importedProcedure; ///
|
|
52
|
+
}
|
|
44
53
|
|
|
45
54
|
return this.values.evaluate(context, (values, back) => {
|
|
46
55
|
return free((context) => {
|
package/src/element/reference.js
CHANGED
|
@@ -39,7 +39,9 @@ export default define(class Reference extends Element {
|
|
|
39
39
|
static name = "Reference";
|
|
40
40
|
|
|
41
41
|
static fromJSON(json, context) {
|
|
42
|
-
|
|
42
|
+
let reference;
|
|
43
|
+
|
|
44
|
+
instantiate((context) => {
|
|
43
45
|
const { string } = json,
|
|
44
46
|
referencelNode = instantiateReference(string, context),
|
|
45
47
|
node = referencelNode, ///
|
|
@@ -48,9 +50,9 @@ export default define(class Reference extends Element {
|
|
|
48
50
|
|
|
49
51
|
context = null;
|
|
50
52
|
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return referencel;
|
|
53
|
+
reference = new Reference(context, string, node, breakPoint, name);
|
|
54
54
|
}, context);
|
|
55
|
+
|
|
56
|
+
return reference;
|
|
55
57
|
}
|
|
56
58
|
});
|
package/src/element/type.js
CHANGED
|
@@ -110,7 +110,9 @@ export default define(class Type extends Element {
|
|
|
110
110
|
static name = "Type";
|
|
111
111
|
|
|
112
112
|
static fromJSON(json, context) {
|
|
113
|
-
|
|
113
|
+
let type;
|
|
114
|
+
|
|
115
|
+
instantiate((context) => {
|
|
114
116
|
const { string } = json,
|
|
115
117
|
typeNode = instantiateType(string, context),
|
|
116
118
|
node = typeNode, ///
|
|
@@ -120,10 +122,10 @@ export default define(class Type extends Element {
|
|
|
120
122
|
|
|
121
123
|
context = null;
|
|
122
124
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
return type;
|
|
125
|
+
type = new Type(context, string, node, breakPoint, name, argumentType);
|
|
126
126
|
}, context);
|
|
127
|
+
|
|
128
|
+
return type;
|
|
127
129
|
}
|
|
128
130
|
|
|
129
131
|
static fromTypeName(typeName, context) {
|
|
@@ -32,34 +32,6 @@ const bnf = `
|
|
|
32
32
|
|
|
33
33
|
|
|
34
34
|
|
|
35
|
-
importBindings ::= importBinding ( "," importBinding )* ;
|
|
36
|
-
|
|
37
|
-
namedBindings ::= namedBinding ( "," namedBinding )* ;
|
|
38
|
-
|
|
39
|
-
parameters ::= parameter ( "," parameter )* ;
|
|
40
|
-
|
|
41
|
-
bindings ::= binding ( "," binding )* ;
|
|
42
|
-
|
|
43
|
-
values ::= value ( "," value )* ;
|
|
44
|
-
|
|
45
|
-
terms ::= term ( "," term )* ;
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
importBinding ::= reference ( "as" label )? ;
|
|
50
|
-
|
|
51
|
-
namedBinding ::= type [name] ( "as" [name] )? ;
|
|
52
|
-
|
|
53
|
-
parameter ::= type [name] ;
|
|
54
|
-
|
|
55
|
-
binding ::= type [name]
|
|
56
|
-
|
|
57
|
-
| ε
|
|
58
|
-
|
|
59
|
-
;
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
35
|
procedureCall ::= reference<NO_WHITESPACE>"(" values? ")" ;
|
|
64
36
|
|
|
65
37
|
returnBlock.. ::= "{" ( statement | nonsense )* returnStatement "}" ;
|
|
@@ -71,6 +43,10 @@ const bnf = `
|
|
|
71
43
|
every ::= "every"<NO_WHITESPACE>"(" variable "," anonymousProcedure ")" ;
|
|
72
44
|
|
|
73
45
|
some ::= "some"<NO_WHITESPACE>"(" variable "," anonymousProcedure ")" ;
|
|
46
|
+
|
|
47
|
+
all ::= "all"<NO_WHITESPACE>"(" variable "," referencesListLiteral ( "," values )? ")" ;
|
|
48
|
+
|
|
49
|
+
exists ::= "exists"<NO_WHITESPACE>"(" variable "," referencesListLiteral ( "," values )? ")" ;
|
|
74
50
|
|
|
75
51
|
|
|
76
52
|
|
|
@@ -96,6 +72,40 @@ const bnf = `
|
|
|
96
72
|
|
|
97
73
|
|
|
98
74
|
|
|
75
|
+
referencesListLiteral ::= "[" references? "]" ;
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
importBindings ::= importBinding ( "," importBinding )* ;
|
|
80
|
+
|
|
81
|
+
namedBindings ::= namedBinding ( "," namedBinding )* ;
|
|
82
|
+
|
|
83
|
+
parameters ::= parameter ( "," parameter )* ;
|
|
84
|
+
|
|
85
|
+
references ::= reference ( "," reference )* ;
|
|
86
|
+
|
|
87
|
+
bindings ::= binding ( "," binding )* ;
|
|
88
|
+
|
|
89
|
+
values ::= value ( "," value )* ;
|
|
90
|
+
|
|
91
|
+
terms ::= term ( "," term )* ;
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
importBinding ::= reference ( "as" label )? ;
|
|
96
|
+
|
|
97
|
+
namedBinding ::= type [name] ( "as" [name] )? ;
|
|
98
|
+
|
|
99
|
+
parameter ::= type [name] ;
|
|
100
|
+
|
|
101
|
+
binding ::= type [name]
|
|
102
|
+
|
|
103
|
+
| ε
|
|
104
|
+
|
|
105
|
+
;
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
|
|
99
109
|
comparisonTerm ::= term ( "==" | "!=" ) term ;
|
|
100
110
|
|
|
101
111
|
bracketedTerm ::= "(" term ")" ;
|
|
@@ -118,6 +128,10 @@ const bnf = `
|
|
|
118
128
|
|
|
119
129
|
| some
|
|
120
130
|
|
|
131
|
+
| all
|
|
132
|
+
|
|
133
|
+
| exists
|
|
134
|
+
|
|
121
135
|
| nodesQuery
|
|
122
136
|
|
|
123
137
|
| nodeQuery
|
|
@@ -156,7 +170,7 @@ const bnf = `
|
|
|
156
170
|
|
|
157
171
|
|
|
158
172
|
|
|
159
|
-
|
|
173
|
+
type ::= "List"<NO_WHITESPACE>"<" ( "Node" | "String" | "Boolean" | "Integer" ) ">"
|
|
160
174
|
|
|
161
175
|
| "Node"
|
|
162
176
|
|
|
@@ -192,7 +206,7 @@ const bnf = `
|
|
|
192
206
|
|
|
193
207
|
reference. ::= [name] ;
|
|
194
208
|
|
|
195
|
-
variable
|
|
209
|
+
variable. ::= [name] ;
|
|
196
210
|
|
|
197
211
|
label. ::= [name] ;
|
|
198
212
|
|
|
@@ -14,7 +14,7 @@ const entries = [
|
|
|
14
14
|
"secondary-keyword": "^(?:as|if|else)"
|
|
15
15
|
},
|
|
16
16
|
{
|
|
17
|
-
"function-name": "^(?:nodeQuery|nodesQuery|reduce|every|some|lengthOf|toInteger|tryInteger|startsWith|endsWith|contains)"
|
|
17
|
+
"function-name": "^(?:nodeQuery|nodesQuery|reduce|every|some|lengthOf|toInteger|tryInteger|startsWith|endsWith|contains|all|exists)"
|
|
18
18
|
},
|
|
19
19
|
{
|
|
20
20
|
"type": "^(?:List|Node|String|Boolean|Integer)"
|