occam-parsers 23.0.54 → 23.0.55

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.
@@ -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 significantToken = null,
160
- terminalNode = new Class(significantToken, ...remainingArguments);
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 terminalNode = new Class(significantToken, ...remainingArguments);
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 { opaque: opaqueSpecialSymbol, semiOpaque: semiOpaqueSpecialSymbol } = specialSymbols;
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 savedPrecedence = state.getSavedPrecedence();
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
- let nonTerminalNode = this.createNonTerminalNode(),
79
- node = nonTerminalNode; ///
80
-
81
- const precedence = definition.getPrecedence(),
82
- childNodes = nonTerminalNode.getChildNodes();
80
+ clear(childNodes);
83
81
 
84
- nodes.push(node);
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
- const node = nonTerminalNode; ///
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
  }