@scinorandex/sparse 0.0.4 → 0.0.6
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/dist/meta/common.d.ts +4 -2
- package/dist/meta/common.js +4 -2
- package/dist/meta/common.js.map +1 -1
- package/dist/meta/selfhosted.js +3 -0
- package/dist/meta/selfhosted.js.map +1 -1
- package/example/math/grammar.txt +10 -1
- package/package.json +6 -3
- package/src/meta/common.ts +2 -0
- package/src/meta/selfhosted.ts +4 -0
- package/dist/meta/handwritten.d.ts +0 -12
- package/dist/meta/handwritten.js +0 -73
- package/dist/meta/handwritten.js.map +0 -1
- package/dist/table/handwritten.d.ts +0 -16
- package/dist/table/handwritten.js +0 -59
- package/dist/table/handwritten.js.map +0 -1
- package/src/meta/handwritten.ts +0 -93
- package/src/table/handwritten.ts +0 -69
package/dist/meta/common.d.ts
CHANGED
|
@@ -51,7 +51,9 @@ export declare enum GrammarTokenType {
|
|
|
51
51
|
EQUALS = 12,
|
|
52
52
|
COMMA = 13,
|
|
53
53
|
EOF = 14,
|
|
54
|
-
|
|
55
|
-
|
|
54
|
+
SINGLE_LINE_COMMENT = 15,
|
|
55
|
+
MULTI_LINE_COMMENT = 16,
|
|
56
|
+
PRODUCTION_NAME = 17,
|
|
57
|
+
TOKEN_NAME = 18
|
|
56
58
|
}
|
|
57
59
|
export type GrammarToken = Token<GrammarTokenType, GrammarTokenMetadata>;
|
package/dist/meta/common.js
CHANGED
|
@@ -56,7 +56,9 @@ var GrammarTokenType;
|
|
|
56
56
|
GrammarTokenType[GrammarTokenType["EQUALS"] = 12] = "EQUALS";
|
|
57
57
|
GrammarTokenType[GrammarTokenType["COMMA"] = 13] = "COMMA";
|
|
58
58
|
GrammarTokenType[GrammarTokenType["EOF"] = 14] = "EOF";
|
|
59
|
-
GrammarTokenType[GrammarTokenType["
|
|
60
|
-
GrammarTokenType[GrammarTokenType["
|
|
59
|
+
GrammarTokenType[GrammarTokenType["SINGLE_LINE_COMMENT"] = 15] = "SINGLE_LINE_COMMENT";
|
|
60
|
+
GrammarTokenType[GrammarTokenType["MULTI_LINE_COMMENT"] = 16] = "MULTI_LINE_COMMENT";
|
|
61
|
+
GrammarTokenType[GrammarTokenType["PRODUCTION_NAME"] = 17] = "PRODUCTION_NAME";
|
|
62
|
+
GrammarTokenType[GrammarTokenType["TOKEN_NAME"] = 18] = "TOKEN_NAME";
|
|
61
63
|
})(GrammarTokenType || (exports.GrammarTokenType = GrammarTokenType = {}));
|
|
62
64
|
//# sourceMappingURL=common.js.map
|
package/dist/meta/common.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/meta/common.ts"],"names":[],"mappings":";;;AAAA,4CAAwD;AAUxD,MAAM,oBAAoB,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAgB,EAAE,EAAE;IAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,KAA8C,EACC,EAAE;IACjD,OAAO,IAAI,YAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,mBAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAAC,IAAgB,EAAE,EAAE;IACrD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACrE,OAAO;QACL,GAAG,EAAE,oBAAoB,CAAC,GAAG,CAAC;QAC9B,UAAU;QACV,IAAI;QACJ,uBAAuB;QACvB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI;YACJ,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;YAClC,UAAU;YACV,IAAI;SACL,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B;AAEK,MAAM,iBAAiB,GAAG,CAAC,UAAiD,EAAc,EAAE;IACjG,OAAO;QACL,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC;QACxC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,uBAAuB,EAAE,UAAU,CAAC,uBAAuB;QAC3D,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI;YACJ,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACjC,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,IAAI;SACL,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,iBAAiB,qBAa5B;AAGF,IAAY,
|
|
1
|
+
{"version":3,"file":"common.js","sourceRoot":"","sources":["../../src/meta/common.ts"],"names":[],"mappings":";;;AAAA,4CAAwD;AAUxD,MAAM,oBAAoB,GAAG,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAgB,EAAE,EAAE;IAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;AACxC,CAAC,CAAC;AAEF,MAAM,mBAAmB,GAAG,CAC1B,KAA8C,EACC,EAAE;IACjD,OAAO,IAAI,YAAK,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI,mBAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7F,CAAC,CAAC;AAEK,MAAM,kBAAkB,GAAG,CAAC,IAAgB,EAAE,EAAE;IACrD,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE,GAAG,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACrE,OAAO;QACL,GAAG,EAAE,oBAAoB,CAAC,GAAG,CAAC;QAC9B,UAAU;QACV,IAAI;QACJ,uBAAuB;QACvB,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YACnD,IAAI;YACJ,KAAK,EAAE,oBAAoB,CAAC,KAAK,CAAC;YAClC,UAAU;YACV,IAAI;SACL,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAdW,QAAA,kBAAkB,sBAc7B;AAEK,MAAM,iBAAiB,GAAG,CAAC,UAAiD,EAAc,EAAE;IACjG,OAAO;QACL,GAAG,EAAE,mBAAmB,CAAC,UAAU,CAAC,GAAG,CAAC;QACxC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,uBAAuB,EAAE,UAAU,CAAC,uBAAuB;QAC3D,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,GAAG,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;YAClD,IAAI;YACJ,KAAK,EAAE,mBAAmB,CAAC,KAAK,CAAC;YACjC,UAAU,EAAE,KAAK,CAAC,MAAM;YACxB,IAAI;SACL,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC,CAAC;AAbW,QAAA,iBAAiB,qBAa5B;AAGF,IAAY,gBAqBX;AArBD,WAAY,gBAAgB;IAC1B,mEAAU,CAAA;IACV,6DAAO,CAAA;IACP,6DAAO,CAAA;IACP,iEAAS,CAAA;IACT,iEAAS,CAAA;IACT,6DAAO,CAAA;IACP,6DAAO,CAAA;IACP,uDAAI,CAAA;IACJ,yEAAa,CAAA;IACb,yDAAK,CAAA;IACL,kEAAS,CAAA;IACT,4DAAM,CAAA;IACN,4DAAM,CAAA;IACN,0DAAK,CAAA;IACL,sDAAG,CAAA;IACH,sFAAmB,CAAA;IACnB,oFAAkB,CAAA;IAElB,8EAAe,CAAA;IACf,oEAAU,CAAA;AACZ,CAAC,EArBW,gBAAgB,gCAAhB,gBAAgB,QAqB3B"}
|
package/dist/meta/selfhosted.js
CHANGED
|
@@ -9,6 +9,7 @@ const common_1 = require("./common");
|
|
|
9
9
|
exports.grammarLexerGenerator = new slex_1.Slex({
|
|
10
10
|
EOF_TYPE: common_1.GrammarTokenType.EOF,
|
|
11
11
|
isHigherPrecedence: () => false,
|
|
12
|
+
ignoreTokens: [common_1.GrammarTokenType.SINGLE_LINE_COMMENT, common_1.GrammarTokenType.MULTI_LINE_COMMENT],
|
|
12
13
|
});
|
|
13
14
|
exports.grammarLexerGenerator.addRule("lowercase", "a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z");
|
|
14
15
|
exports.grammarLexerGenerator.addRule("uppercase", "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z");
|
|
@@ -29,6 +30,8 @@ exports.grammarLexerGenerator.addRule("equals", "$=", common_1.GrammarTokenType.
|
|
|
29
30
|
exports.grammarLexerGenerator.addRule("comma", "$,", common_1.GrammarTokenType.COMMA);
|
|
30
31
|
exports.grammarLexerGenerator.addRule("question_mark", "$?", common_1.GrammarTokenType.QUESTION_MARK);
|
|
31
32
|
exports.grammarLexerGenerator.addRule("number", "(${digit})+", common_1.GrammarTokenType.NUMBER);
|
|
33
|
+
exports.grammarLexerGenerator.addRule("single_line_comment", "$/$/(($\n)!)*", common_1.GrammarTokenType.SINGLE_LINE_COMMENT);
|
|
34
|
+
exports.grammarLexerGenerator.addRule("multi_line_comment", "$/$*(($*)!|($*($/)!))*$*$/", common_1.GrammarTokenType.MULTI_LINE_COMMENT);
|
|
32
35
|
class BaseNode {
|
|
33
36
|
}
|
|
34
37
|
exports.BaseNode = BaseNode;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selfhosted.js","sourceRoot":"","sources":["../../src/meta/selfhosted.ts"],"names":[],"mappings":";;;AAAA,4CAAsD;AACtD,oCAA0C;AAC1C,qCAAsC;AACtC,sCAAuC;AACvC,qCAA+G;AAElG,QAAA,qBAAqB,GAAG,IAAI,WAAI,CAAyC;IACpF,QAAQ,EAAE,yBAAgB,CAAC,GAAG;IAC9B,kBAAkB,EAAE,GAAG,EAAE,CAAC,KAAK;
|
|
1
|
+
{"version":3,"file":"selfhosted.js","sourceRoot":"","sources":["../../src/meta/selfhosted.ts"],"names":[],"mappings":"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"}
|
package/example/math/grammar.txt
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
<S>: <PROGRAM>;
|
|
2
2
|
<PROGRAM>: <EXPRESSION> [EOF];
|
|
3
3
|
<PROGRAM>: [EOF];
|
|
4
|
+
|
|
5
|
+
// Begin parsing arithmetic expressions
|
|
4
6
|
<EXPRESSION>: <TERM_EXPRESSION>;
|
|
5
7
|
<TERM_EXPRESSION>: <FACTOR_EXPRESSION> [PLUS] <TERM_EXPRESSION>;
|
|
6
8
|
<TERM_EXPRESSION>: <FACTOR_EXPRESSION> [MINUS] <TERM_EXPRESSION>;
|
|
@@ -8,4 +10,11 @@
|
|
|
8
10
|
<FACTOR_EXPRESSION>: <ENDPOINT> [STAR] <FACTOR_EXPRESSION>;
|
|
9
11
|
<FACTOR_EXPRESSION>: <ENDPOINT> [SLASH] <FACTOR_EXPRESSION>;
|
|
10
12
|
<FACTOR_EXPRESSION>: <ENDPOINT>;
|
|
11
|
-
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Right now it only supports a single type of number,
|
|
16
|
+
* but this can be implemented in many ways by the lexer.
|
|
17
|
+
* For example, the lexer could return both a hex constant
|
|
18
|
+
* or decimal constant using the same token type.
|
|
19
|
+
*/
|
|
20
|
+
<ENDPOINT>: [NUMBER];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scinorandex/sparse",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.6",
|
|
4
4
|
"description": "Yet another parser generator",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
@@ -26,11 +26,14 @@
|
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"@types/minimist": "^1.2.5",
|
|
29
|
-
"@types/node": "^26.0.0"
|
|
29
|
+
"@types/node": "^26.0.0",
|
|
30
|
+
"@scinorandex/slex": "^0.0.4"
|
|
31
|
+
},
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"@scinorandex/slex": "*"
|
|
30
34
|
},
|
|
31
35
|
"resolutions": {},
|
|
32
36
|
"dependencies": {
|
|
33
|
-
"@scinorandex/slex": "^0.0.3",
|
|
34
37
|
"minimist": "^1.2.8"
|
|
35
38
|
}
|
|
36
39
|
}
|
package/src/meta/common.ts
CHANGED
package/src/meta/selfhosted.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { GrammarToken, GrammarTokenMetadata, GrammarTokenType, hydrateProduction
|
|
|
7
7
|
export const grammarLexerGenerator = new Slex<GrammarTokenType, GrammarTokenMetadata>({
|
|
8
8
|
EOF_TYPE: GrammarTokenType.EOF,
|
|
9
9
|
isHigherPrecedence: () => false,
|
|
10
|
+
ignoreTokens: [GrammarTokenType.SINGLE_LINE_COMMENT, GrammarTokenType.MULTI_LINE_COMMENT],
|
|
10
11
|
});
|
|
11
12
|
|
|
12
13
|
grammarLexerGenerator.addRule(
|
|
@@ -39,6 +40,9 @@ grammarLexerGenerator.addRule("comma", "$,", GrammarTokenType.COMMA);
|
|
|
39
40
|
grammarLexerGenerator.addRule("question_mark", "$?", GrammarTokenType.QUESTION_MARK);
|
|
40
41
|
grammarLexerGenerator.addRule("number", "(${digit})+", GrammarTokenType.NUMBER);
|
|
41
42
|
|
|
43
|
+
grammarLexerGenerator.addRule("single_line_comment", "$/$/(($\n)!)*", GrammarTokenType.SINGLE_LINE_COMMENT);
|
|
44
|
+
grammarLexerGenerator.addRule("multi_line_comment", "$/$*(($*)!|($*($/)!))*$*$/", GrammarTokenType.MULTI_LINE_COMMENT);
|
|
45
|
+
|
|
42
46
|
export abstract class BaseNode {}
|
|
43
47
|
|
|
44
48
|
export class ListNode<T> extends BaseNode {
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { Slex } from "@scinorandex/slex";
|
|
2
|
-
import { Result } from "../utils/Result";
|
|
3
|
-
import { GrammarToken, GrammarTokenMetadata, GrammarTokenType, Production } from "./common";
|
|
4
|
-
export declare const grammarLexerGenerator: Slex<GrammarTokenType, GrammarTokenMetadata>;
|
|
5
|
-
interface LexerInterface {
|
|
6
|
-
peekNextToken(): GrammarToken;
|
|
7
|
-
getNextToken(): GrammarToken;
|
|
8
|
-
hasNextToken(): boolean;
|
|
9
|
-
}
|
|
10
|
-
export declare const tryBuildProductions: (lexer: LexerInterface | string) => Result<Production[]>;
|
|
11
|
-
export declare const buildProductions: (lexer: LexerInterface | string) => Production[];
|
|
12
|
-
export {};
|
package/dist/meta/handwritten.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildProductions = exports.tryBuildProductions = exports.grammarLexerGenerator = void 0;
|
|
4
|
-
const slex_1 = require("@scinorandex/slex");
|
|
5
|
-
const common_1 = require("./common");
|
|
6
|
-
exports.grammarLexerGenerator = new slex_1.Slex({
|
|
7
|
-
EOF_TYPE: common_1.GrammarTokenType.EOF,
|
|
8
|
-
isHigherPrecedence: () => false,
|
|
9
|
-
});
|
|
10
|
-
exports.grammarLexerGenerator.addRule("lowercase", "a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z");
|
|
11
|
-
exports.grammarLexerGenerator.addRule("uppercase", "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z");
|
|
12
|
-
exports.grammarLexerGenerator.addRule("letter", "${lowercase} | ${uppercase}");
|
|
13
|
-
exports.grammarLexerGenerator.addRule("digit", "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9");
|
|
14
|
-
exports.grammarLexerGenerator.addRule("alphanumeric", "${letter} | ${digit}");
|
|
15
|
-
exports.grammarLexerGenerator.addRule("identifier", "(${letter} | ${digit} | $_)*");
|
|
16
|
-
exports.grammarLexerGenerator.addRule("colon", "$:", common_1.GrammarTokenType.COLON);
|
|
17
|
-
exports.grammarLexerGenerator.addRule("semicolon", "$;", common_1.GrammarTokenType.SEMICOLON);
|
|
18
|
-
exports.grammarLexerGenerator.addRule("production_name", "$< ${identifier} $>", common_1.GrammarTokenType.PRODUCTION_NAME);
|
|
19
|
-
exports.grammarLexerGenerator.addRule("token_name", "$[ ${identifier} $]", common_1.GrammarTokenType.TOKEN_NAME);
|
|
20
|
-
const tryBuildProductions = (lexer) => {
|
|
21
|
-
if (typeof lexer === "string")
|
|
22
|
-
lexer = exports.grammarLexerGenerator.generate(lexer, () => ({}));
|
|
23
|
-
const productions = [];
|
|
24
|
-
const expect = (type) => {
|
|
25
|
-
const token = lexer.peekNextToken();
|
|
26
|
-
if (token.type !== type)
|
|
27
|
-
throw new Error(`Expected ${type}, got ${token.type}`);
|
|
28
|
-
lexer.getNextToken();
|
|
29
|
-
};
|
|
30
|
-
let productionIndex = 0;
|
|
31
|
-
const buildProduction = () => {
|
|
32
|
-
const productionLHS = lexer.getNextToken();
|
|
33
|
-
expect(common_1.GrammarTokenType.COLON);
|
|
34
|
-
const production = {
|
|
35
|
-
lhs: productionLHS,
|
|
36
|
-
identifier: productionLHS.lexeme,
|
|
37
|
-
rhs: [],
|
|
38
|
-
name: null,
|
|
39
|
-
originalProductionIndex: productionIndex++,
|
|
40
|
-
};
|
|
41
|
-
while (lexer.peekNextToken().type != common_1.GrammarTokenType.SEMICOLON) {
|
|
42
|
-
const productionRHS = lexer.getNextToken();
|
|
43
|
-
if (productionRHS.type == common_1.GrammarTokenType.PRODUCTION_NAME)
|
|
44
|
-
production.rhs.push({ type: "variable", token: productionRHS, identifier: productionRHS.lexeme, name: null });
|
|
45
|
-
else if (productionRHS.type == common_1.GrammarTokenType.TOKEN_NAME)
|
|
46
|
-
production.rhs.push({ type: "terminal", token: productionRHS, identifier: productionRHS.lexeme, name: null });
|
|
47
|
-
else
|
|
48
|
-
return {
|
|
49
|
-
success: false,
|
|
50
|
-
reason: `Unexpected token type: ${common_1.GrammarTokenType[productionRHS.type]}`,
|
|
51
|
-
token: productionRHS,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
expect(common_1.GrammarTokenType.SEMICOLON);
|
|
55
|
-
return { success: true, value: production };
|
|
56
|
-
};
|
|
57
|
-
while (lexer.hasNextToken()) {
|
|
58
|
-
const result = buildProduction();
|
|
59
|
-
if (result.success === false)
|
|
60
|
-
return result;
|
|
61
|
-
productions.push(result.value);
|
|
62
|
-
}
|
|
63
|
-
return { success: true, value: productions };
|
|
64
|
-
};
|
|
65
|
-
exports.tryBuildProductions = tryBuildProductions;
|
|
66
|
-
const buildProductions = (lexer) => {
|
|
67
|
-
const result = (0, exports.tryBuildProductions)(lexer);
|
|
68
|
-
if (result.success === false)
|
|
69
|
-
throw new Error(`Encountered error "${result.reason}" while parsing grammar at ${result.token.line}:${result.token.column}`);
|
|
70
|
-
return result.value;
|
|
71
|
-
};
|
|
72
|
-
exports.buildProductions = buildProductions;
|
|
73
|
-
//# sourceMappingURL=handwritten.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handwritten.js","sourceRoot":"","sources":["../../src/meta/handwritten.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Slex } from "@scinorandex/slex";
|
|
2
|
-
import { TableState } from "../parser";
|
|
3
|
-
type TableTokenMetadata = {};
|
|
4
|
-
export declare enum TableTokenType {
|
|
5
|
-
PRODUCTION_NAME = 0,
|
|
6
|
-
TOKEN_NAME = 1,
|
|
7
|
-
COMMA = 2,
|
|
8
|
-
EQUALS = 3,
|
|
9
|
-
SHIFT_ACTION = 4,
|
|
10
|
-
REDUCE_ACTION = 5,
|
|
11
|
-
GOTO_ACTION = 6,
|
|
12
|
-
EOF = 7
|
|
13
|
-
}
|
|
14
|
-
export declare const tableLexerGenerator: Slex<TableTokenType, TableTokenMetadata>;
|
|
15
|
-
export declare const buildStates: (grammar: string) => TableState[];
|
|
16
|
-
export {};
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.buildStates = exports.tableLexerGenerator = exports.TableTokenType = void 0;
|
|
4
|
-
const slex_1 = require("@scinorandex/slex");
|
|
5
|
-
const parser_1 = require("../parser");
|
|
6
|
-
var TableTokenType;
|
|
7
|
-
(function (TableTokenType) {
|
|
8
|
-
TableTokenType[TableTokenType["PRODUCTION_NAME"] = 0] = "PRODUCTION_NAME";
|
|
9
|
-
TableTokenType[TableTokenType["TOKEN_NAME"] = 1] = "TOKEN_NAME";
|
|
10
|
-
TableTokenType[TableTokenType["COMMA"] = 2] = "COMMA";
|
|
11
|
-
TableTokenType[TableTokenType["EQUALS"] = 3] = "EQUALS";
|
|
12
|
-
TableTokenType[TableTokenType["SHIFT_ACTION"] = 4] = "SHIFT_ACTION";
|
|
13
|
-
TableTokenType[TableTokenType["REDUCE_ACTION"] = 5] = "REDUCE_ACTION";
|
|
14
|
-
TableTokenType[TableTokenType["GOTO_ACTION"] = 6] = "GOTO_ACTION";
|
|
15
|
-
TableTokenType[TableTokenType["EOF"] = 7] = "EOF";
|
|
16
|
-
})(TableTokenType || (exports.TableTokenType = TableTokenType = {}));
|
|
17
|
-
exports.tableLexerGenerator = new slex_1.Slex({
|
|
18
|
-
EOF_TYPE: TableTokenType.EOF,
|
|
19
|
-
isHigherPrecedence: () => false,
|
|
20
|
-
});
|
|
21
|
-
exports.tableLexerGenerator.addRule("lowercase", "a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z");
|
|
22
|
-
exports.tableLexerGenerator.addRule("uppercase", "A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z");
|
|
23
|
-
exports.tableLexerGenerator.addRule("letter", "${lowercase} | ${uppercase}");
|
|
24
|
-
exports.tableLexerGenerator.addRule("digit", "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9");
|
|
25
|
-
exports.tableLexerGenerator.addRule("alphanumeric", "${letter} | ${digit}");
|
|
26
|
-
exports.tableLexerGenerator.addRule("identifier", "(${letter} | ${digit} | $_)*");
|
|
27
|
-
exports.tableLexerGenerator.addRule("comma", "$,", TableTokenType.COMMA);
|
|
28
|
-
exports.tableLexerGenerator.addRule("equals", "$=", TableTokenType.EQUALS);
|
|
29
|
-
exports.tableLexerGenerator.addRule("production_name", "$< ${identifier} $>", TableTokenType.PRODUCTION_NAME);
|
|
30
|
-
exports.tableLexerGenerator.addRule("token_name", "$[ ${identifier} $]", TableTokenType.TOKEN_NAME);
|
|
31
|
-
exports.tableLexerGenerator.addRule("shift_action", "s(${digit})*", TableTokenType.SHIFT_ACTION);
|
|
32
|
-
exports.tableLexerGenerator.addRule("reduce_action", "r(${digit})*", TableTokenType.REDUCE_ACTION);
|
|
33
|
-
exports.tableLexerGenerator.addRule("goto_action", "${digit}(${digit})*", TableTokenType.GOTO_ACTION);
|
|
34
|
-
const buildStates = (grammar) => grammar.split("\n").map((line) => {
|
|
35
|
-
const lexer = exports.tableLexerGenerator.generate(line, () => ({}));
|
|
36
|
-
const state = new parser_1.TableState();
|
|
37
|
-
const expect = (type) => {
|
|
38
|
-
const token = lexer.peekNextToken();
|
|
39
|
-
if (token.type !== type)
|
|
40
|
-
throw new Error(`Expected ${TableTokenType[type]}, got ${TableTokenType[token.type]}`);
|
|
41
|
-
lexer.getNextToken();
|
|
42
|
-
};
|
|
43
|
-
while (lexer.hasNextToken()) {
|
|
44
|
-
const token = lexer.getNextToken();
|
|
45
|
-
expect(TableTokenType.EQUALS);
|
|
46
|
-
const value = lexer.getNextToken();
|
|
47
|
-
const setting = token.type === TableTokenType.PRODUCTION_NAME
|
|
48
|
-
? { type: "goto", value: parseInt(value.lexeme) }
|
|
49
|
-
: value.type === TableTokenType.REDUCE_ACTION
|
|
50
|
-
? { type: "reduce", value: parseInt(value.lexeme.substring(1)) }
|
|
51
|
-
: { type: "shift", value: parseInt(value.lexeme.substring(1)) };
|
|
52
|
-
state.actions.set(token.lexeme, setting);
|
|
53
|
-
if (lexer.peekNextToken().type == TableTokenType.COMMA)
|
|
54
|
-
lexer.getNextToken();
|
|
55
|
-
}
|
|
56
|
-
return state;
|
|
57
|
-
});
|
|
58
|
-
exports.buildStates = buildStates;
|
|
59
|
-
//# sourceMappingURL=handwritten.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"handwritten.js","sourceRoot":"","sources":["../../src/table/handwritten.ts"],"names":[],"mappings":"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"}
|
package/src/meta/handwritten.ts
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { Slex } from "@scinorandex/slex";
|
|
2
|
-
import { Result } from "../utils/Result";
|
|
3
|
-
import { GrammarToken, GrammarTokenMetadata, GrammarTokenType, Production } from "./common";
|
|
4
|
-
|
|
5
|
-
export const grammarLexerGenerator = new Slex<GrammarTokenType, GrammarTokenMetadata>({
|
|
6
|
-
EOF_TYPE: GrammarTokenType.EOF,
|
|
7
|
-
isHigherPrecedence: () => false,
|
|
8
|
-
});
|
|
9
|
-
|
|
10
|
-
grammarLexerGenerator.addRule(
|
|
11
|
-
"lowercase",
|
|
12
|
-
"a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z",
|
|
13
|
-
);
|
|
14
|
-
grammarLexerGenerator.addRule(
|
|
15
|
-
"uppercase",
|
|
16
|
-
"A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z",
|
|
17
|
-
);
|
|
18
|
-
grammarLexerGenerator.addRule("letter", "${lowercase} | ${uppercase}");
|
|
19
|
-
grammarLexerGenerator.addRule("digit", "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9");
|
|
20
|
-
grammarLexerGenerator.addRule("alphanumeric", "${letter} | ${digit}");
|
|
21
|
-
grammarLexerGenerator.addRule("identifier", "(${letter} | ${digit} | $_)*");
|
|
22
|
-
grammarLexerGenerator.addRule("colon", "$:", GrammarTokenType.COLON);
|
|
23
|
-
grammarLexerGenerator.addRule("semicolon", "$;", GrammarTokenType.SEMICOLON);
|
|
24
|
-
grammarLexerGenerator.addRule("production_name", "$< ${identifier} $>", GrammarTokenType.PRODUCTION_NAME);
|
|
25
|
-
grammarLexerGenerator.addRule("token_name", "$[ ${identifier} $]", GrammarTokenType.TOKEN_NAME);
|
|
26
|
-
|
|
27
|
-
interface LexerInterface {
|
|
28
|
-
peekNextToken(): GrammarToken;
|
|
29
|
-
getNextToken(): GrammarToken;
|
|
30
|
-
hasNextToken(): boolean;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export const tryBuildProductions = (lexer: LexerInterface | string): Result<Production[]> => {
|
|
34
|
-
if (typeof lexer === "string") lexer = grammarLexerGenerator.generate(lexer, () => ({}));
|
|
35
|
-
|
|
36
|
-
const productions: Production[] = [];
|
|
37
|
-
|
|
38
|
-
const expect = (type: GrammarTokenType) => {
|
|
39
|
-
const token = lexer.peekNextToken();
|
|
40
|
-
if (token.type !== type) throw new Error(`Expected ${type}, got ${token.type}`);
|
|
41
|
-
lexer.getNextToken();
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
let productionIndex = 0;
|
|
45
|
-
|
|
46
|
-
const buildProduction = (): Result<Production> => {
|
|
47
|
-
const productionLHS = lexer.getNextToken();
|
|
48
|
-
expect(GrammarTokenType.COLON);
|
|
49
|
-
|
|
50
|
-
const production: Production = {
|
|
51
|
-
lhs: productionLHS,
|
|
52
|
-
identifier: productionLHS.lexeme,
|
|
53
|
-
rhs: [],
|
|
54
|
-
name: null,
|
|
55
|
-
originalProductionIndex: productionIndex++,
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
while (lexer.peekNextToken().type != GrammarTokenType.SEMICOLON) {
|
|
59
|
-
const productionRHS = lexer.getNextToken();
|
|
60
|
-
|
|
61
|
-
if (productionRHS.type == GrammarTokenType.PRODUCTION_NAME)
|
|
62
|
-
production.rhs.push({ type: "variable", token: productionRHS, identifier: productionRHS.lexeme, name: null });
|
|
63
|
-
else if (productionRHS.type == GrammarTokenType.TOKEN_NAME)
|
|
64
|
-
production.rhs.push({ type: "terminal", token: productionRHS, identifier: productionRHS.lexeme, name: null });
|
|
65
|
-
else
|
|
66
|
-
return {
|
|
67
|
-
success: false,
|
|
68
|
-
reason: `Unexpected token type: ${GrammarTokenType[productionRHS.type]}`,
|
|
69
|
-
token: productionRHS,
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
expect(GrammarTokenType.SEMICOLON);
|
|
74
|
-
return { success: true, value: production };
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
while (lexer.hasNextToken()) {
|
|
78
|
-
const result = buildProduction();
|
|
79
|
-
if (result.success === false) return result;
|
|
80
|
-
productions.push(result.value);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
return { success: true, value: productions };
|
|
84
|
-
};
|
|
85
|
-
|
|
86
|
-
export const buildProductions = (lexer: LexerInterface | string): Production[] => {
|
|
87
|
-
const result = tryBuildProductions(lexer);
|
|
88
|
-
if (result.success === false)
|
|
89
|
-
throw new Error(
|
|
90
|
-
`Encountered error "${result.reason}" while parsing grammar at ${result.token.line}:${result.token.column}`,
|
|
91
|
-
);
|
|
92
|
-
return result.value;
|
|
93
|
-
};
|
package/src/table/handwritten.ts
DELETED
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { Slex } from "@scinorandex/slex";
|
|
2
|
-
import { TableAction, TableState } from "../parser";
|
|
3
|
-
|
|
4
|
-
type TableTokenMetadata = {};
|
|
5
|
-
export enum TableTokenType {
|
|
6
|
-
PRODUCTION_NAME,
|
|
7
|
-
TOKEN_NAME,
|
|
8
|
-
COMMA,
|
|
9
|
-
EQUALS,
|
|
10
|
-
SHIFT_ACTION,
|
|
11
|
-
REDUCE_ACTION,
|
|
12
|
-
GOTO_ACTION,
|
|
13
|
-
EOF,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export const tableLexerGenerator = new Slex<TableTokenType, TableTokenMetadata>({
|
|
17
|
-
EOF_TYPE: TableTokenType.EOF,
|
|
18
|
-
isHigherPrecedence: () => false,
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
tableLexerGenerator.addRule(
|
|
22
|
-
"lowercase",
|
|
23
|
-
"a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z",
|
|
24
|
-
);
|
|
25
|
-
tableLexerGenerator.addRule(
|
|
26
|
-
"uppercase",
|
|
27
|
-
"A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z",
|
|
28
|
-
);
|
|
29
|
-
tableLexerGenerator.addRule("letter", "${lowercase} | ${uppercase}");
|
|
30
|
-
tableLexerGenerator.addRule("digit", "0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9");
|
|
31
|
-
tableLexerGenerator.addRule("alphanumeric", "${letter} | ${digit}");
|
|
32
|
-
tableLexerGenerator.addRule("identifier", "(${letter} | ${digit} | $_)*");
|
|
33
|
-
tableLexerGenerator.addRule("comma", "$,", TableTokenType.COMMA);
|
|
34
|
-
tableLexerGenerator.addRule("equals", "$=", TableTokenType.EQUALS);
|
|
35
|
-
tableLexerGenerator.addRule("production_name", "$< ${identifier} $>", TableTokenType.PRODUCTION_NAME);
|
|
36
|
-
tableLexerGenerator.addRule("token_name", "$[ ${identifier} $]", TableTokenType.TOKEN_NAME);
|
|
37
|
-
tableLexerGenerator.addRule("shift_action", "s(${digit})*", TableTokenType.SHIFT_ACTION);
|
|
38
|
-
tableLexerGenerator.addRule("reduce_action", "r(${digit})*", TableTokenType.REDUCE_ACTION);
|
|
39
|
-
tableLexerGenerator.addRule("goto_action", "${digit}(${digit})*", TableTokenType.GOTO_ACTION);
|
|
40
|
-
|
|
41
|
-
export const buildStates = (grammar: string) =>
|
|
42
|
-
grammar.split("\n").map((line) => {
|
|
43
|
-
const lexer = tableLexerGenerator.generate(line, () => ({}));
|
|
44
|
-
const state = new TableState();
|
|
45
|
-
|
|
46
|
-
const expect = (type: TableTokenType) => {
|
|
47
|
-
const token = lexer.peekNextToken();
|
|
48
|
-
if (token.type !== type) throw new Error(`Expected ${TableTokenType[type]}, got ${TableTokenType[token.type]}`);
|
|
49
|
-
lexer.getNextToken();
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
while (lexer.hasNextToken()) {
|
|
53
|
-
const token = lexer.getNextToken();
|
|
54
|
-
expect(TableTokenType.EQUALS);
|
|
55
|
-
const value = lexer.getNextToken();
|
|
56
|
-
|
|
57
|
-
const setting: TableAction =
|
|
58
|
-
token.type === TableTokenType.PRODUCTION_NAME
|
|
59
|
-
? { type: "goto", value: parseInt(value.lexeme) }
|
|
60
|
-
: value.type === TableTokenType.REDUCE_ACTION
|
|
61
|
-
? { type: "reduce", value: parseInt(value.lexeme.substring(1)) }
|
|
62
|
-
: { type: "shift", value: parseInt(value.lexeme.substring(1)) };
|
|
63
|
-
|
|
64
|
-
state.actions.set(token.lexeme, setting);
|
|
65
|
-
if (lexer.peekNextToken().type == TableTokenType.COMMA) lexer.getNextToken();
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
return state;
|
|
69
|
-
});
|