occam-parsers 23.0.52 → 23.0.54
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/README.md +7 -7
- package/example.js +494 -167
- package/lib/bnf/bnf.js +2 -2
- package/lib/bnf/parser.js +4 -4
- package/lib/definition/{lookAheadModifierRule.js → callAheadModifierRule.js} +11 -11
- package/lib/definition/partRule/nonTerminal/ruleName.js +3 -3
- package/lib/example/basic/bnf.js +14 -0
- package/lib/example/basic/entries.js +18 -0
- package/lib/example/basic/lexer.js +136 -0
- package/lib/example/basic/parser.js +134 -0
- package/lib/example/view/basic.js +8 -8
- package/lib/example/view/div/sizeable.js +2 -2
- package/lib/node/bnf/{lookAheadModifier.js → callAheadModifier.js} +12 -12
- package/lib/node/bnf/choiceOfParts.js +4 -4
- package/lib/node/bnf/definition.js +3 -3
- package/lib/node/bnf/endOfLine.js +2 -2
- package/lib/node/bnf/epsilon.js +2 -2
- package/lib/node/bnf/noWhitespacePart.js +2 -2
- package/lib/node/bnf/part/nonTerminal.js +6 -6
- package/lib/node/bnf/part/terminal.js +3 -3
- package/lib/node/bnf/part.js +5 -5
- package/lib/node/bnf/partChoice.js +4 -4
- package/lib/node/bnf/regularExpression.js +2 -2
- package/lib/node/bnf/ruleName.js +3 -3
- package/lib/node/bnf/sequenceOfParts.js +4 -4
- package/lib/node/bnf/significantTokenType.js +2 -2
- package/lib/node/bnf/startOfContentPart.js +2 -2
- package/lib/node/bnf/terminalSymbol.js +2 -2
- package/lib/node/bnf/wildcard.js +2 -2
- package/lib/part/nonTerminal/choiceOfParts.js +4 -4
- package/lib/part/nonTerminal/oneOrMoreParts.js +4 -4
- package/lib/part/nonTerminal/optionalPart.js +4 -4
- package/lib/part/nonTerminal/ruleName.js +8 -8
- package/lib/part/nonTerminal/sequenceOfParts.js +4 -4
- package/lib/part/nonTerminal/zeroOrMoreParts.js +4 -4
- package/lib/part/nonTerminal.js +6 -6
- package/lib/part/terminal.js +5 -5
- package/lib/rule/{lookAheadModifier.js → callAheadModifier.js} +15 -15
- package/lib/rule.js +15 -9
- package/lib/ruleNames.js +5 -5
- package/lib/utilities/bnf.js +9 -9
- package/lib/utilities/parse.js +28 -28
- package/package.json +3 -3
- package/src/bnf/bnf.js +2 -2
- package/src/bnf/parser.js +3 -3
- package/src/definition/{lookAheadModifierRule.js → callAheadModifierRule.js} +3 -3
- package/src/definition/partRule/nonTerminal/ruleName.js +4 -4
- package/src/example/basic/bnf.js +27 -0
- package/src/example/basic/entries.js +9 -0
- package/src/example/basic/lexer.js +17 -0
- package/src/example/basic/parser.js +15 -0
- package/src/example/view/basic.js +13 -10
- package/src/example/view/div/sizeable.js +1 -1
- package/src/node/bnf/callAheadModifier.js +7 -0
- package/src/node/bnf/choiceOfParts.js +3 -3
- package/src/node/bnf/definition.js +2 -2
- package/src/node/bnf/endOfLine.js +1 -1
- package/src/node/bnf/epsilon.js +1 -1
- package/src/node/bnf/noWhitespacePart.js +1 -1
- package/src/node/bnf/part/nonTerminal.js +6 -6
- package/src/node/bnf/part/terminal.js +2 -2
- package/src/node/bnf/part.js +4 -4
- package/src/node/bnf/partChoice.js +3 -3
- package/src/node/bnf/regularExpression.js +1 -1
- package/src/node/bnf/ruleName.js +2 -2
- package/src/node/bnf/sequenceOfParts.js +3 -3
- package/src/node/bnf/significantTokenType.js +1 -1
- package/src/node/bnf/startOfContentPart.js +1 -1
- package/src/node/bnf/terminalSymbol.js +1 -1
- package/src/node/bnf/wildcard.js +1 -1
- package/src/part/nonTerminal/choiceOfParts.js +4 -4
- package/src/part/nonTerminal/oneOrMoreParts.js +4 -4
- package/src/part/nonTerminal/optionalPart.js +4 -4
- package/src/part/nonTerminal/ruleName.js +9 -9
- package/src/part/nonTerminal/sequenceOfParts.js +4 -4
- package/src/part/nonTerminal/zeroOrMoreParts.js +4 -4
- package/src/part/nonTerminal.js +4 -4
- package/src/part/terminal.js +3 -3
- package/src/rule/callAheadModifier.js +22 -0
- package/src/rule.js +21 -15
- package/src/ruleNames.js +1 -1
- package/src/utilities/bnf.js +6 -6
- package/src/utilities/parse.js +38 -28
- package/src/node/bnf/lookAheadModifier.js +0 -7
- package/src/rule/lookAheadModifier.js +0 -22
package/lib/utilities/bnf.js
CHANGED
|
@@ -9,12 +9,12 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
+
isNodeCallAheadModifierNode: function() {
|
|
13
|
+
return isNodeCallAheadModifierNode;
|
|
14
|
+
},
|
|
12
15
|
isNodeChoiceNode: function() {
|
|
13
16
|
return isNodeChoiceNode;
|
|
14
17
|
},
|
|
15
|
-
isNodeLookAheadModifierNode: function() {
|
|
16
|
-
return isNodeLookAheadModifierNode;
|
|
17
|
-
},
|
|
18
18
|
isNodeQuantifierNode: function() {
|
|
19
19
|
return isNodeQuantifierNode;
|
|
20
20
|
},
|
|
@@ -55,14 +55,14 @@ function isNodeQuantifierNode(node) {
|
|
|
55
55
|
}
|
|
56
56
|
return nodeQuantifierNode;
|
|
57
57
|
}
|
|
58
|
-
function
|
|
59
|
-
var
|
|
58
|
+
function isNodeCallAheadModifierNode(node) {
|
|
59
|
+
var nodeCallAheadModifierNode = false;
|
|
60
60
|
var nodeNonTerminalNode = node.isNonTerminalNode();
|
|
61
61
|
if (nodeNonTerminalNode) {
|
|
62
|
-
var nonTerminalNode = node, ruleName = nonTerminalNode.getRuleName(),
|
|
63
|
-
|
|
62
|
+
var nonTerminalNode = node, ruleName = nonTerminalNode.getRuleName(), ruleNameCallAheadModifierRuleName = ruleName === _ruleNames.callAheadModifierRuleName;
|
|
63
|
+
nodeCallAheadModifierNode = ruleNameCallAheadModifierRuleName; ///
|
|
64
64
|
}
|
|
65
|
-
return
|
|
65
|
+
return nodeCallAheadModifierNode;
|
|
66
66
|
}
|
|
67
67
|
function ruleNameFromQuantifierNode(quantifierNode) {
|
|
68
68
|
var nonTerminalNode;
|
|
@@ -73,4 +73,4 @@ function ruleNameFromQuantifierNode(quantifierNode) {
|
|
|
73
73
|
return ruleName;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
76
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvYm5mLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBhcnJheVV0aWxpdGllcyB9IGZyb20gXCJuZWNlc3NhcnlcIjtcblxuaW1wb3J0IHsgcnVsZU5hbWVSdWxlTmFtZSwgcXVhbnRpZmllclJ1bGVOYW1lLCBjYWxsQWhlYWRNb2RpZmllclJ1bGVOYW1lIH0gZnJvbSBcIi4uL3J1bGVOYW1lc1wiO1xuXG5jb25zdCB7IGZpcnN0IH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZUNob2ljZU5vZGUobm9kZSkge1xuICBsZXQgbm9kZU5vQ2hvaWNlTm9kZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG5vZGVUZXJtaW5hbE5vZGUgPSBub2RlLmlzVGVybWluYWxOb2RlKCk7XG5cbiAgaWYgKG5vZGVUZXJtaW5hbE5vZGUpIHtcbiAgICBjb25zdCB0ZXJtaW5hbE5vZGUgPSBub2RlLCAgLy8vXG4gICAgICAgICAgdGVybWluYWxOb2RlQ29udGVudCA9IHRlcm1pbmFsTm9kZS5nZXRDb250ZW50KCk7XG5cbiAgICBub2RlTm9DaG9pY2VOb2RlID0gKHRlcm1pbmFsTm9kZUNvbnRlbnQgPT09IFwifFwiKTtcbiAgfVxuXG4gIHJldHVybiBub2RlTm9DaG9pY2VOb2RlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb2RlUnVsZU5hbWVOb2RlKG5vZGUpIHtcbiAgbGV0IG5vZGVSdWxlTmFtZU5vZGUgPSBmYWxzZTtcblxuICBjb25zdCBub2RlVGVybWluYWxOb2RlID0gbm9kZS5pc1Rlcm1pbmFsTm9kZSgpLFxuICAgICAgICBub2RlTm9uVGVybWluYWxOb2RlID0gIW5vZGVUZXJtaW5hbE5vZGU7XG5cbiAgaWYgKG5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBub2RlLCAvLy9cbiAgICAgICAgICBub25UZXJtaW5hbE5vZGVSdWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpO1xuXG4gICAgbm9kZVJ1bGVOYW1lTm9kZSA9IChub25UZXJtaW5hbE5vZGVSdWxlTmFtZSA9PT0gcnVsZU5hbWVSdWxlTmFtZSk7XG4gIH1cblxuICByZXR1cm4gbm9kZVJ1bGVOYW1lTm9kZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTm9kZVF1YW50aWZpZXJOb2RlKG5vZGUpIHtcbiAgbGV0IG5vZGVRdWFudGlmaWVyTm9kZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG5vZGVOb25UZXJtaW5hbE5vZGUgPSBub2RlLmlzTm9uVGVybWluYWxOb2RlKCk7XG5cbiAgaWYgKG5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBub2RlLCAvLy9cbiAgICAgICAgICBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICAgIHJ1bGVOYW1lUXVhbnRpZmllclJ1bGVOYW1lID0gKHJ1bGVOYW1lID09PSBxdWFudGlmaWVyUnVsZU5hbWUpO1xuXG4gICAgbm9kZVF1YW50aWZpZXJOb2RlID0gcnVsZU5hbWVRdWFudGlmaWVyUnVsZU5hbWU7ICAvLy9cbiAgfVxuXG4gIHJldHVybiBub2RlUXVhbnRpZmllck5vZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc05vZGVDYWxsQWhlYWRNb2RpZmllck5vZGUobm9kZSkge1xuICBsZXQgbm9kZUNhbGxBaGVhZE1vZGlmaWVyTm9kZSA9IGZhbHNlO1xuXG4gIGNvbnN0IG5vZGVOb25UZXJtaW5hbE5vZGUgPSBub2RlLmlzTm9uVGVybWluYWxOb2RlKCk7XG5cbiAgaWYgKG5vZGVOb25UZXJtaW5hbE5vZGUpIHtcbiAgICBjb25zdCBub25UZXJtaW5hbE5vZGUgPSBub2RlLCAvLy9cbiAgICAgICAgICBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpLFxuICAgICAgICAgIHJ1bGVOYW1lQ2FsbEFoZWFkTW9kaWZpZXJSdWxlTmFtZSA9IChydWxlTmFtZSA9PT0gY2FsbEFoZWFkTW9kaWZpZXJSdWxlTmFtZSk7XG5cbiAgICBub2RlQ2FsbEFoZWFkTW9kaWZpZXJOb2RlID0gcnVsZU5hbWVDYWxsQWhlYWRNb2RpZmllclJ1bGVOYW1lOyAgLy8vXG4gIH1cblxuICByZXR1cm4gbm9kZUNhbGxBaGVhZE1vZGlmaWVyTm9kZTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVsZU5hbWVGcm9tUXVhbnRpZmllck5vZGUocXVhbnRpZmllck5vZGUpIHtcbiAgbGV0IG5vblRlcm1pbmFsTm9kZTtcblxuICBub25UZXJtaW5hbE5vZGUgPSBxdWFudGlmaWVyTm9kZTsgLy8vXG5cbiAgY29uc3QgY2hpbGROb2RlcyA9IG5vblRlcm1pbmFsTm9kZS5nZXRDaGlsZE5vZGVzKCksXG4gICAgICAgIGZpcnN0Q2hpbGROb2RlID0gZmlyc3QoY2hpbGROb2Rlcyk7XG5cbiAgbm9uVGVybWluYWxOb2RlID0gZmlyc3RDaGlsZE5vZGU7ICAvLy9cblxuICBjb25zdCBydWxlTmFtZSA9IG5vblRlcm1pbmFsTm9kZS5nZXRSdWxlTmFtZSgpO1xuXG4gIHJldHVybiBydWxlTmFtZTtcbn1cbiJdLCJuYW1lcyI6WyJpc05vZGVDYWxsQWhlYWRNb2RpZmllck5vZGUiLCJpc05vZGVDaG9pY2VOb2RlIiwiaXNOb2RlUXVhbnRpZmllck5vZGUiLCJpc05vZGVSdWxlTmFtZU5vZGUiLCJydWxlTmFtZUZyb21RdWFudGlmaWVyTm9kZSIsImZpcnN0IiwiYXJyYXlVdGlsaXRpZXMiLCJub2RlIiwibm9kZU5vQ2hvaWNlTm9kZSIsIm5vZGVUZXJtaW5hbE5vZGUiLCJpc1Rlcm1pbmFsTm9kZSIsInRlcm1pbmFsTm9kZSIsInRlcm1pbmFsTm9kZUNvbnRlbnQiLCJnZXRDb250ZW50Iiwibm9kZVJ1bGVOYW1lTm9kZSIsIm5vZGVOb25UZXJtaW5hbE5vZGUiLCJub25UZXJtaW5hbE5vZGUiLCJub25UZXJtaW5hbE5vZGVSdWxlTmFtZSIsImdldFJ1bGVOYW1lIiwicnVsZU5hbWVSdWxlTmFtZSIsIm5vZGVRdWFudGlmaWVyTm9kZSIsImlzTm9uVGVybWluYWxOb2RlIiwicnVsZU5hbWUiLCJydWxlTmFtZVF1YW50aWZpZXJSdWxlTmFtZSIsInF1YW50aWZpZXJSdWxlTmFtZSIsIm5vZGVDYWxsQWhlYWRNb2RpZmllck5vZGUiLCJydWxlTmFtZUNhbGxBaGVhZE1vZGlmaWVyUnVsZU5hbWUiLCJjYWxsQWhlYWRNb2RpZmllclJ1bGVOYW1lIiwicXVhbnRpZmllck5vZGUiLCJjaGlsZE5vZGVzIiwiZ2V0Q2hpbGROb2RlcyIsImZpcnN0Q2hpbGROb2RlIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUF1RGdCQSwyQkFBMkI7ZUFBM0JBOztJQS9DQUMsZ0JBQWdCO2VBQWhCQTs7SUErQkFDLG9CQUFvQjtlQUFwQkE7O0lBaEJBQyxrQkFBa0I7ZUFBbEJBOztJQWlEQUMsMEJBQTBCO2VBQTFCQTs7O3lCQXRFZTt5QkFFaUQ7QUFFaEYsSUFBTSxBQUFFQyxRQUFVQyx5QkFBYyxDQUF4QkQ7QUFFRCxTQUFTSixpQkFBaUJNLElBQUk7SUFDbkMsSUFBSUMsbUJBQW1CO0lBRXZCLElBQU1DLG1CQUFtQkYsS0FBS0csY0FBYztJQUU1QyxJQUFJRCxrQkFBa0I7UUFDcEIsSUFBTUUsZUFBZUosTUFDZkssc0JBQXNCRCxhQUFhRSxVQUFVO1FBRW5ETCxtQkFBb0JJLHdCQUF3QjtJQUM5QztJQUVBLE9BQU9KO0FBQ1Q7QUFFTyxTQUFTTCxtQkFBbUJJLElBQUk7SUFDckMsSUFBSU8sbUJBQW1CO0lBRXZCLElBQU1MLG1CQUFtQkYsS0FBS0csY0FBYyxJQUN0Q0ssc0JBQXNCLENBQUNOO0lBRTdCLElBQUlNLHFCQUFxQjtRQUN2QixJQUFNQyxrQkFBa0JULE1BQ2xCVSwwQkFBMEJELGdCQUFnQkUsV0FBVztRQUUzREosbUJBQW9CRyw0QkFBNEJFLDJCQUFnQjtJQUNsRTtJQUVBLE9BQU9MO0FBQ1Q7QUFFTyxTQUFTWixxQkFBcUJLLElBQUk7SUFDdkMsSUFBSWEscUJBQXFCO0lBRXpCLElBQU1MLHNCQUFzQlIsS0FBS2MsaUJBQWlCO0lBRWxELElBQUlOLHFCQUFxQjtRQUN2QixJQUFNQyxrQkFBa0JULE1BQ2xCZSxXQUFXTixnQkFBZ0JFLFdBQVcsSUFDdENLLDZCQUE4QkQsYUFBYUUsNkJBQWtCO1FBRW5FSixxQkFBcUJHLDRCQUE2QixHQUFHO0lBQ3ZEO0lBRUEsT0FBT0g7QUFDVDtBQUVPLFNBQVNwQiw0QkFBNEJPLElBQUk7SUFDOUMsSUFBSWtCLDRCQUE0QjtJQUVoQyxJQUFNVixzQkFBc0JSLEtBQUtjLGlCQUFpQjtJQUVsRCxJQUFJTixxQkFBcUI7UUFDdkIsSUFBTUMsa0JBQWtCVCxNQUNsQmUsV0FBV04sZ0JBQWdCRSxXQUFXLElBQ3RDUSxvQ0FBcUNKLGFBQWFLLG9DQUF5QjtRQUVqRkYsNEJBQTRCQyxtQ0FBb0MsR0FBRztJQUNyRTtJQUVBLE9BQU9EO0FBRVQ7QUFFTyxTQUFTckIsMkJBQTJCd0IsY0FBYztJQUN2RCxJQUFJWjtJQUVKQSxrQkFBa0JZLGdCQUFnQixHQUFHO0lBRXJDLElBQU1DLGFBQWFiLGdCQUFnQmMsYUFBYSxJQUMxQ0MsaUJBQWlCMUIsTUFBTXdCO0lBRTdCYixrQkFBa0JlLGdCQUFpQixHQUFHO0lBRXRDLElBQU1ULFdBQVdOLGdCQUFnQkUsV0FBVztJQUU1QyxPQUFPSTtBQUNUIn0=
|
package/lib/utilities/parse.js
CHANGED
|
@@ -17,7 +17,7 @@ _export(exports, {
|
|
|
17
17
|
}
|
|
18
18
|
});
|
|
19
19
|
var _necessary = require("necessary");
|
|
20
|
-
var push = _necessary.arrayUtilities.push;
|
|
20
|
+
var push = _necessary.arrayUtilities.push, clear = _necessary.arrayUtilities.clear;
|
|
21
21
|
function parsePart(part, nodes, state, callback, callAhead) {
|
|
22
22
|
var parsed;
|
|
23
23
|
var index = 0, parts = [
|
|
@@ -38,35 +38,35 @@ function parsePartOfParts(index, parts, nodes, state, callback, callAhead) {
|
|
|
38
38
|
if (index === partsLength) {
|
|
39
39
|
parsed = callback !== null ? callback() : true;
|
|
40
40
|
} else {
|
|
41
|
-
var part = parts[index];
|
|
41
|
+
var part = parts[index], partCallAhead = callAhead === null ? part.isCallAhead() : true;
|
|
42
42
|
index++;
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
43
|
+
parsed = partCallAhead ? parsePartWithCallAhead(part, index, parts, nodes, state, callback, callAhead) : parsePartWithoutCallAhead(part, index, parts, nodes, state, callback, callAhead);
|
|
44
|
+
}
|
|
45
|
+
return parsed;
|
|
46
|
+
}
|
|
47
|
+
function parsePartWithCallAhead(part, index, parts, nodes, state, callback, callAhead) {
|
|
48
|
+
var parsed;
|
|
49
|
+
var partNodes = [];
|
|
50
|
+
callAhead = function() {
|
|
51
|
+
var parsed;
|
|
52
|
+
clear(partNodes);
|
|
53
|
+
var _$nodes = partNodes; ///
|
|
54
|
+
parsed = parsePartOfParts(index, parts, _$nodes, state, callback, callAhead);
|
|
55
|
+
return parsed;
|
|
56
|
+
};
|
|
57
|
+
parsed = part.parse(nodes, state, callback, callAhead);
|
|
58
|
+
if (parsed) {
|
|
59
|
+
push(nodes, partNodes);
|
|
60
|
+
}
|
|
61
|
+
return parsed;
|
|
62
|
+
}
|
|
63
|
+
function parsePartWithoutCallAhead(part, index, parts, nodes, state, callback, callAhead) {
|
|
64
|
+
var parsed;
|
|
65
|
+
parsed = part.parse(nodes, state, callback, callAhead);
|
|
66
|
+
if (parsed) {
|
|
67
|
+
parsed = parsePartOfParts(index, parts, nodes, state, callback, callAhead);
|
|
68
68
|
}
|
|
69
69
|
return parsed;
|
|
70
70
|
}
|
|
71
71
|
|
|
72
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvcGFyc2UuanMiXSwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmltcG9ydCB7IGFycmF5VXRpbGl0aWVzIH0gZnJvbSBcIm5lY2Vzc2FyeVwiO1xuXG5jb25zdCB7IHB1c2gsIGNsZWFyIH0gPSBhcnJheVV0aWxpdGllcztcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUGFydChwYXJ0LCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpIHtcbiAgbGV0IHBhcnNlZDtcblxuICBjb25zdCBpbmRleCA9IDAsXG4gICAgICAgIHBhcnRzID0gW1xuICAgICAgICAgIHBhcnRcbiAgICAgICAgXTtcblxuICBwYXJzZWQgPSBwYXJzZVBhcnRPZlBhcnRzKGluZGV4LCBwYXJ0cywgbm9kZXMsIHN0YXRlLCBjYWxsYmFjaywgY2FsbEFoZWFkKTtcblxuICByZXR1cm4gcGFyc2VkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VQYXJ0cyhwYXJ0cywgbm9kZXMsIHN0YXRlLCBjYWxsYmFjaywgY2FsbEFoZWFkKSB7XG4gIGxldCBwYXJzZWQ7XG5cbiAgY29uc3QgaW5kZXggPSAwO1xuXG4gIHBhcnNlZCA9IHBhcnNlUGFydE9mUGFydHMoaW5kZXgsIHBhcnRzLCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpO1xuXG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFydE9mUGFydHMoaW5kZXgsIHBhcnRzLCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpIHtcbiAgbGV0IHBhcnNlZDtcblxuICBjb25zdCBwYXJ0c0xlbmd0aCA9IHBhcnRzLmxlbmd0aDtcblxuICBpZiAoaW5kZXggPT09IHBhcnRzTGVuZ3RoKSB7XG4gICAgcGFyc2VkID0gKGNhbGxiYWNrICE9PSBudWxsKSA/XG4gICAgICAgICAgICAgICBjYWxsYmFjaygpIDpcbiAgICAgICAgICAgICAgICAgdHJ1ZTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwYXJ0ID0gcGFydHNbaW5kZXhdLFxuICAgICAgICAgIHBhcnRDYWxsQWhlYWQgPSAoY2FsbEFoZWFkID09PSBudWxsKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydC5pc0NhbGxBaGVhZCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWU7XG5cbiAgICBpbmRleCsrO1xuXG4gICAgcGFyc2VkID0gcGFydENhbGxBaGVhZCA/XG4gICAgICAgICAgICAgICBwYXJzZVBhcnRXaXRoQ2FsbEFoZWFkKHBhcnQsIGluZGV4LCBwYXJ0cywgbm9kZXMsIHN0YXRlLCBjYWxsYmFjaywgY2FsbEFoZWFkKSA6XG4gICAgICAgICAgICAgICAgIHBhcnNlUGFydFdpdGhvdXRDYWxsQWhlYWQocGFydCwgaW5kZXgsIHBhcnRzLCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cblxuZnVuY3Rpb24gcGFyc2VQYXJ0V2l0aENhbGxBaGVhZChwYXJ0LCBpbmRleCwgcGFydHMsIG5vZGVzLCBzdGF0ZSwgY2FsbGJhY2ssIGNhbGxBaGVhZCkge1xuICBsZXQgcGFyc2VkO1xuXG4gIGNvbnN0IHBhcnROb2RlcyA9IFtdO1xuXG4gIGNhbGxBaGVhZCA9ICgpID0+IHsgLy8vXG4gICAgbGV0IHBhcnNlZDtcblxuICAgIGNsZWFyKHBhcnROb2Rlcyk7XG5cbiAgICBjb25zdCBub2RlcyA9IHBhcnROb2RlczsgIC8vL1xuXG4gICAgcGFyc2VkID0gcGFyc2VQYXJ0T2ZQYXJ0cyhpbmRleCwgcGFydHMsIG5vZGVzLCBzdGF0ZSwgY2FsbGJhY2ssIGNhbGxBaGVhZCk7XG5cbiAgICByZXR1cm4gcGFyc2VkO1xuICB9O1xuXG4gIHBhcnNlZCA9IHBhcnQucGFyc2Uobm9kZXMsIHN0YXRlLCBjYWxsYmFjaywgY2FsbEFoZWFkKTtcblxuICBpZiAocGFyc2VkKSB7XG4gICAgcHVzaChub2RlcywgcGFydE5vZGVzKTtcbiAgfVxuXG4gIHJldHVybiBwYXJzZWQ7XG59XG5cbmZ1bmN0aW9uIHBhcnNlUGFydFdpdGhvdXRDYWxsQWhlYWQocGFydCwgaW5kZXgsIHBhcnRzLCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpIHtcbiAgbGV0IHBhcnNlZDtcblxuICBwYXJzZWQgPSBwYXJ0LnBhcnNlKG5vZGVzLCBzdGF0ZSwgY2FsbGJhY2ssIGNhbGxBaGVhZCk7XG5cbiAgaWYgKHBhcnNlZCkge1xuICAgIHBhcnNlZCA9IHBhcnNlUGFydE9mUGFydHMoaW5kZXgsIHBhcnRzLCBub2Rlcywgc3RhdGUsIGNhbGxiYWNrLCBjYWxsQWhlYWQpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn1cbiJdLCJuYW1lcyI6WyJwYXJzZVBhcnQiLCJwYXJzZVBhcnRzIiwicHVzaCIsImFycmF5VXRpbGl0aWVzIiwiY2xlYXIiLCJwYXJ0Iiwibm9kZXMiLCJzdGF0ZSIsImNhbGxiYWNrIiwiY2FsbEFoZWFkIiwicGFyc2VkIiwiaW5kZXgiLCJwYXJ0cyIsInBhcnNlUGFydE9mUGFydHMiLCJwYXJ0c0xlbmd0aCIsImxlbmd0aCIsInBhcnRDYWxsQWhlYWQiLCJpc0NhbGxBaGVhZCIsInBhcnNlUGFydFdpdGhDYWxsQWhlYWQiLCJwYXJzZVBhcnRXaXRob3V0Q2FsbEFoZWFkIiwicGFydE5vZGVzIiwicGFyc2UiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztJQU1nQkEsU0FBUztlQUFUQTs7SUFhQUMsVUFBVTtlQUFWQTs7O3lCQWpCZTtBQUUvQixJQUFRQyxPQUFnQkMseUJBQWMsQ0FBOUJELE1BQU1FLFFBQVVELHlCQUFjLENBQXhCQztBQUVQLFNBQVNKLFVBQVVLLElBQUksRUFBRUMsS0FBSyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUztJQUMvRCxJQUFJQztJQUVKLElBQU1DLFFBQVEsR0FDUkMsUUFBUTtRQUNOUDtLQUNEO0lBRVBLLFNBQVNHLGlCQUFpQkYsT0FBT0MsT0FBT04sT0FBT0MsT0FBT0MsVUFBVUM7SUFFaEUsT0FBT0M7QUFDVDtBQUVPLFNBQVNULFdBQVdXLEtBQUssRUFBRU4sS0FBSyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUztJQUNqRSxJQUFJQztJQUVKLElBQU1DLFFBQVE7SUFFZEQsU0FBU0csaUJBQWlCRixPQUFPQyxPQUFPTixPQUFPQyxPQUFPQyxVQUFVQztJQUVoRSxPQUFPQztBQUNUO0FBRUEsU0FBU0csaUJBQWlCRixLQUFLLEVBQUVDLEtBQUssRUFBRU4sS0FBSyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUztJQUN2RSxJQUFJQztJQUVKLElBQU1JLGNBQWNGLE1BQU1HLE1BQU07SUFFaEMsSUFBSUosVUFBVUcsYUFBYTtRQUN6QkosU0FBUyxBQUFDRixhQUFhLE9BQ1pBLGFBQ0U7SUFDZixPQUFPO1FBQ0wsSUFBTUgsT0FBT08sS0FBSyxDQUFDRCxNQUFNLEVBQ25CSyxnQkFBZ0IsQUFBQ1AsY0FBYyxPQUNiSixLQUFLWSxXQUFXLEtBQ2Q7UUFFMUJOO1FBRUFELFNBQVNNLGdCQUNFRSx1QkFBdUJiLE1BQU1NLE9BQU9DLE9BQU9OLE9BQU9DLE9BQU9DLFVBQVVDLGFBQ2pFVSwwQkFBMEJkLE1BQU1NLE9BQU9DLE9BQU9OLE9BQU9DLE9BQU9DLFVBQVVDO0lBQ3JGO0lBRUEsT0FBT0M7QUFDVDtBQUVBLFNBQVNRLHVCQUF1QmIsSUFBSSxFQUFFTSxLQUFLLEVBQUVDLEtBQUssRUFBRU4sS0FBSyxFQUFFQyxLQUFLLEVBQUVDLFFBQVEsRUFBRUMsU0FBUztJQUNuRixJQUFJQztJQUVKLElBQU1VLFlBQVksRUFBRTtJQUVwQlgsWUFBWTtRQUNWLElBQUlDO1FBRUpOLE1BQU1nQjtRQUVOLElBQU1kLFVBQVFjLFdBQVksR0FBRztRQUU3QlYsU0FBU0csaUJBQWlCRixPQUFPQyxPQUFPTixTQUFPQyxPQUFPQyxVQUFVQztRQUVoRSxPQUFPQztJQUNUO0lBRUFBLFNBQVNMLEtBQUtnQixLQUFLLENBQUNmLE9BQU9DLE9BQU9DLFVBQVVDO0lBRTVDLElBQUlDLFFBQVE7UUFDVlIsS0FBS0ksT0FBT2M7SUFDZDtJQUVBLE9BQU9WO0FBQ1Q7QUFFQSxTQUFTUywwQkFBMEJkLElBQUksRUFBRU0sS0FBSyxFQUFFQyxLQUFLLEVBQUVOLEtBQUssRUFBRUMsS0FBSyxFQUFFQyxRQUFRLEVBQUVDLFNBQVM7SUFDdEYsSUFBSUM7SUFFSkEsU0FBU0wsS0FBS2dCLEtBQUssQ0FBQ2YsT0FBT0MsT0FBT0MsVUFBVUM7SUFFNUMsSUFBSUMsUUFBUTtRQUNWQSxTQUFTRyxpQkFBaUJGLE9BQU9DLE9BQU9OLE9BQU9DLE9BQU9DLFVBQVVDO0lBQ2xFO0lBRUEsT0FBT0M7QUFDVCJ9
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "occam-parsers",
|
|
3
3
|
"author": "James Smith",
|
|
4
|
-
"version": "23.0.
|
|
4
|
+
"version": "23.0.54",
|
|
5
5
|
"license": "MIT, Anti-996",
|
|
6
6
|
"homepage": "https://github.com/djalbat/occam-parsers",
|
|
7
7
|
"description": "Occam's parsers.",
|
|
@@ -16,8 +16,8 @@
|
|
|
16
16
|
"devDependencies": {
|
|
17
17
|
"@swc/core": "^1.5.6",
|
|
18
18
|
"easy": "^23.0.1",
|
|
19
|
-
"easy-layout": "^6.0.
|
|
20
|
-
"easy-with-style": "^3.0.
|
|
19
|
+
"easy-layout": "^6.0.216",
|
|
20
|
+
"easy-with-style": "^3.0.438",
|
|
21
21
|
"esbuild": "^0.9.6",
|
|
22
22
|
"express": "^4.17.1",
|
|
23
23
|
"juxtapose": "^4.0.117",
|
package/src/bnf/bnf.js
CHANGED
|
@@ -22,7 +22,7 @@ const bnf = `
|
|
|
22
22
|
|
|
23
23
|
| sequenceOfParts
|
|
24
24
|
|
|
25
|
-
| ruleName
|
|
25
|
+
| ruleName callAheadModifier?
|
|
26
26
|
|
|
27
27
|
;
|
|
28
28
|
|
|
@@ -80,7 +80,7 @@ const bnf = `
|
|
|
80
80
|
|
|
81
81
|
opacityModifier ::= <NO_WHITESPACE>( "." | ".." );
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
callAheadModifier ::= <NO_WHITESPACE>"..." ;
|
|
84
84
|
|
|
85
85
|
optionalQuantifier ::= <NO_WHITESPACE>"?" ;
|
|
86
86
|
|
package/src/bnf/parser.js
CHANGED
|
@@ -24,7 +24,7 @@ import NonTerminalPartRule from "../rule/nonTerminalPart";
|
|
|
24
24
|
import SequenceOfPartsRule from "../rule/sequenceOfParts";
|
|
25
25
|
import OpacityModifierRule from "../rule/opacityModifier";
|
|
26
26
|
import NoWhitespacePartRule from "../rule/noWhitespacePart";
|
|
27
|
-
import
|
|
27
|
+
import CallAheadModifierRule from "../rule/callAheadModifier";
|
|
28
28
|
import RegularExpressionRule from "../rule/regularExpression";
|
|
29
29
|
import OptionalQuantifierRule from "../rule/optionalQuantifier";
|
|
30
30
|
import StartOfContentPartRule from "../rule/startOfContentPart";
|
|
@@ -93,7 +93,7 @@ export default class BNFParser {
|
|
|
93
93
|
opacityModifierRule = OpacityModifierRule.fromNothing(),
|
|
94
94
|
noWhitespacePartRule = NoWhitespacePartRule.fromNothing(),
|
|
95
95
|
regularExpressionRule = RegularExpressionRule.fromNothing(),
|
|
96
|
-
|
|
96
|
+
callAheadModifierRule = CallAheadModifierRule.fromNothing(),
|
|
97
97
|
optionalQuantifierRule = OptionalQuantifierRule.fromNothing(),
|
|
98
98
|
startOfContentPartRule = StartOfContentPartRule.fromNothing(),
|
|
99
99
|
oneOrMoreQuantifierRule = OneOrMoreQuantifierRule.fromNothing(),
|
|
@@ -124,7 +124,7 @@ export default class BNFParser {
|
|
|
124
124
|
epsilonRule,
|
|
125
125
|
quantifierRule,
|
|
126
126
|
opacityModifierRule,
|
|
127
|
-
|
|
127
|
+
callAheadModifierRule,
|
|
128
128
|
optionalQuantifierRule,
|
|
129
129
|
oneOrMoreQuantifierRule,
|
|
130
130
|
zeroOrMoreQuantifierRule,
|
|
@@ -8,7 +8,7 @@ import TerminalSymbolPart from "../part/terminal/terminalSymbol";
|
|
|
8
8
|
|
|
9
9
|
const { ellipsis } = specialSymbols;
|
|
10
10
|
|
|
11
|
-
export default class
|
|
11
|
+
export default class CallAheadModifierRuleDefinition extends Definition {
|
|
12
12
|
static fromNothing() {
|
|
13
13
|
const content = ellipsis, ///
|
|
14
14
|
noWhitespacePart = NoWhitespacePart.fromNothing(),
|
|
@@ -18,8 +18,8 @@ export default class LookAheadModifierRuleDefinition extends Definition {
|
|
|
18
18
|
terminalSymbolPart
|
|
19
19
|
],
|
|
20
20
|
precedence = null,
|
|
21
|
-
|
|
21
|
+
callAheadModifierRuleDefinition = new CallAheadModifierRuleDefinition(parts, precedence);
|
|
22
22
|
|
|
23
|
-
return
|
|
23
|
+
return callAheadModifierRuleDefinition;
|
|
24
24
|
}
|
|
25
25
|
}
|
|
@@ -4,16 +4,16 @@ import Definition from "../../../definition";
|
|
|
4
4
|
import RuleNamePart from "../../../part/nonTerminal/ruleName";
|
|
5
5
|
import OptionalPartPart from "../../../part/nonTerminal/optionalPart";
|
|
6
6
|
|
|
7
|
-
import { ruleNameRuleName,
|
|
7
|
+
import { ruleNameRuleName, callAheadModifierRuleName } from "../../../ruleNames";
|
|
8
8
|
|
|
9
9
|
export default class RuleNameNonTerminalPartRuleDefinition extends Definition {
|
|
10
10
|
static fromNothing() {
|
|
11
11
|
const ruleNameRuleNamePart = RuleNamePart.fromRuleName(ruleNameRuleName),
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
callAheadModifierRuleNamePart = RuleNamePart.fromRuleName(callAheadModifierRuleName),
|
|
13
|
+
optionalCallAheadRuleNamePartPart = OptionalPartPart.fromPart(callAheadModifierRuleNamePart),
|
|
14
14
|
parts = [
|
|
15
15
|
ruleNameRuleNamePart,
|
|
16
|
-
|
|
16
|
+
optionalCallAheadRuleNamePartPart
|
|
17
17
|
],
|
|
18
18
|
precedence = null,
|
|
19
19
|
ruleNameNonTerminalPartRuleDefinition = new RuleNameNonTerminalPartRuleDefinition(parts, precedence);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const bnf = `
|
|
4
|
+
|
|
5
|
+
S ::= A... <END_OF_LINE> ;
|
|
6
|
+
|
|
7
|
+
A ::= T ":" . ;
|
|
8
|
+
|
|
9
|
+
T ::= T_ T~* ;
|
|
10
|
+
|
|
11
|
+
B ::= T_ T~* B~T ;
|
|
12
|
+
|
|
13
|
+
V ::= . ;
|
|
14
|
+
|
|
15
|
+
T_ ::= V ;
|
|
16
|
+
|
|
17
|
+
T~B ::= ":" B ;
|
|
18
|
+
|
|
19
|
+
B~T ::= ε ;
|
|
20
|
+
|
|
21
|
+
T~ ::= B~T B~* T~B ;
|
|
22
|
+
|
|
23
|
+
B~ ::= T~B T~* B~T ;
|
|
24
|
+
|
|
25
|
+
`;
|
|
26
|
+
|
|
27
|
+
export default bnf;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { CommonLexer, BasicLexer as BasicLexerBase, EndOfLineSignificantToken } from "occam-lexers";
|
|
4
|
+
|
|
5
|
+
import entries from "./entries";
|
|
6
|
+
|
|
7
|
+
export default class BasicLexer extends BasicLexerBase {
|
|
8
|
+
static entries = entries;
|
|
9
|
+
|
|
10
|
+
static EndOfLineToken = EndOfLineSignificantToken; ///
|
|
11
|
+
|
|
12
|
+
static fromNothing() { return CommonLexer.fromNothing(BasicLexer); }
|
|
13
|
+
|
|
14
|
+
static fromRules(rules) { return CommonLexer.fromRules(BasicLexer, rules); }
|
|
15
|
+
|
|
16
|
+
static fromEntries(entries) { return CommonLexer.fromEntries(BasicLexer, entries); }
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { CommonParser, BasicParser as BasicParserBase } from "../../index"; ///
|
|
4
|
+
|
|
5
|
+
import bnf from "./bnf";
|
|
6
|
+
|
|
7
|
+
export default class BasicParser extends BasicParserBase {
|
|
8
|
+
static bnf = bnf;
|
|
9
|
+
|
|
10
|
+
static fromNothing() { return CommonParser.fromNothing(BasicParser); }
|
|
11
|
+
|
|
12
|
+
static fromBNF(bnf) { return CommonParser.fromBNF(BasicParser, bnf); }
|
|
13
|
+
|
|
14
|
+
static fromRules(rules) { return CommonParser.fromRules(BasicParser, rules); }
|
|
15
|
+
}
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
import { BasicLexer } from "occam-lexers";
|
|
4
|
-
import { BasicParser } from "../../index"; ///
|
|
5
|
-
|
|
6
3
|
import View from "../view";
|
|
4
|
+
import BasicLexer from "../basic/lexer";
|
|
5
|
+
import BasicParser from "../basic/parser";
|
|
7
6
|
|
|
8
7
|
const { bnf } = BasicParser,
|
|
9
8
|
{ entries } = BasicLexer;
|
|
10
9
|
|
|
11
|
-
const basicLexer = BasicLexer.fromEntries(entries),
|
|
12
|
-
basicParser = BasicParser.fromBNF(bnf);
|
|
13
|
-
|
|
14
10
|
export default class BasicView extends View {
|
|
15
11
|
getTokens(content) {
|
|
16
|
-
const
|
|
12
|
+
const lexicalEntries = this.getLexicalEntries(),
|
|
13
|
+
entries = lexicalEntries, ///
|
|
14
|
+
basicLexer = BasicLexer.fromEntries(entries),
|
|
15
|
+
tokens = basicLexer.tokenise(content);
|
|
17
16
|
|
|
18
17
|
return tokens;
|
|
19
18
|
}
|
|
20
19
|
|
|
21
20
|
getNode(tokens) {
|
|
21
|
+
const bnf = this.getBNF(),
|
|
22
|
+
basicParser = BasicParser.fromBNF(bnf);
|
|
23
|
+
|
|
22
24
|
const node = basicParser.parse(tokens);
|
|
23
25
|
|
|
24
26
|
return node;
|
|
@@ -28,8 +30,8 @@ export default class BasicView extends View {
|
|
|
28
30
|
this.assignContext();
|
|
29
31
|
|
|
30
32
|
const { initialContent } = this.constructor,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
+
lexicalEntries = entries, ///
|
|
34
|
+
content = initialContent; ///
|
|
33
35
|
|
|
34
36
|
this.setBNF(bnf);
|
|
35
37
|
|
|
@@ -40,7 +42,8 @@ export default class BasicView extends View {
|
|
|
40
42
|
this.keyUpHandler();
|
|
41
43
|
}
|
|
42
44
|
|
|
43
|
-
static initialContent =
|
|
45
|
+
static initialContent = `f:x:y
|
|
46
|
+
`;
|
|
44
47
|
|
|
45
48
|
static defaultProperties = {
|
|
46
49
|
className: "basic"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import NonTerminalNode from "../../node/nonTerminal";
|
|
4
|
+
|
|
5
|
+
export default class CallAheadModifierBNFNode extends NonTerminalNode {
|
|
6
|
+
static fromRuleNameChildNodesAndCallAhead(ruleName, childNode, opacity) { return NonTerminalNode.fromRuleNameChildNodesAndCallAhead(CallAheadModifierBNFNode, ruleName, childNode, opacity); }
|
|
7
|
+
}
|
|
@@ -7,14 +7,14 @@ import { partChoiceRuleName } from "../../ruleNames";
|
|
|
7
7
|
import { nodesFromChildNodesAndRuleName } from "../../utilities/node";
|
|
8
8
|
|
|
9
9
|
export default class ChoiceOfPartsBNFNode extends NonTerminalNode {
|
|
10
|
-
generatePart(
|
|
10
|
+
generatePart(callAhead) {
|
|
11
11
|
const childNodes = this.getChildNodes(),
|
|
12
12
|
partChoiceBNFNodes = nodesFromChildNodesAndRuleName(childNodes, partChoiceRuleName);
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
callAhead = false; ///
|
|
15
15
|
|
|
16
16
|
const partChoices = partChoiceBNFNodes.map((partChoiceBNFNode) => {
|
|
17
|
-
const partChoice = partChoiceBNFNode.generatePartChoice(
|
|
17
|
+
const partChoice = partChoiceBNFNode.generatePartChoice(callAhead);
|
|
18
18
|
|
|
19
19
|
return partChoice;
|
|
20
20
|
}),
|
|
@@ -11,9 +11,9 @@ export default class DefinitionBNFNode extends NonTerminalNode {
|
|
|
11
11
|
const childNodes = this.getChildNodes(),
|
|
12
12
|
partBNFNodes = nodesFromChildNodesAndRuleName(childNodes, partRuleName),
|
|
13
13
|
precedenceBNFNode = nodeFromChildNodesAndRuleName(childNodes, precedenceRuleName),
|
|
14
|
-
|
|
14
|
+
callAhead = false, ///
|
|
15
15
|
parts = partBNFNodes.map((partBNFNode) => {
|
|
16
|
-
const part = partBNFNode.generatePart(
|
|
16
|
+
const part = partBNFNode.generatePart(callAhead);
|
|
17
17
|
|
|
18
18
|
return part;
|
|
19
19
|
}),
|
|
@@ -4,7 +4,7 @@ import EndOfLinePart from "../../part/terminal/endOfLine";
|
|
|
4
4
|
import NonTerminalNode from "../../node/nonTerminal";
|
|
5
5
|
|
|
6
6
|
export default class EndOfLineBNFNode extends NonTerminalNode {
|
|
7
|
-
generatePart(
|
|
7
|
+
generatePart(callAhead) {
|
|
8
8
|
const endOfLinePart = EndOfLinePart.fromNothing();
|
|
9
9
|
|
|
10
10
|
return endOfLinePart;
|
package/src/node/bnf/epsilon.js
CHANGED
|
@@ -4,7 +4,7 @@ import EpsilonPart from "../../part/terminal/epsilon";
|
|
|
4
4
|
import NonTerminalNode from "../../node/nonTerminal";
|
|
5
5
|
|
|
6
6
|
export default class EpsilonBNFNode extends NonTerminalNode {
|
|
7
|
-
generatePart(
|
|
7
|
+
generatePart(callAhead) {
|
|
8
8
|
const epsilonPart = EpsilonPart.fromNothing();
|
|
9
9
|
|
|
10
10
|
return epsilonPart;
|
|
@@ -4,7 +4,7 @@ import NonTerminalNode from "../../node/nonTerminal";
|
|
|
4
4
|
import NoWhitespacePart from "../../part/terminal/noWhitespace";
|
|
5
5
|
|
|
6
6
|
export default class NoWhitespacePartBNFNode extends NonTerminalNode {
|
|
7
|
-
generatePart(
|
|
7
|
+
generatePart(callAhead) {
|
|
8
8
|
const noWhitespacePart = NoWhitespacePart.fromNothing();
|
|
9
9
|
|
|
10
10
|
return noWhitespacePart;
|
|
@@ -4,24 +4,24 @@ import { arrayUtilities } from "necessary";
|
|
|
4
4
|
|
|
5
5
|
import NonTerminalNode from "../../../node/nonTerminal";
|
|
6
6
|
|
|
7
|
-
import {
|
|
7
|
+
import { callAheadModifierRuleName } from "../../../ruleNames";
|
|
8
8
|
import { nodeFromChildNodesAndRuleName } from "../../../utilities/node";
|
|
9
9
|
|
|
10
10
|
const { first } = arrayUtilities;
|
|
11
11
|
|
|
12
12
|
export default class NonTerminalPartBNFNode extends NonTerminalNode {
|
|
13
|
-
generatePart(
|
|
13
|
+
generatePart(callAhead) {
|
|
14
14
|
const childNodes = this.getChildNodes();
|
|
15
15
|
|
|
16
|
-
if (!
|
|
17
|
-
const
|
|
16
|
+
if (!callAhead) {
|
|
17
|
+
const callAheadModifierBNFNode = nodeFromChildNodesAndRuleName(childNodes, callAheadModifierRuleName);
|
|
18
18
|
|
|
19
|
-
|
|
19
|
+
callAhead = (callAheadModifierBNFNode !== null);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
const firstChildNode = first(childNodes),
|
|
23
23
|
node = firstChildNode, ///
|
|
24
|
-
part = node.generatePart(
|
|
24
|
+
part = node.generatePart(callAhead);
|
|
25
25
|
|
|
26
26
|
return part;
|
|
27
27
|
}
|
|
@@ -7,11 +7,11 @@ import NonTerminalNode from "../../../node/nonTerminal";
|
|
|
7
7
|
const { first } = arrayUtilities;
|
|
8
8
|
|
|
9
9
|
export default class TerminalPartBNFNode extends NonTerminalNode {
|
|
10
|
-
generatePart(
|
|
10
|
+
generatePart(callAhead) {
|
|
11
11
|
const childNodes = this.getChildNodes(),
|
|
12
12
|
firstChildNode = first(childNodes),
|
|
13
13
|
node = firstChildNode, ///
|
|
14
|
-
part = node.generatePart(
|
|
14
|
+
part = node.generatePart(callAhead);
|
|
15
15
|
|
|
16
16
|
return part;
|
|
17
17
|
}
|
package/src/node/bnf/part.js
CHANGED
|
@@ -13,7 +13,7 @@ import { optionalQuantifierRuleName, oneOrMoreQuantifierRuleName, zeroOrMoreQuan
|
|
|
13
13
|
const { last } = arrayUtilities;
|
|
14
14
|
|
|
15
15
|
export default class PartBNFNode extends NonTerminalNode {
|
|
16
|
-
generatePart(
|
|
16
|
+
generatePart(callAhead) {
|
|
17
17
|
const childNodes = this.getChildNodes(),
|
|
18
18
|
nodes = childNodes.slice(),
|
|
19
19
|
part = partFromNodes(nodes);
|
|
@@ -25,15 +25,15 @@ export default class PartBNFNode extends NonTerminalNode {
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
function partFromNodes(nodes) {
|
|
28
|
-
let part
|
|
28
|
+
let part;
|
|
29
29
|
|
|
30
30
|
const nodesLength = nodes.length;
|
|
31
31
|
|
|
32
32
|
if (nodesLength === 1) {
|
|
33
33
|
const node = nodes.pop(),
|
|
34
|
-
|
|
34
|
+
callAhead = false;
|
|
35
35
|
|
|
36
|
-
part = node.generatePart(
|
|
36
|
+
part = node.generatePart(callAhead);
|
|
37
37
|
} else {
|
|
38
38
|
const lastNodeQuantifierNode = isLastNodeQuantifierNode(nodes);
|
|
39
39
|
|
|
@@ -7,14 +7,14 @@ import { nodeFromChildNodesAndRuleName } from "../../utilities/node";
|
|
|
7
7
|
import { partRuleName, precedenceRuleName } from "../../ruleNames";
|
|
8
8
|
|
|
9
9
|
export default class PartChoiceBNFNode extends NonTerminalNode {
|
|
10
|
-
generatePartChoice(
|
|
10
|
+
generatePartChoice(callAhead) {
|
|
11
11
|
const childNodes = this.getChildNodes(),
|
|
12
12
|
partBNFNode = nodeFromChildNodesAndRuleName(childNodes, partRuleName),
|
|
13
13
|
precedenceBNFNode = nodeFromChildNodesAndRuleName(childNodes, precedenceRuleName);
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
callAhead = false; ///
|
|
16
16
|
|
|
17
|
-
const part = partBNFNode.generatePart(
|
|
17
|
+
const part = partBNFNode.generatePart(callAhead),
|
|
18
18
|
precedence = (precedenceBNFNode === null) ?
|
|
19
19
|
null :
|
|
20
20
|
precedenceBNFNode.getPrecedence(),
|
|
@@ -10,7 +10,7 @@ const { first, second } = arrayUtilities;
|
|
|
10
10
|
export default class RegularExpressionBNFNode extends NonTerminalNode {
|
|
11
11
|
regularExpression = /^\/((?:\\.|[^\/])*)\/$/;
|
|
12
12
|
|
|
13
|
-
generatePart(
|
|
13
|
+
generatePart(callAhead) {
|
|
14
14
|
const regularExpression = this.getRegularExpression(),
|
|
15
15
|
regularExpressionPart = RegularExpressionPart.fromRegularExpression(regularExpression);
|
|
16
16
|
|
package/src/node/bnf/ruleName.js
CHANGED
|
@@ -8,13 +8,13 @@ import NonTerminalNode from "../../node/nonTerminal";
|
|
|
8
8
|
const { first } = arrayUtilities;
|
|
9
9
|
|
|
10
10
|
export default class RuleNameBNFNode extends NonTerminalNode {
|
|
11
|
-
generatePart(
|
|
11
|
+
generatePart(callAhead) {
|
|
12
12
|
const childNodes = this.getChildNodes(),
|
|
13
13
|
firstChildNode = first(childNodes),
|
|
14
14
|
terminalNode = firstChildNode, ///
|
|
15
15
|
terminalNodeContent = terminalNode.getContent(),
|
|
16
16
|
ruleName = terminalNodeContent, ///
|
|
17
|
-
ruleNamePart = RuleNamePart.
|
|
17
|
+
ruleNamePart = RuleNamePart.fromCallAheadAndRuleName(callAhead, ruleName);
|
|
18
18
|
|
|
19
19
|
return ruleNamePart;
|
|
20
20
|
}
|
|
@@ -7,14 +7,14 @@ import { partRuleName } from "../../ruleNames";
|
|
|
7
7
|
import { nodesFromChildNodesAndRuleName } from "../../utilities/node";
|
|
8
8
|
|
|
9
9
|
export default class SequenceOfPartsBNFNode extends NonTerminalNode {
|
|
10
|
-
generatePart(
|
|
10
|
+
generatePart(callAhead) {
|
|
11
11
|
const childNodes = this.getChildNodes(),
|
|
12
12
|
partBNFNodes = nodesFromChildNodesAndRuleName(childNodes, partRuleName);
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
callAhead = false; ///
|
|
15
15
|
|
|
16
16
|
const parts = partBNFNodes.map((partBNFNode) => {
|
|
17
|
-
const part = partBNFNode.generatePart(
|
|
17
|
+
const part = partBNFNode.generatePart(callAhead);
|
|
18
18
|
|
|
19
19
|
return part;
|
|
20
20
|
}),
|
|
@@ -10,7 +10,7 @@ const { first, second } = arrayUtilities;
|
|
|
10
10
|
export default class SignificantTokenTypeBNFNode extends NonTerminalNode {
|
|
11
11
|
regularExpression = /^\[([^\]]+)]$/;
|
|
12
12
|
|
|
13
|
-
generatePart(
|
|
13
|
+
generatePart(callAhead) {
|
|
14
14
|
const significantTokenType = this.getSignificantTokenType(),
|
|
15
15
|
significantTokenTypePart = SignificantTokenTypePart.fromSignificantTokenType(significantTokenType);
|
|
16
16
|
|
|
@@ -4,7 +4,7 @@ import NonTerminalNode from "../../node/nonTerminal";
|
|
|
4
4
|
import StartOfContentPart from "../../part/terminal/startOfContent";
|
|
5
5
|
|
|
6
6
|
export default class StartOfContentPartBNFNode extends NonTerminalNode {
|
|
7
|
-
generatePart(
|
|
7
|
+
generatePart(callAhead) {
|
|
8
8
|
const startOfContentPart = StartOfContentPart.fromNothing();
|
|
9
9
|
|
|
10
10
|
return startOfContentPart;
|