occam-grammars 1.0.787 → 1.2.1
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 +4861 -504
- package/index.html +3 -0
- package/lib/example/view/customGrammarBNF.js +2 -29
- package/lib/example/view/furtle.js +148 -0
- package/lib/example.js +5 -1
- package/lib/furtle/bnf.js +14 -0
- package/lib/furtle/entries.js +39 -0
- package/lib/furtle/lexer.js +148 -0
- package/lib/{basic → furtle}/parser.js +13 -13
- package/lib/index.js +25 -25
- package/lib/utilities/lexers.js +35 -0
- package/lib/utilities/parsers.js +40 -0
- package/package.json +2 -1
- package/src/example/view/customGrammarBNF.js +5 -22
- package/src/example/view/furtle.js +137 -0
- package/src/example.js +2 -0
- package/src/furtle/bnf.js +193 -0
- package/src/furtle/entries.js +30 -0
- package/src/{basic → furtle}/lexer.js +12 -14
- package/src/furtle/parser.js +15 -0
- package/src/index.js +3 -2
- package/src/utilities/lexers.js +19 -0
- package/src/utilities/parsers.js +27 -0
- package/lib/basic/bnf.js +0 -15
- package/lib/basic/entries.js +0 -15
- package/lib/basic/lexer.js +0 -150
- package/src/basic/bnf.js +0 -7
- package/src/basic/entries.js +0 -7
- package/src/basic/parser.js +0 -15
package/lib/index.js
CHANGED
|
@@ -9,23 +9,17 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
-
BasicLexer: function() {
|
|
13
|
-
return _lexer2.default;
|
|
14
|
-
},
|
|
15
|
-
BasicParser: function() {
|
|
16
|
-
return _parser2.default;
|
|
17
|
-
},
|
|
18
12
|
CustomGrammarBNFLexer: function() {
|
|
19
|
-
return
|
|
13
|
+
return _lexer4.default;
|
|
20
14
|
},
|
|
21
15
|
CustomGrammarBNFParser: function() {
|
|
22
|
-
return
|
|
16
|
+
return _parser4.default;
|
|
23
17
|
},
|
|
24
18
|
CustomGrammarPatternLexer: function() {
|
|
25
|
-
return
|
|
19
|
+
return _lexer5.default;
|
|
26
20
|
},
|
|
27
21
|
CustomGrammarPatternParser: function() {
|
|
28
|
-
return
|
|
22
|
+
return _parser5.default;
|
|
29
23
|
},
|
|
30
24
|
JSONLexer: function() {
|
|
31
25
|
return _lexer1.default;
|
|
@@ -34,42 +28,48 @@ _export(exports, {
|
|
|
34
28
|
return _parser1.default;
|
|
35
29
|
},
|
|
36
30
|
NominalLexer: function() {
|
|
37
|
-
return
|
|
31
|
+
return _lexer2.default;
|
|
38
32
|
},
|
|
39
33
|
NominalParser: function() {
|
|
40
|
-
return
|
|
34
|
+
return _parser2.default;
|
|
41
35
|
},
|
|
42
36
|
PlainTextLexer: function() {
|
|
43
|
-
return
|
|
37
|
+
return _lexer3.default;
|
|
44
38
|
},
|
|
45
39
|
PlainTextParser: function() {
|
|
46
|
-
return
|
|
40
|
+
return _parser3.default;
|
|
47
41
|
},
|
|
48
42
|
TeXLexer: function() {
|
|
49
43
|
return _lexer.default;
|
|
50
44
|
},
|
|
51
45
|
TeXParser: function() {
|
|
52
46
|
return _parser.default;
|
|
47
|
+
},
|
|
48
|
+
lexersUtilities: function() {
|
|
49
|
+
return _lexers.default;
|
|
50
|
+
},
|
|
51
|
+
parsersUtilities: function() {
|
|
52
|
+
return _parsers.default;
|
|
53
53
|
}
|
|
54
54
|
});
|
|
55
|
+
var _lexers = /*#__PURE__*/ _interop_require_default(require("./utilities/lexers"));
|
|
56
|
+
var _parsers = /*#__PURE__*/ _interop_require_default(require("./utilities/parsers"));
|
|
55
57
|
var _lexer = /*#__PURE__*/ _interop_require_default(require("./teX/lexer"));
|
|
56
58
|
var _lexer1 = /*#__PURE__*/ _interop_require_default(require("./json/lexer"));
|
|
57
|
-
var _lexer2 = /*#__PURE__*/ _interop_require_default(require("./
|
|
58
|
-
var _lexer3 = /*#__PURE__*/ _interop_require_default(require("./
|
|
59
|
-
var _lexer4 = /*#__PURE__*/ _interop_require_default(require("./
|
|
60
|
-
var _lexer5 = /*#__PURE__*/ _interop_require_default(require("./
|
|
61
|
-
var _lexer6 = /*#__PURE__*/ _interop_require_default(require("./customGrammarPattern/lexer"));
|
|
59
|
+
var _lexer2 = /*#__PURE__*/ _interop_require_default(require("./nominal/lexer"));
|
|
60
|
+
var _lexer3 = /*#__PURE__*/ _interop_require_default(require("./plainText/lexer"));
|
|
61
|
+
var _lexer4 = /*#__PURE__*/ _interop_require_default(require("./customGrammarBNF/lexer"));
|
|
62
|
+
var _lexer5 = /*#__PURE__*/ _interop_require_default(require("./customGrammarPattern/lexer"));
|
|
62
63
|
var _parser = /*#__PURE__*/ _interop_require_default(require("./teX/parser"));
|
|
63
64
|
var _parser1 = /*#__PURE__*/ _interop_require_default(require("./json/parser"));
|
|
64
|
-
var _parser2 = /*#__PURE__*/ _interop_require_default(require("./
|
|
65
|
-
var _parser3 = /*#__PURE__*/ _interop_require_default(require("./
|
|
66
|
-
var _parser4 = /*#__PURE__*/ _interop_require_default(require("./
|
|
67
|
-
var _parser5 = /*#__PURE__*/ _interop_require_default(require("./
|
|
68
|
-
var _parser6 = /*#__PURE__*/ _interop_require_default(require("./customGrammarPattern/parser"));
|
|
65
|
+
var _parser2 = /*#__PURE__*/ _interop_require_default(require("./nominal/parser"));
|
|
66
|
+
var _parser3 = /*#__PURE__*/ _interop_require_default(require("./plainText/parser"));
|
|
67
|
+
var _parser4 = /*#__PURE__*/ _interop_require_default(require("./customGrammarBNF/parser"));
|
|
68
|
+
var _parser5 = /*#__PURE__*/ _interop_require_default(require("./customGrammarPattern/parser"));
|
|
69
69
|
function _interop_require_default(obj) {
|
|
70
70
|
return obj && obj.__esModule ? obj : {
|
|
71
71
|
default: obj
|
|
72
72
|
};
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuZXhwb3J0IHsgZGVmYXVsdCBhcyBsZXhlcnNVdGlsaXRpZXMgfSBmcm9tIFwiLi91dGlsaXRpZXMvbGV4ZXJzXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlcnNVdGlsaXRpZXMgfSBmcm9tIFwiLi91dGlsaXRpZXMvcGFyc2Vyc1wiO1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIFRlWExleGVyIH0gZnJvbSBcIi4vdGVYL2xleGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEpTT05MZXhlciB9IGZyb20gXCIuL2pzb24vbGV4ZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTm9taW5hbExleGVyIH0gZnJvbSBcIi4vbm9taW5hbC9sZXhlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFpblRleHRMZXhlciB9IGZyb20gXCIuL3BsYWluVGV4dC9sZXhlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21HcmFtbWFyQk5GTGV4ZXIgfSBmcm9tIFwiLi9jdXN0b21HcmFtbWFyQk5GL2xleGVyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEN1c3RvbUdyYW1tYXJQYXR0ZXJuTGV4ZXIgfSBmcm9tIFwiLi9jdXN0b21HcmFtbWFyUGF0dGVybi9sZXhlclwiO1xuXG5leHBvcnQgeyBkZWZhdWx0IGFzIFRlWFBhcnNlciB9IGZyb20gXCIuL3RlWC9wYXJzZXJcIjtcbmV4cG9ydCB7IGRlZmF1bHQgYXMgSlNPTlBhcnNlciB9IGZyb20gXCIuL2pzb24vcGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIE5vbWluYWxQYXJzZXIgfSBmcm9tIFwiLi9ub21pbmFsL3BhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBQbGFpblRleHRQYXJzZXIgfSBmcm9tIFwiLi9wbGFpblRleHQvcGFyc2VyXCI7XG5leHBvcnQgeyBkZWZhdWx0IGFzIEN1c3RvbUdyYW1tYXJCTkZQYXJzZXIgfSBmcm9tIFwiLi9jdXN0b21HcmFtbWFyQk5GL3BhcnNlclwiO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBDdXN0b21HcmFtbWFyUGF0dGVyblBhcnNlciB9IGZyb20gXCIuL2N1c3RvbUdyYW1tYXJQYXR0ZXJuL3BhcnNlclwiO1xuIl0sIm5hbWVzIjpbIkN1c3RvbUdyYW1tYXJCTkZMZXhlciIsIkN1c3RvbUdyYW1tYXJCTkZQYXJzZXIiLCJDdXN0b21HcmFtbWFyUGF0dGVybkxleGVyIiwiQ3VzdG9tR3JhbW1hclBhdHRlcm5QYXJzZXIiLCJKU09OTGV4ZXIiLCJKU09OUGFyc2VyIiwiTm9taW5hbExleGVyIiwiTm9taW5hbFBhcnNlciIsIlBsYWluVGV4dExleGVyIiwiUGxhaW5UZXh0UGFyc2VyIiwiVGVYTGV4ZXIiLCJUZVhQYXJzZXIiLCJsZXhlcnNVdGlsaXRpZXMiLCJwYXJzZXJzVXRpbGl0aWVzIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUFTb0JBLHFCQUFxQjtlQUFyQkEsZUFBcUI7O0lBT3JCQyxzQkFBc0I7ZUFBdEJBLGdCQUFzQjs7SUFOdEJDLHlCQUF5QjtlQUF6QkEsZUFBeUI7O0lBT3pCQywwQkFBMEI7ZUFBMUJBLGdCQUEwQjs7SUFYMUJDLFNBQVM7ZUFBVEEsZUFBUzs7SUFPVEMsVUFBVTtlQUFWQSxnQkFBVTs7SUFOVkMsWUFBWTtlQUFaQSxlQUFZOztJQU9aQyxhQUFhO2VBQWJBLGdCQUFhOztJQU5iQyxjQUFjO2VBQWRBLGVBQWM7O0lBT2RDLGVBQWU7ZUFBZkEsZ0JBQWU7O0lBVmZDLFFBQVE7ZUFBUkEsY0FBUTs7SUFPUkMsU0FBUztlQUFUQSxlQUFTOztJQVZUQyxlQUFlO2VBQWZBLGVBQWU7O0lBQ2ZDLGdCQUFnQjtlQUFoQkEsZ0JBQWdCOzs7NkRBRE87OERBQ0M7NERBRVI7NkRBQ0M7NkRBQ0c7NkRBQ0U7NkRBQ087NkRBQ0k7NkRBRWhCOzhEQUNDOzhEQUNHOzhEQUNFOzhEQUNPOzhEQUNJIn0=
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
default: function() {
|
|
13
|
+
return _default;
|
|
14
|
+
},
|
|
15
|
+
furtleLexerFromNothing: function() {
|
|
16
|
+
return furtleLexerFromNothing;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var _occamlexers = require("occam-lexers");
|
|
20
|
+
var _lexer = /*#__PURE__*/ _interop_require_default(require("../furtle/lexer"));
|
|
21
|
+
function _interop_require_default(obj) {
|
|
22
|
+
return obj && obj.__esModule ? obj : {
|
|
23
|
+
default: obj
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
var lexerFromRules = _occamlexers.lexerUtilities.lexerFromRules, rulesFromEntries = _occamlexers.lexerUtilities.rulesFromEntries;
|
|
27
|
+
function furtleLexerFromNothing() {
|
|
28
|
+
var entries = _lexer.default.entries, rules = rulesFromEntries(entries), furtleLexer = lexerFromRules(_lexer.default, rules);
|
|
29
|
+
return furtleLexer;
|
|
30
|
+
}
|
|
31
|
+
var _default = {
|
|
32
|
+
furtleLexerFromNothing: furtleLexerFromNothing
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvbGV4ZXJzLmpzIl0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5pbXBvcnQgeyBsZXhlclV0aWxpdGllcyB9IGZyb20gXCJvY2NhbS1sZXhlcnNcIjtcblxuaW1wb3J0IEZ1cnRsZUxleGVyIGZyb20gXCIuLi9mdXJ0bGUvbGV4ZXJcIjtcblxuY29uc3QgeyBsZXhlckZyb21SdWxlcywgcnVsZXNGcm9tRW50cmllcyB9ID0gbGV4ZXJVdGlsaXRpZXM7XG5cbmV4cG9ydCBmdW5jdGlvbiBmdXJ0bGVMZXhlckZyb21Ob3RoaW5nKCkge1xuICBjb25zdCB7IGVudHJpZXMgfSA9IEZ1cnRsZUxleGVyLFxuICAgICAgICBydWxlcyA9IHJ1bGVzRnJvbUVudHJpZXMoZW50cmllcyksXG4gICAgICAgIGZ1cnRsZUxleGVyID0gbGV4ZXJGcm9tUnVsZXMoRnVydGxlTGV4ZXIsIHJ1bGVzKTtcblxuICByZXR1cm4gZnVydGxlTGV4ZXI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgZnVydGxlTGV4ZXJGcm9tTm90aGluZ1xufTtcbiJdLCJuYW1lcyI6WyJmdXJ0bGVMZXhlckZyb21Ob3RoaW5nIiwibGV4ZXJGcm9tUnVsZXMiLCJsZXhlclV0aWxpdGllcyIsInJ1bGVzRnJvbUVudHJpZXMiLCJlbnRyaWVzIiwiRnVydGxlTGV4ZXIiLCJydWxlcyIsImZ1cnRsZUxleGVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7SUFnQkEsT0FFRTtlQUZGOztJQVJnQkEsc0JBQXNCO2VBQXRCQTs7OzJCQU5lOzREQUVQOzs7Ozs7QUFFeEIsSUFBUUMsaUJBQXFDQywyQkFBYyxDQUFuREQsZ0JBQWdCRSxtQkFBcUJELDJCQUFjLENBQW5DQztBQUVqQixTQUFTSDtJQUNkLElBQU0sQUFBRUksVUFBWUMsY0FBVyxDQUF2QkQsU0FDRkUsUUFBUUgsaUJBQWlCQyxVQUN6QkcsY0FBY04sZUFBZUksY0FBVyxFQUFFQztJQUVoRCxPQUFPQztBQUNUO0lBRUEsV0FBZTtJQUNiUCx3QkFBQUE7QUFDRiJ9
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
default: function() {
|
|
13
|
+
return _default;
|
|
14
|
+
},
|
|
15
|
+
furtleParserFromNothing: function() {
|
|
16
|
+
return furtleParserFromNothing;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
var _occamparsers = require("occam-parsers");
|
|
20
|
+
var _occamgrammarutilities = require("occam-grammar-utilities");
|
|
21
|
+
var _parser = /*#__PURE__*/ _interop_require_default(require("../furtle/parser"));
|
|
22
|
+
function _interop_require_default(obj) {
|
|
23
|
+
return obj && obj.__esModule ? obj : {
|
|
24
|
+
default: obj
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
var rulesFromBNF = _occamparsers.parserUtilities.rulesFromBNF, parserFromRules = _occamparsers.parserUtilities.parserFromRules;
|
|
28
|
+
function furtleParserFromNothing() {
|
|
29
|
+
var bnf = _parser.default.bnf;
|
|
30
|
+
var rules;
|
|
31
|
+
rules = rulesFromBNF(bnf);
|
|
32
|
+
rules = (0, _occamgrammarutilities.eliminateLeftRecursion)(rules); ///
|
|
33
|
+
var furtleParser = parserFromRules(_parser.default, rules);
|
|
34
|
+
return furtleParser;
|
|
35
|
+
}
|
|
36
|
+
var _default = {
|
|
37
|
+
furtleParserFromNothing: furtleParserFromNothing
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvcGFyc2Vycy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgcGFyc2VyVXRpbGl0aWVzIH0gZnJvbSBcIm9jY2FtLXBhcnNlcnNcIjtcbmltcG9ydCB7IGVsaW1pbmF0ZUxlZnRSZWN1cnNpb24gfSBmcm9tIFwib2NjYW0tZ3JhbW1hci11dGlsaXRpZXNcIjtcblxuaW1wb3J0IEZ1cnRsZVBhcnNlciBmcm9tIFwiLi4vZnVydGxlL3BhcnNlclwiO1xuXG5jb25zdCB7IHJ1bGVzRnJvbUJORiwgcGFyc2VyRnJvbVJ1bGVzIH0gPSBwYXJzZXJVdGlsaXRpZXM7XG5cbmV4cG9ydCBmdW5jdGlvbiBmdXJ0bGVQYXJzZXJGcm9tTm90aGluZygpIHtcbiAgY29uc3QgeyBibmYgfSA9IEZ1cnRsZVBhcnNlcjtcblxuICBsZXQgcnVsZXM7XG5cbiAgcnVsZXMgPSBydWxlc0Zyb21CTkYoYm5mKTtcblxuICBydWxlcyA9IGVsaW1pbmF0ZUxlZnRSZWN1cnNpb24ocnVsZXMpOyAgLy8vXG5cbiAgY29uc3QgZnVydGxlUGFyc2VyID0gcGFyc2VyRnJvbVJ1bGVzKEZ1cnRsZVBhcnNlciwgcnVsZXMpO1xuXG4gIHJldHVybiBmdXJ0bGVQYXJzZXI7XG59XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBmdXJ0bGVQYXJzZXJGcm9tTm90aGluZ1xufTtcbiJdLCJuYW1lcyI6WyJmdXJ0bGVQYXJzZXJGcm9tTm90aGluZyIsInJ1bGVzRnJvbUJORiIsInBhcnNlclV0aWxpdGllcyIsInBhcnNlckZyb21SdWxlcyIsImJuZiIsIkZ1cnRsZVBhcnNlciIsInJ1bGVzIiwiZWxpbWluYXRlTGVmdFJlY3Vyc2lvbiIsImZ1cnRsZVBhcnNlciJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O0lBd0JBLE9BRUU7ZUFGRjs7SUFmZ0JBLHVCQUF1QjtlQUF2QkE7Ozs0QkFQZ0I7cUNBQ087NkRBRWQ7Ozs7OztBQUV6QixJQUFRQyxlQUFrQ0MsNkJBQWUsQ0FBakRELGNBQWNFLGtCQUFvQkQsNkJBQWUsQ0FBbkNDO0FBRWYsU0FBU0g7SUFDZCxJQUFNLEFBQUVJLE1BQVFDLGVBQVksQ0FBcEJEO0lBRVIsSUFBSUU7SUFFSkEsUUFBUUwsYUFBYUc7SUFFckJFLFFBQVFDLElBQUFBLDZDQUFzQixFQUFDRCxRQUFTLEdBQUc7SUFFM0MsSUFBTUUsZUFBZUwsZ0JBQWdCRSxlQUFZLEVBQUVDO0lBRW5ELE9BQU9FO0FBQ1Q7SUFHQSxXQUFlO0lBQ2JSLHlCQUFBQTtBQUNGIn0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "occam-grammars",
|
|
3
3
|
"author": "James Smith",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.1",
|
|
5
5
|
"license": "MIT, Anti-996",
|
|
6
6
|
"homepage": "https://github.com/djalbat/occam-grammars",
|
|
7
7
|
"description": "Occam's grammars.",
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"express": "^4.17.1",
|
|
24
24
|
"juxtapose": "^4.0.108",
|
|
25
25
|
"lively-cli": "^2.0.65",
|
|
26
|
+
"occam-grammar-utilities": "^8.0.239",
|
|
26
27
|
"watchful-cli": "^1.7.56"
|
|
27
28
|
},
|
|
28
29
|
"scripts": {
|
|
@@ -5,23 +5,6 @@ import { CustomGrammarBNFLexer, CustomGrammarBNFParser } from "../../index"; //
|
|
|
5
5
|
import View from "../view";
|
|
6
6
|
|
|
7
7
|
export default class CustomGrammarBNFView extends View {
|
|
8
|
-
getParseTree(tokens) {
|
|
9
|
-
let parseTree = null;
|
|
10
|
-
|
|
11
|
-
const { Parser } = this.constructor,
|
|
12
|
-
parser = Parser.fromNothing(),
|
|
13
|
-
ruleName = this.getRuleName(),
|
|
14
|
-
ruleMap = parser.getRuleMap(),
|
|
15
|
-
rule = ruleMap[ruleName],
|
|
16
|
-
node = parser.parse(tokens, rule);
|
|
17
|
-
|
|
18
|
-
if (node !== null) {
|
|
19
|
-
parseTree = node.asParseTree(tokens);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
return parseTree;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
8
|
static Lexer = CustomGrammarBNFLexer;
|
|
26
9
|
|
|
27
10
|
static Parser = CustomGrammarBNFParser;
|
|
@@ -30,16 +13,16 @@ export default class CustomGrammarBNFView extends View {
|
|
|
30
13
|
|
|
31
14
|
static initialContent = `
|
|
32
15
|
|
|
33
|
-
|
|
16
|
+
term ::= operation ( <NO_WHITESPACE>"(" term ")" )? ;
|
|
34
17
|
|
|
35
18
|
|
|
36
|
-
|
|
19
|
+
operation ::= "insert"<NO_WHITESPACE>"(" term "," term ")"
|
|
37
20
|
|
|
38
|
-
|
|
21
|
+
| "delete"<NO_WHITESPACE>"(" term "," term ")"
|
|
39
22
|
|
|
40
|
-
|
|
23
|
+
| "empty"<NO_WHITESPACE>"("<NO_WHITESPACE>")"
|
|
41
24
|
|
|
42
|
-
|
|
25
|
+
;
|
|
43
26
|
`;
|
|
44
27
|
|
|
45
28
|
static defaultProperties = {
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { lexerUtilities } from "occam-lexers";
|
|
4
|
+
import { parserUtilities } from "occam-parsers";
|
|
5
|
+
import { eliminateLeftRecursion } from "occam-grammar-utilities";
|
|
6
|
+
import { FurtleLexer, FurtleParser } from "../../index"; ///
|
|
7
|
+
|
|
8
|
+
import View from "../view";
|
|
9
|
+
|
|
10
|
+
const { rulesFromEntries, lexerFromRules } = lexerUtilities,
|
|
11
|
+
{ rulesFromBNF, parserFromRulesAndStartRuleName } = parserUtilities;
|
|
12
|
+
|
|
13
|
+
export default class FurtleView extends View {
|
|
14
|
+
getTokens() {
|
|
15
|
+
const lexicalEntries = this.getLexicalEntries(),
|
|
16
|
+
entries = lexicalEntries, ///
|
|
17
|
+
rules = rulesFromEntries(entries),
|
|
18
|
+
furtleLexer = lexerFromRules(FurtleLexer, rules),
|
|
19
|
+
lexer = furtleLexer, ///
|
|
20
|
+
content = this.getContent(),
|
|
21
|
+
tokens = lexer.tokenise(content);
|
|
22
|
+
|
|
23
|
+
return tokens;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
getParseTree(tokens) {
|
|
27
|
+
let parseTree = null;
|
|
28
|
+
|
|
29
|
+
const bnf = this.getBNF();
|
|
30
|
+
|
|
31
|
+
let rules;
|
|
32
|
+
|
|
33
|
+
rules = rulesFromBNF(bnf);
|
|
34
|
+
|
|
35
|
+
rules = eliminateLeftRecursion(rules); ///
|
|
36
|
+
|
|
37
|
+
const ruleName = this.getRuleName(),
|
|
38
|
+
startRuleName = ruleName, ///
|
|
39
|
+
furtleParser = parserFromRulesAndStartRuleName(FurtleParser, rules, startRuleName),
|
|
40
|
+
parser = furtleParser, ///
|
|
41
|
+
node = parser.parse(tokens);
|
|
42
|
+
|
|
43
|
+
if (node !== null) {
|
|
44
|
+
parseTree = node.asParseTree(tokens);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return parseTree;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static Lexer = FurtleLexer;
|
|
51
|
+
|
|
52
|
+
static Parser = FurtleParser;
|
|
53
|
+
|
|
54
|
+
static readOnly = false;
|
|
55
|
+
|
|
56
|
+
static initialContent = `Node* termNode, statementNode; Boolean* bound = false;
|
|
57
|
+
|
|
58
|
+
String variableName = variableNameFromTermNode(termNode);
|
|
59
|
+
|
|
60
|
+
If (variableName == null) {
|
|
61
|
+
Break;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
Nodes statementNodes = nodesQuery(statementNode, //statement);
|
|
65
|
+
|
|
66
|
+
ForEach(statementNodes, (Node statementNode) {
|
|
67
|
+
String boundVariableName = boundVariableNameFromStatementNode(statementNode);
|
|
68
|
+
|
|
69
|
+
If (boundVariableName == variableName) {
|
|
70
|
+
bound = true;
|
|
71
|
+
|
|
72
|
+
Break;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
String variableNameFromTermNode(Node termNode) {
|
|
78
|
+
String variableName = null;
|
|
79
|
+
|
|
80
|
+
Node variableNameTerminalNode = nodeQuery(termNode, /term/variable/@name);
|
|
81
|
+
|
|
82
|
+
If (variableNameTerminalNode != null) {
|
|
83
|
+
String content;
|
|
84
|
+
|
|
85
|
+
{ content } = variableNameTerminalNode;
|
|
86
|
+
|
|
87
|
+
variableName = content;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
Return variableName;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
String boundVariableNameFromStatementNode(Node statementNode) {
|
|
94
|
+
String boundVariableName = null;
|
|
95
|
+
|
|
96
|
+
Nodes childNodes;
|
|
97
|
+
|
|
98
|
+
{ childNodes } = statementNode;
|
|
99
|
+
|
|
100
|
+
Node firstChildNode;
|
|
101
|
+
|
|
102
|
+
[ firstChildNode ] = childNodes;
|
|
103
|
+
|
|
104
|
+
Boolean firstChildNodeTerminalNode = isTerminalNode(firstChildNode);
|
|
105
|
+
|
|
106
|
+
If (firstChildNodeTerminalNode) {
|
|
107
|
+
Node terminalNode = firstChildNode;
|
|
108
|
+
|
|
109
|
+
String content;
|
|
110
|
+
|
|
111
|
+
{ content } = firstChildNode;
|
|
112
|
+
|
|
113
|
+
If ((content == "∀") || (content == "∃")) {
|
|
114
|
+
Node secondChildNode;
|
|
115
|
+
|
|
116
|
+
[ _, secondChildNode ] = childNodes;
|
|
117
|
+
|
|
118
|
+
Node argumentNode = secondChildNode;
|
|
119
|
+
|
|
120
|
+
Node boundVariableNameTerminalNode = nodeQuery(argumentNode, /argument/term/variable/@name);
|
|
121
|
+
|
|
122
|
+
If (boundVariableNameTerminalNode != null) {
|
|
123
|
+
{ content } = boundVariableNameTerminalNode;
|
|
124
|
+
|
|
125
|
+
boundVariableName = content;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
Return boundVariableName;
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
|
|
134
|
+
static defaultProperties = {
|
|
135
|
+
className: "furtle"
|
|
136
|
+
};
|
|
137
|
+
}
|
package/src/example.js
CHANGED
|
@@ -8,6 +8,7 @@ import { Body } from "easy";
|
|
|
8
8
|
|
|
9
9
|
import TeXView from "./example/view/tex";
|
|
10
10
|
import JSONView from "./example/view/json";
|
|
11
|
+
import FurtleView from "./example/view/furtle";
|
|
11
12
|
import PlainTextView from "./example/view/plainText";
|
|
12
13
|
import CustomGrammarBNFView from "./example/view/customGrammarBNF";
|
|
13
14
|
import CustomGrammarPatternView from "./example/view/customGrammarPattern";
|
|
@@ -22,6 +23,7 @@ const body = new Body(),
|
|
|
22
23
|
switch (example) {
|
|
23
24
|
case "tex" : View = TeXView; break;
|
|
24
25
|
case "json" : View = JSONView; break;
|
|
26
|
+
case "furtle" : View = FurtleView; break;
|
|
25
27
|
case "plain-text" : View = PlainTextView; break;
|
|
26
28
|
case "custom-grammar-bnf" : View = CustomGrammarBNFView; break;
|
|
27
29
|
case "custom-grammar-pattern" : View = CustomGrammarPatternView; break;
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const bnf = `document ::= ( instruction | error )+ ;
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
instruction ::= functionDeclaration
|
|
8
|
+
|
|
9
|
+
| pointersDeclaration
|
|
10
|
+
|
|
11
|
+
| variablesDeclaration
|
|
12
|
+
|
|
13
|
+
| variableAssignment
|
|
14
|
+
|
|
15
|
+
| objectAssignment
|
|
16
|
+
|
|
17
|
+
| arrayAssignment
|
|
18
|
+
|
|
19
|
+
| conditionalBlock
|
|
20
|
+
|
|
21
|
+
| forEachLoop
|
|
22
|
+
|
|
23
|
+
| break
|
|
24
|
+
|
|
25
|
+
;
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
functionDeclaration ::= [type] function ;
|
|
30
|
+
|
|
31
|
+
pointersDeclaration ::= [type]<NO_WHITESPACE>"*" [name] assignment? ( "," [name] assignment? )* ";" ;
|
|
32
|
+
|
|
33
|
+
variablesDeclaration ::= [type] [name] assignment? ( "," [name] assignment? )* ";" ;
|
|
34
|
+
|
|
35
|
+
variableAssignment ::= [name] assignment ";" ;
|
|
36
|
+
|
|
37
|
+
objectAssignment ::= "{"
|
|
38
|
+
|
|
39
|
+
[name] ( "," [name] )*
|
|
40
|
+
|
|
41
|
+
"}" "=" [name] ";" ;
|
|
42
|
+
|
|
43
|
+
arrayAssignment ::= "["
|
|
44
|
+
|
|
45
|
+
(
|
|
46
|
+
|
|
47
|
+
( "_" ( "," "_" )* ( "," [name] )+ )
|
|
48
|
+
|
|
49
|
+
|
|
|
50
|
+
|
|
51
|
+
( [name] ( "," [name] )* )
|
|
52
|
+
|
|
53
|
+
)
|
|
54
|
+
|
|
55
|
+
"]" "=" [name] ";" ;
|
|
56
|
+
|
|
57
|
+
conditionalBlock ::= "If" "(" condition ")" block ( "Else" block )? ;
|
|
58
|
+
|
|
59
|
+
forEachLoop ::= "ForEach"<NO_WHITESPACE>"(" [name] "," anonymousFunction ")" ";" ;
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
assignment ::= "=" ( functionCall | isTerminalNode | nodesQuery | nodeQuery | value ) ;
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
block ::= "{" ( variablesDeclaration |
|
|
68
|
+
|
|
69
|
+
variableAssignment |
|
|
70
|
+
|
|
71
|
+
objectAssignment |
|
|
72
|
+
|
|
73
|
+
arrayAssignment |
|
|
74
|
+
|
|
75
|
+
conditionalBlock |
|
|
76
|
+
|
|
77
|
+
forEachLoop |
|
|
78
|
+
|
|
79
|
+
break )* "}" ;
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
functionCall ::= [name]<NO_WHITESPACE>"(" ( [name] ( "," [name] )* )? ")" ;
|
|
85
|
+
|
|
86
|
+
function ::= [name]<NO_WHITESPACE>"(" ( argument ( "," argument )* )? ")" body ;
|
|
87
|
+
|
|
88
|
+
anonymousFunction ::= "(" ( argument ( "," argument )* )? ")" body ;
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
isTerminalNode ::= "isTerminalNode"<NO_WHITESPACE>"(" [name] ")" ;
|
|
93
|
+
|
|
94
|
+
nodesQuery ::= "nodesQuery"<NO_WHITESPACE>"(" [name] "," expression ")" ;
|
|
95
|
+
|
|
96
|
+
nodeQuery ::= "nodeQuery"<NO_WHITESPACE>"(" [name] "," expression ")" ;
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
condition ::= "(" condition ")"
|
|
102
|
+
|
|
103
|
+
| condition ( "||" | "&&" ) condition
|
|
104
|
+
|
|
105
|
+
| value ( ( "!=" | "==" ) value )?
|
|
106
|
+
|
|
107
|
+
;
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
body ::= "{" ( variablesDeclaration |
|
|
112
|
+
|
|
113
|
+
variableAssignment |
|
|
114
|
+
|
|
115
|
+
objectAssignment |
|
|
116
|
+
|
|
117
|
+
arrayAssignment |
|
|
118
|
+
|
|
119
|
+
conditionalBlock |
|
|
120
|
+
|
|
121
|
+
forEachLoop |
|
|
122
|
+
|
|
123
|
+
break )* return? "}" ;
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
return ::= "Return" value ";" ;
|
|
128
|
+
|
|
129
|
+
break ::= "Break" ";" ;
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
value ::= [name] | [number] | [primitive] | [string-literal] ;
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
argument ::= [type] [name] ;
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
expression ::= path spread? subExpression? ;
|
|
142
|
+
|
|
143
|
+
path ::= "/" infiniteDescent? selectors ;
|
|
144
|
+
|
|
145
|
+
subExpression ::= path spread? subExpression?;
|
|
146
|
+
|
|
147
|
+
infiniteDescent ::= "/" ;
|
|
148
|
+
|
|
149
|
+
selectors ::= selector ( "|" selector )* ;
|
|
150
|
+
|
|
151
|
+
spread ::= unique
|
|
152
|
+
|
|
153
|
+
| "["
|
|
154
|
+
|
|
155
|
+
(
|
|
156
|
+
|
|
157
|
+
( startIndex "..." endIndex )
|
|
158
|
+
|
|
159
|
+
|
|
|
160
|
+
|
|
161
|
+
( startIndex "..." )
|
|
162
|
+
|
|
163
|
+
|
|
|
164
|
+
|
|
165
|
+
( "..." endIndex )
|
|
166
|
+
|
|
167
|
+
|
|
|
168
|
+
|
|
169
|
+
index
|
|
170
|
+
|
|
171
|
+
)
|
|
172
|
+
|
|
173
|
+
"]" ;
|
|
174
|
+
|
|
175
|
+
selector ::= ruleName | tokenType ;
|
|
176
|
+
|
|
177
|
+
ruleName ::= [name] | "*" ;
|
|
178
|
+
|
|
179
|
+
tokenType ::= "@"<NO_WHITESPACE>( [name] | "*" ) ;
|
|
180
|
+
|
|
181
|
+
startIndex ::= [number] ;
|
|
182
|
+
|
|
183
|
+
endIndex ::= [number] ;
|
|
184
|
+
|
|
185
|
+
index ::= [number] ;
|
|
186
|
+
|
|
187
|
+
unique ::= "!" ;
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
error. ::= . ;`;
|
|
192
|
+
|
|
193
|
+
export default bnf;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
const entries = [
|
|
4
|
+
{
|
|
5
|
+
"type": "^(?:Boolean|String|Number|Nodes|Node|Void)"
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
"keyword": "^(?:If|Else|Return|ForEach|Break)"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"primitive": "^(?:null|true|false)"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"instruction": "^(?:nodeQuery|nodesQuery|isTerminalNode)"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"special": "^(?:!=|==|=|;|,|_|&&|\\|\\||@|!|\\*|\\||\\/|\\(|\\)|\\[|\\]|\\{|\\}|\\.\\.\\.)"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "^[a-zA-Z\-]+"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"number": "^[0-9]+"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"unassigned": "^."
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export default entries;
|
|
@@ -2,44 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
import { CommonLexer,
|
|
4
4
|
WhitespaceToken,
|
|
5
|
-
RegularExpressionToken,
|
|
6
5
|
EndOfLineNonSignificantToken,
|
|
7
|
-
SinglyQuotedStringLiteralToken,
|
|
8
6
|
DoublyQuotedStringLiteralToken,
|
|
9
|
-
PythonStyleSingleLineCommentToken,
|
|
10
7
|
EndOfLineCommentNonSignificantToken,
|
|
8
|
+
PythonStyleSingleLineCommentToken,
|
|
11
9
|
PythonStyleEndOfMultiLineCommentToken,
|
|
12
10
|
PythonStyleStartOfMultiLineCommentToken,
|
|
13
11
|
PythonStyleMiddleOfMultiLineCommentToken } from "occam-lexers";
|
|
14
12
|
|
|
15
13
|
import entries from "./entries";
|
|
16
14
|
|
|
17
|
-
export default class
|
|
15
|
+
export default class FurtleLexer extends CommonLexer {
|
|
18
16
|
static entries = entries;
|
|
19
17
|
|
|
20
18
|
static EndOfLineToken = EndOfLineNonSignificantToken; ///
|
|
21
19
|
|
|
22
20
|
static WhitespaceToken = WhitespaceToken;
|
|
23
21
|
|
|
24
|
-
static
|
|
22
|
+
static RegularExpressionToken = null;
|
|
25
23
|
|
|
26
|
-
static
|
|
24
|
+
static EndOfLineCommentToken = EndOfLineCommentNonSignificantToken;
|
|
27
25
|
|
|
28
|
-
static SingleLineCommentToken = PythonStyleSingleLineCommentToken;
|
|
26
|
+
static SingleLineCommentToken = PythonStyleSingleLineCommentToken;
|
|
29
27
|
|
|
30
|
-
static EndOfMultiLineCommentToken = PythonStyleEndOfMultiLineCommentToken;
|
|
28
|
+
static EndOfMultiLineCommentToken = PythonStyleEndOfMultiLineCommentToken; ///
|
|
31
29
|
|
|
32
|
-
static StartOfMultiLineCommentToken = PythonStyleStartOfMultiLineCommentToken;
|
|
30
|
+
static StartOfMultiLineCommentToken = PythonStyleStartOfMultiLineCommentToken; ///
|
|
33
31
|
|
|
34
|
-
static MiddleOfMultiLineCommentToken = PythonStyleMiddleOfMultiLineCommentToken;
|
|
32
|
+
static MiddleOfMultiLineCommentToken = PythonStyleMiddleOfMultiLineCommentToken; ///
|
|
35
33
|
|
|
36
|
-
static SinglyQuotedStringLiteralToken =
|
|
34
|
+
static SinglyQuotedStringLiteralToken = null;
|
|
37
35
|
|
|
38
36
|
static DoublyQuotedStringLiteralToken = DoublyQuotedStringLiteralToken;
|
|
39
37
|
|
|
40
|
-
static fromNothing() { return CommonLexer.fromNothing(
|
|
38
|
+
static fromNothing() { return CommonLexer.fromNothing(FurtleLexer); }
|
|
41
39
|
|
|
42
|
-
static fromRules(rules) { return CommonLexer.fromRules(
|
|
40
|
+
static fromRules(rules) { return CommonLexer.fromRules(FurtleLexer, rules); }
|
|
43
41
|
|
|
44
|
-
static fromEntries(entries) { return CommonLexer.fromEntries(
|
|
42
|
+
static fromEntries(entries) { return CommonLexer.fromEntries(FurtleLexer, entries); }
|
|
45
43
|
}
|