occam-parsers 23.0.54 → 23.0.56
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/example.js +347 -214
- package/lib/node/nonTerminal.js +39 -7
- package/lib/node/terminal.js +40 -11
- package/lib/rule.js +18 -17
- package/package.json +1 -1
- package/src/node/nonTerminal.js +43 -10
- package/src/node/terminal.js +37 -9
- package/src/rule.js +26 -20
package/src/node/terminal.js
CHANGED
|
@@ -3,14 +3,27 @@
|
|
|
3
3
|
import TerminalNodeParseTree from "../parseTree/terminalNode";
|
|
4
4
|
|
|
5
5
|
export default class TerminalNode {
|
|
6
|
-
constructor(significantToken) {
|
|
6
|
+
constructor(parentNode, significantToken) {
|
|
7
|
+
this.parentNode = parentNode;
|
|
7
8
|
this.significantToken = significantToken;
|
|
8
9
|
}
|
|
9
10
|
|
|
11
|
+
getParentNode() {
|
|
12
|
+
return this.parentNode;
|
|
13
|
+
}
|
|
14
|
+
|
|
10
15
|
getSignificantToken() {
|
|
11
16
|
return this.significantToken;
|
|
12
17
|
}
|
|
13
18
|
|
|
19
|
+
setParentNode(parentNode) {
|
|
20
|
+
this.parentNode = parentNode;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
setSignificantToken(significantToken) {
|
|
24
|
+
this.significantToken = significantToken;
|
|
25
|
+
}
|
|
26
|
+
|
|
14
27
|
isStartOfContentNode() {
|
|
15
28
|
const startOfContentNode = false;
|
|
16
29
|
|
|
@@ -89,6 +102,22 @@ export default class TerminalNode {
|
|
|
89
102
|
return significantTokens;
|
|
90
103
|
}
|
|
91
104
|
|
|
105
|
+
getAncestorNodes() {
|
|
106
|
+
const ancestorNodes = [];
|
|
107
|
+
|
|
108
|
+
let parentNode = this.parentNode;
|
|
109
|
+
|
|
110
|
+
while (parentNode !== null) {
|
|
111
|
+
const ancestorNode = parentNode; ///
|
|
112
|
+
|
|
113
|
+
ancestorNodes.push(ancestorNode);
|
|
114
|
+
|
|
115
|
+
parentNode = parentNode.getParentNode();
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return ancestorNodes;
|
|
119
|
+
}
|
|
120
|
+
|
|
92
121
|
isIncludedIn(node) {
|
|
93
122
|
let includedIn = false;
|
|
94
123
|
|
|
@@ -131,10 +160,6 @@ export default class TerminalNode {
|
|
|
131
160
|
return matches;
|
|
132
161
|
}
|
|
133
162
|
|
|
134
|
-
setSignificantToken(significantToken) {
|
|
135
|
-
this.significantToken = significantToken;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
163
|
asParseTree(tokens) {
|
|
139
164
|
const terminalNode = this, ///
|
|
140
165
|
terminalNodeParseTree = TerminalNodeParseTree.fromTerminalNodeAndTokens(terminalNode, tokens),
|
|
@@ -145,8 +170,9 @@ export default class TerminalNode {
|
|
|
145
170
|
|
|
146
171
|
clone(...remainingArguments) {
|
|
147
172
|
const Class = this.constructor,
|
|
173
|
+
parentNode = null,
|
|
148
174
|
significantToken = this.significantToken,
|
|
149
|
-
terminalNode = new Class(significantToken, ...remainingArguments);
|
|
175
|
+
terminalNode = new Class(parentNode, significantToken, ...remainingArguments);
|
|
150
176
|
|
|
151
177
|
return terminalNode;
|
|
152
178
|
}
|
|
@@ -156,8 +182,9 @@ export default class TerminalNode {
|
|
|
156
182
|
Class = TerminalNode; ///
|
|
157
183
|
}
|
|
158
184
|
|
|
159
|
-
const
|
|
160
|
-
|
|
185
|
+
const parentNode = null,
|
|
186
|
+
significantToken = null,
|
|
187
|
+
terminalNode = new Class(parentNode, significantToken, ...remainingArguments);
|
|
161
188
|
|
|
162
189
|
return terminalNode;
|
|
163
190
|
}
|
|
@@ -169,7 +196,8 @@ export default class TerminalNode {
|
|
|
169
196
|
Class = TerminalNode; ///
|
|
170
197
|
}
|
|
171
198
|
|
|
172
|
-
const
|
|
199
|
+
const parentNode = null,
|
|
200
|
+
terminalNode = new Class(parentNode, significantToken, ...remainingArguments);
|
|
173
201
|
|
|
174
202
|
return terminalNode;
|
|
175
203
|
}
|
package/src/rule.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
+
import { arrayUtilities } from "necessary";
|
|
4
|
+
|
|
3
5
|
import { EMPTY_STRING } from "./constants";
|
|
4
6
|
import { specialSymbols } from "occam-lexers";
|
|
5
7
|
import { paddingFromPaddingLength } from "./utilities/string";
|
|
6
8
|
|
|
7
|
-
const {
|
|
9
|
+
const { clear } = arrayUtilities,
|
|
10
|
+
{ opaque: opaqueSpecialSymbol, semiOpaque: semiOpaqueSpecialSymbol } = specialSymbols;
|
|
8
11
|
|
|
9
12
|
export default class Rule {
|
|
10
13
|
constructor(name, opacity, definitions, NonTerminalNode) {
|
|
@@ -46,15 +49,6 @@ export default class Rule {
|
|
|
46
49
|
this.NonTerminalNode = NonTerminalNode;
|
|
47
50
|
}
|
|
48
51
|
|
|
49
|
-
createNonTerminalNode() {
|
|
50
|
-
const opacity = this.opacity,
|
|
51
|
-
ruleName = this.name, ///
|
|
52
|
-
childNodes = [],
|
|
53
|
-
nonTerminalNode = this.NonTerminalNode.fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity);
|
|
54
|
-
|
|
55
|
-
return nonTerminalNode;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
52
|
isOpaque() {
|
|
59
53
|
const opaque = (this.opacity === opaqueSpecialSymbol);
|
|
60
54
|
|
|
@@ -70,18 +64,22 @@ export default class Rule {
|
|
|
70
64
|
parse(nodes, state, callback, callAhead) {
|
|
71
65
|
let parsed;
|
|
72
66
|
|
|
73
|
-
const
|
|
67
|
+
const opacity = this.opacity,
|
|
68
|
+
ruleName = this.name, ///
|
|
69
|
+
childNodes = [],
|
|
70
|
+
nonTerminalNode = this.NonTerminalNode.fromRuleNameChildNodesAndOpacity(ruleName, childNodes, opacity),
|
|
71
|
+
savedPrecedence = state.getSavedPrecedence();
|
|
72
|
+
|
|
73
|
+
let node = nonTerminalNode; ///
|
|
74
|
+
|
|
75
|
+
nodes.push(node);
|
|
74
76
|
|
|
75
77
|
parsed = this.definitions.some((definition) => {
|
|
76
78
|
let parsed;
|
|
77
79
|
|
|
78
|
-
|
|
79
|
-
node = nonTerminalNode; ///
|
|
80
|
-
|
|
81
|
-
const precedence = definition.getPrecedence(),
|
|
82
|
-
childNodes = nonTerminalNode.getChildNodes();
|
|
80
|
+
clear(childNodes);
|
|
83
81
|
|
|
84
|
-
|
|
82
|
+
const precedence = definition.getPrecedence();
|
|
85
83
|
|
|
86
84
|
state.setPrecedence(precedence);
|
|
87
85
|
|
|
@@ -134,7 +132,7 @@ export default class Rule {
|
|
|
134
132
|
if (!parsed) {
|
|
135
133
|
nodes.pop();
|
|
136
134
|
|
|
137
|
-
|
|
135
|
+
node = nonTerminalNode; ///
|
|
138
136
|
|
|
139
137
|
nodes.push(node);
|
|
140
138
|
}
|
|
@@ -147,13 +145,21 @@ export default class Rule {
|
|
|
147
145
|
|
|
148
146
|
if (!parsed) {
|
|
149
147
|
state.resetPrecedence(savedPrecedence);
|
|
150
|
-
|
|
151
|
-
nodes.pop();
|
|
152
148
|
}
|
|
153
149
|
|
|
154
150
|
return parsed;
|
|
155
151
|
});
|
|
156
152
|
|
|
153
|
+
if (parsed) {
|
|
154
|
+
const parentNode = node; ///
|
|
155
|
+
|
|
156
|
+
childNodes.forEach((childNode) => {
|
|
157
|
+
childNode.setParentNode(parentNode);
|
|
158
|
+
});
|
|
159
|
+
} else {
|
|
160
|
+
nodes.pop();
|
|
161
|
+
}
|
|
162
|
+
|
|
157
163
|
if (callAhead === null) {
|
|
158
164
|
state.resetPrecedence(savedPrecedence);
|
|
159
165
|
}
|