grammar-well 1.1.0 → 1.1.2
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 +103 -0
- package/bootstrap.ts +2 -2
- package/build/compiler/compiler.d.ts +4 -3
- package/build/compiler/compiler.js +5 -4
- package/build/compiler/compiler.js.map +1 -1
- package/build/typings.d.ts +2 -2
- package/build/utility/general.d.ts +10 -1
- package/build/utility/general.js +56 -2
- package/build/utility/general.js.map +1 -1
- package/build/utility/lr.d.ts +2 -6
- package/build/utility/lr.js +1 -2
- package/build/utility/lr.js.map +1 -1
- package/package.json +11 -10
- package/src/compiler/compiler.ts +7 -6
- package/src/typings.ts +2 -2
- package/src/utility/general.ts +58 -3
- package/src/utility/lr.ts +3 -4
package/README.md
CHANGED
|
@@ -1,6 +1,109 @@
|
|
|
1
1
|
# Grammar Well
|
|
2
2
|
A cross-platform grammar compiler and interpreter. That aims to facilitate a simple way to create and evaluate custom grammars on the front-end and back-end. Formerly a TypeScript port of [Nearley](https://github.com/kach/nearley).
|
|
3
3
|
|
|
4
|
+
# Quick Start
|
|
5
|
+
### Install
|
|
6
|
+
`npm i grammar-well`
|
|
7
|
+
|
|
8
|
+
### Example
|
|
9
|
+
|
|
10
|
+
```Javascript
|
|
11
|
+
import { Compile, Parse } from 'grammar-well';
|
|
12
|
+
|
|
13
|
+
async function GrammarWellRunner(source, input) {
|
|
14
|
+
function Evalr(source) {
|
|
15
|
+
const module = { exports: null };
|
|
16
|
+
eval(source);
|
|
17
|
+
return module.exports;
|
|
18
|
+
}
|
|
19
|
+
const compiled = await Compile(source, { exportName: 'grammar' });
|
|
20
|
+
return Parse(Evalr(compiled)(), input, { algorithm: 'earley' });
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
const source = `lexer: {{
|
|
25
|
+
start: "json"
|
|
26
|
+
|
|
27
|
+
json ->
|
|
28
|
+
- when: /\s+/ tag: "space"
|
|
29
|
+
- when: /-?(?:[0-9]|[1-9][0-9]+)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?\b/ tag: "number"
|
|
30
|
+
- when: /"(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*"/ tag: "string"
|
|
31
|
+
- when: "{" tag: "{"
|
|
32
|
+
- when: "}" tag: "}"
|
|
33
|
+
- when: "[" tag: "["
|
|
34
|
+
- when: "]" tag: "]"
|
|
35
|
+
- when: "," tag: ","
|
|
36
|
+
- when: ":" tag: ":"
|
|
37
|
+
- when: "true" tag: "true"
|
|
38
|
+
- when: "false" tag: "false"
|
|
39
|
+
- when: "null" tag: "null"
|
|
40
|
+
}}
|
|
41
|
+
|
|
42
|
+
grammar: {{
|
|
43
|
+
json -> _ (object | array) _ : {{ $1[0] }}
|
|
44
|
+
|
|
45
|
+
object -> "{" _ "}" : {{ {} }}
|
|
46
|
+
| "{" _ pair (_ "," _ pair)* _ "}" : \${ extractObject }
|
|
47
|
+
|
|
48
|
+
array -> "[" _ "]" : {{ [] }}
|
|
49
|
+
| "[" _ value (_ "," _ value)* _ "]" : \${ extractArray }
|
|
50
|
+
|
|
51
|
+
value : {{ $0 }} ->
|
|
52
|
+
object
|
|
53
|
+
| array
|
|
54
|
+
| number
|
|
55
|
+
| string
|
|
56
|
+
| "true" : {{ true }}
|
|
57
|
+
| "false" : {{ false }}
|
|
58
|
+
| "null" : {{ null }}
|
|
59
|
+
|
|
60
|
+
number -> $number : {{ parseFloat($0.value) }}
|
|
61
|
+
|
|
62
|
+
string -> $string : {{ JSON.parse($0.value) }}
|
|
63
|
+
|
|
64
|
+
pair -> key:k _ ":" _ value:v : {{ [$k, $v] }}
|
|
65
|
+
|
|
66
|
+
key -> string : {{ $0 }}
|
|
67
|
+
|
|
68
|
+
_ -> $space? : {{ null }}
|
|
69
|
+
}}
|
|
70
|
+
|
|
71
|
+
head: \${
|
|
72
|
+
|
|
73
|
+
function extractPair(kv, output) {
|
|
74
|
+
if(kv[0]) { output[kv[0]] = kv[1]; }
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
function extractObject({data}) {
|
|
78
|
+
let output = {};
|
|
79
|
+
|
|
80
|
+
extractPair(data[2], output);
|
|
81
|
+
|
|
82
|
+
for (let i in data[3]) {
|
|
83
|
+
extractPair(data[3][i][3], output);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return output;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function extractArray({data}) {
|
|
90
|
+
let output = [data[2]];
|
|
91
|
+
|
|
92
|
+
for (let i in data[3]) {
|
|
93
|
+
output.push(data[3][i][3]);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return output;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
`
|
|
100
|
+
|
|
101
|
+
const input = `{"a":"string","b":true,"c":2}`
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
console.log(await GrammarWellRunner(source, input))
|
|
105
|
+
```
|
|
106
|
+
|
|
4
107
|
# Warning
|
|
5
108
|
A lot has changed and documentation needs to be written. For now here's the Grammar Well grammar file that parses Garmmar Well's syntax.
|
|
6
109
|
|
package/bootstrap.ts
CHANGED
|
@@ -9,8 +9,8 @@ const BaseDir = './src/grammars';
|
|
|
9
9
|
try {
|
|
10
10
|
console.log(fullpath(file))
|
|
11
11
|
if (/\.gwell$/.test(file)) {
|
|
12
|
-
const json = await Compile(read(file), {
|
|
13
|
-
const js = await Compile(read(file), { exportName: 'grammar',
|
|
12
|
+
const json = await Compile(read(file), { template: 'json' });
|
|
13
|
+
const js = await Compile(read(file), { exportName: 'grammar', template: 'esmodule' });
|
|
14
14
|
write(file.replace(/.gwell$/, '.json'), json);
|
|
15
15
|
write(file.replace(/.gwell$/, '.js'), js);
|
|
16
16
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import { CompileOptions, GrammarBuilderContext,
|
|
1
|
+
import { CompileOptions, GrammarBuilderContext, TemplateFormat, LanguageDirective } from "../typings";
|
|
2
2
|
import { ESMOutput, JavascriptOutput } from "./outputs/javascript";
|
|
3
3
|
import { TypescriptFormat } from "./outputs/typescript";
|
|
4
4
|
import { JSONFormatter } from "./outputs/json";
|
|
5
5
|
import { Generator } from "./generator";
|
|
6
|
-
declare const
|
|
6
|
+
declare const TemplateFormats: {
|
|
7
7
|
_default: typeof JavascriptOutput;
|
|
8
8
|
object: (grammar: any, exportName: any) => {
|
|
9
9
|
grammar: any;
|
|
@@ -14,6 +14,7 @@ declare const OutputFormats: {
|
|
|
14
14
|
javascript: typeof JavascriptOutput;
|
|
15
15
|
module: typeof ESMOutput;
|
|
16
16
|
esmodule: typeof ESMOutput;
|
|
17
|
+
esm: typeof ESMOutput;
|
|
17
18
|
ts: typeof TypescriptFormat;
|
|
18
19
|
typescript: typeof TypescriptFormat;
|
|
19
20
|
};
|
|
@@ -27,7 +28,7 @@ export declare class GrammarBuilder {
|
|
|
27
28
|
private context;
|
|
28
29
|
generator: Generator;
|
|
29
30
|
constructor(config?: CompileOptions, context?: GrammarBuilderContext);
|
|
30
|
-
export<T extends
|
|
31
|
+
export<T extends TemplateFormat = '_default'>(format: T, name?: string): ReturnType<typeof TemplateFormats[T]>;
|
|
31
32
|
import(source: string): Promise<void>;
|
|
32
33
|
import(directive: LanguageDirective): Promise<void>;
|
|
33
34
|
import(directives: LanguageDirective[]): Promise<void>;
|
|
@@ -16,7 +16,7 @@ const BuiltInRegistry = {
|
|
|
16
16
|
string,
|
|
17
17
|
whitespace,
|
|
18
18
|
};
|
|
19
|
-
const
|
|
19
|
+
const TemplateFormats = {
|
|
20
20
|
_default: javascript_1.JavascriptOutput,
|
|
21
21
|
object: (grammar, exportName) => ({ grammar, exportName }),
|
|
22
22
|
json: json_1.JSONFormatter,
|
|
@@ -24,13 +24,14 @@ const OutputFormats = {
|
|
|
24
24
|
javascript: javascript_1.JavascriptOutput,
|
|
25
25
|
module: javascript_1.ESMOutput,
|
|
26
26
|
esmodule: javascript_1.ESMOutput,
|
|
27
|
+
esm: javascript_1.ESMOutput,
|
|
27
28
|
ts: typescript_1.TypescriptFormat,
|
|
28
29
|
typescript: typescript_1.TypescriptFormat
|
|
29
30
|
};
|
|
30
31
|
async function Compile(rules, config = {}) {
|
|
31
32
|
const builder = new GrammarBuilder(config);
|
|
32
33
|
await builder.import(rules);
|
|
33
|
-
return builder.export(config.
|
|
34
|
+
return builder.export(config.template);
|
|
34
35
|
}
|
|
35
36
|
exports.Compile = Compile;
|
|
36
37
|
class GrammarBuilder {
|
|
@@ -50,8 +51,8 @@ class GrammarBuilder {
|
|
|
50
51
|
export(format, name = 'GWLanguage') {
|
|
51
52
|
const grammar = this.generator.state;
|
|
52
53
|
const output = format || grammar.config.preprocessor || '_default';
|
|
53
|
-
if (
|
|
54
|
-
return
|
|
54
|
+
if (TemplateFormats[output]) {
|
|
55
|
+
return TemplateFormats[output](this.generator, name);
|
|
55
56
|
}
|
|
56
57
|
throw new Error("No such preprocessor: " + output);
|
|
57
58
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":";;;AAEA,6CAA0C;AAC1C,uDAAuD;AACvD,6CAAyC;AAEzC,qDAAmE;AACnE,qDAAwD;AACxD,yCAA+C;AAE/C,kDAAkD;AAClD,kDAAkD;AAClD,0DAA0D;AAC1D,2CAAwC;AAExC,MAAM,eAAe,GAAG;IACpB,MAAM;IACN,MAAM;IACN,UAAU;CACb,CAAA;AACD,MAAM,
|
|
1
|
+
{"version":3,"file":"compiler.js","sourceRoot":"","sources":["../../src/compiler/compiler.ts"],"names":[],"mappings":"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"}
|
package/build/typings.d.ts
CHANGED
|
@@ -10,9 +10,9 @@ export interface CompileOptions {
|
|
|
10
10
|
resolver?: ImportResolverConstructor;
|
|
11
11
|
resolverInstance?: ImportResolver;
|
|
12
12
|
exportName?: string;
|
|
13
|
-
|
|
13
|
+
template?: TemplateFormat;
|
|
14
14
|
}
|
|
15
|
-
export type
|
|
15
|
+
export type TemplateFormat = '_default' | 'object' | 'json' | 'js' | 'javascript' | 'module' | 'esmodule' | 'esm' | 'ts' | 'typescript';
|
|
16
16
|
export interface GrammarBuilderContext {
|
|
17
17
|
alreadyCompiled: Set<string>;
|
|
18
18
|
resolver: ImportResolver;
|
|
@@ -2,10 +2,12 @@ import { Dictionary, GrammarRuleSymbol } from "../typings";
|
|
|
2
2
|
export declare class Collection<T> {
|
|
3
3
|
categorized: Dictionary<Dictionary<number>>;
|
|
4
4
|
private uncategorized;
|
|
5
|
-
|
|
5
|
+
items: T[];
|
|
6
6
|
constructor(ref?: T[]);
|
|
7
7
|
encode(ref: T): number;
|
|
8
8
|
decode(id: number | string): T;
|
|
9
|
+
has(ref: T): boolean;
|
|
10
|
+
redirect(source: T, target: T): void;
|
|
9
11
|
resolve(_: T): {
|
|
10
12
|
category: keyof Collection<T>['categorized'];
|
|
11
13
|
key: string;
|
|
@@ -42,5 +44,12 @@ export declare class Matrix<T> {
|
|
|
42
44
|
resize(x: number, y: number): void;
|
|
43
45
|
static Array<T>(length: any, initial?: T | ((...args: any) => T)): GetCallbackOrValue<T>[];
|
|
44
46
|
}
|
|
47
|
+
export declare function Flatten(obj: any[] | {
|
|
48
|
+
[key: string]: any;
|
|
49
|
+
}): FlatObject;
|
|
50
|
+
export declare function Unflatten(items: FlatObject): any;
|
|
51
|
+
type FlatObject = (boolean | number | string | (number[]) | {
|
|
52
|
+
[key: string]: number;
|
|
53
|
+
})[];
|
|
45
54
|
type GetCallbackOrValue<T> = T extends (...args: any) => any ? ReturnType<T> : T;
|
|
46
55
|
export {};
|
package/build/utility/general.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.Matrix = exports.SymbolCollection = exports.Collection = void 0;
|
|
3
|
+
exports.Unflatten = exports.Flatten = exports.Matrix = exports.SymbolCollection = exports.Collection = void 0;
|
|
4
4
|
class Collection {
|
|
5
5
|
categorized = {};
|
|
6
6
|
uncategorized = new Map();
|
|
@@ -19,6 +19,15 @@ class Collection {
|
|
|
19
19
|
decode(id) {
|
|
20
20
|
return this.items[typeof id == 'string' ? parseInt(id) : id];
|
|
21
21
|
}
|
|
22
|
+
has(ref) {
|
|
23
|
+
const c = this.resolve(ref);
|
|
24
|
+
if (c)
|
|
25
|
+
return (c.key in this.categorized[c.category]);
|
|
26
|
+
return this.uncategorized.has(ref);
|
|
27
|
+
}
|
|
28
|
+
redirect(source, target) {
|
|
29
|
+
this.items[this.encode(source)] = target;
|
|
30
|
+
}
|
|
22
31
|
resolve(_) { }
|
|
23
32
|
addCategorized(category, key, ref) {
|
|
24
33
|
if (!(key in this.categorized[category])) {
|
|
@@ -57,7 +66,7 @@ class SymbolCollection extends Collection {
|
|
|
57
66
|
else if ('token' in symbol) {
|
|
58
67
|
return { category: 'token', key: symbol.token };
|
|
59
68
|
}
|
|
60
|
-
else if (
|
|
69
|
+
else if (symbol instanceof RegExp) {
|
|
61
70
|
return { category: 'regex', key: symbol.toString() };
|
|
62
71
|
}
|
|
63
72
|
else if (typeof symbol == 'function') {
|
|
@@ -109,4 +118,49 @@ class Matrix {
|
|
|
109
118
|
}
|
|
110
119
|
}
|
|
111
120
|
exports.Matrix = Matrix;
|
|
121
|
+
function Flatten(obj) {
|
|
122
|
+
const collection = new Collection();
|
|
123
|
+
function Traverse(ref) {
|
|
124
|
+
if (collection.has(ref)) {
|
|
125
|
+
return collection.encode(ref);
|
|
126
|
+
}
|
|
127
|
+
if (Array.isArray(ref)) {
|
|
128
|
+
collection.redirect(ref, ref.map(v => Traverse(v)));
|
|
129
|
+
}
|
|
130
|
+
else if (typeof ref === 'object') {
|
|
131
|
+
const o = {};
|
|
132
|
+
for (const k in ref) {
|
|
133
|
+
o[k] = Traverse(ref[k]);
|
|
134
|
+
}
|
|
135
|
+
collection.redirect(ref, o);
|
|
136
|
+
}
|
|
137
|
+
else if (typeof ref === 'function') {
|
|
138
|
+
return collection.encode(ref.toString());
|
|
139
|
+
}
|
|
140
|
+
return collection.encode(ref);
|
|
141
|
+
}
|
|
142
|
+
Traverse(obj);
|
|
143
|
+
return collection.items;
|
|
144
|
+
}
|
|
145
|
+
exports.Flatten = Flatten;
|
|
146
|
+
function Unflatten(items) {
|
|
147
|
+
const visited = new Set();
|
|
148
|
+
function Traverse(id) {
|
|
149
|
+
if (visited.has(id)) {
|
|
150
|
+
return items[id];
|
|
151
|
+
}
|
|
152
|
+
visited.add(id);
|
|
153
|
+
if (Array.isArray(items[id])) {
|
|
154
|
+
return items[id].map(v => Traverse(id));
|
|
155
|
+
}
|
|
156
|
+
else if (typeof items[id] === 'object') {
|
|
157
|
+
for (const k in items[id]) {
|
|
158
|
+
items[id][k] = Traverse(id[k]);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return items[id];
|
|
162
|
+
}
|
|
163
|
+
return Traverse(0);
|
|
164
|
+
}
|
|
165
|
+
exports.Unflatten = Unflatten;
|
|
112
166
|
//# sourceMappingURL=general.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../src/utility/general.ts"],"names":[],"mappings":";;;AAGA,MAAa,UAAU;IACnB,WAAW,GAAmC,EAAE,CAAC;IACzC,aAAa,GAAG,IAAI,GAAG,EAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"general.js","sourceRoot":"","sources":["../../src/utility/general.ts"],"names":[],"mappings":"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"}
|
package/build/utility/lr.d.ts
CHANGED
|
@@ -1,17 +1,13 @@
|
|
|
1
1
|
import { Dictionary, GrammarRule, GrammarRuleSymbol, LanguageDefinition } from "../typings";
|
|
2
2
|
import { Collection, SymbolCollection } from "./general";
|
|
3
3
|
export declare class CanonicalCollection {
|
|
4
|
-
grammar: LanguageGrammar
|
|
5
|
-
symbols?: SymbolCollection;
|
|
6
|
-
};
|
|
4
|
+
grammar: LanguageGrammar;
|
|
7
5
|
rules: Collection<GrammarRule>;
|
|
8
6
|
states: {
|
|
9
7
|
[key: string]: State;
|
|
10
8
|
};
|
|
11
9
|
symbols: SymbolCollection;
|
|
12
|
-
constructor(grammar: LanguageGrammar
|
|
13
|
-
symbols?: SymbolCollection;
|
|
14
|
-
});
|
|
10
|
+
constructor(grammar: LanguageGrammar);
|
|
15
11
|
addState(seed: StateItem[]): State;
|
|
16
12
|
encodeRule(rule: GrammarRule, dot: number): string;
|
|
17
13
|
encodeStateItems(seed: StateItem[]): string;
|
package/build/utility/lr.js
CHANGED
|
@@ -7,10 +7,9 @@ class CanonicalCollection {
|
|
|
7
7
|
grammar;
|
|
8
8
|
rules = new general_1.Collection();
|
|
9
9
|
states = Object.create(null);
|
|
10
|
-
symbols;
|
|
10
|
+
symbols = new general_1.SymbolCollection();
|
|
11
11
|
constructor(grammar) {
|
|
12
12
|
this.grammar = grammar;
|
|
13
|
-
this.symbols = grammar.symbols || new general_1.SymbolCollection();
|
|
14
13
|
const augmented = { name: Symbol(), symbols: [grammar.start] };
|
|
15
14
|
grammar.rules[augmented.name] = [augmented];
|
|
16
15
|
this.addState([{ rule: augmented, dot: 0 }]);
|
package/build/utility/lr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lr.js","sourceRoot":"","sources":["../../src/utility/lr.ts"],"names":[],"mappings":";;;AAAA,6CAAiD;AAEjD,uCAAyD;AAEzD,MAAa,mBAAmB;IAKT;IAJnB,KAAK,GAA4B,IAAI,oBAAU,EAAE,CAAC;IAClD,MAAM,GAA6B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IACtD,OAAO,
|
|
1
|
+
{"version":3,"file":"lr.js","sourceRoot":"","sources":["../../src/utility/lr.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "grammar-well",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Cross-platform Parser written in TypeScript",
|
|
5
5
|
"main": "build/index.js",
|
|
6
6
|
"scripts": {
|
|
7
7
|
"prebuild": "tsc --build --clean",
|
|
8
8
|
"build": "tsc --build",
|
|
9
|
-
"bootstrap": "
|
|
10
|
-
"testing": "
|
|
9
|
+
"bootstrap": "tsx bootstrap.ts",
|
|
10
|
+
"testing": "tsx testing.ts",
|
|
11
11
|
"benchmark": "node tests/performance/benchmark.js",
|
|
12
12
|
"test": "nyc mocha tests/**/*.spec.ts",
|
|
13
13
|
"profile": "node tests/performance/profile.js"
|
|
@@ -25,19 +25,20 @@
|
|
|
25
25
|
"devDependencies": {
|
|
26
26
|
"@types/chai": "^4.3.4",
|
|
27
27
|
"@types/mocha": "^10.0.1",
|
|
28
|
-
"@types/node": "^18.
|
|
29
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
30
|
-
"@typescript-eslint/parser": "^5.
|
|
28
|
+
"@types/node": "^18.15.0",
|
|
29
|
+
"@typescript-eslint/eslint-plugin": "^5.54.1",
|
|
30
|
+
"@typescript-eslint/parser": "^5.54.1",
|
|
31
31
|
"babel-cli": "^6.26.0",
|
|
32
32
|
"babel-preset-env": "^1.7.0",
|
|
33
33
|
"benny": "^3.7.1",
|
|
34
34
|
"chai": "^4.3.7",
|
|
35
|
-
"eslint": "^8.
|
|
36
|
-
"expect": "^29.
|
|
35
|
+
"eslint": "^8.36.0",
|
|
36
|
+
"expect": "^29.5.0",
|
|
37
37
|
"mocha": "^10.2.0",
|
|
38
38
|
"nyc": "^15.1.0",
|
|
39
39
|
"ts-node": "^10.9.1",
|
|
40
|
-
"
|
|
40
|
+
"tsx": "^3.12.3",
|
|
41
|
+
"typescript": "^4.9.5",
|
|
41
42
|
"yaml": "^2.2.1"
|
|
42
43
|
},
|
|
43
44
|
"keywords": [
|
|
@@ -49,4 +50,4 @@
|
|
|
49
50
|
"grammar",
|
|
50
51
|
"language"
|
|
51
52
|
]
|
|
52
|
-
}
|
|
53
|
+
}
|
package/src/compiler/compiler.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CompileOptions, GrammarBuilderContext,
|
|
1
|
+
import { CompileOptions, GrammarBuilderContext, TemplateFormat, LanguageDirective, ConfigDirective, GrammarBuilderSymbolRepeat, GrammarBuilderExpression, GeneratorGrammarRule, GrammarDirective, ImportDirective, LexerDirective, GrammarBuilderSymbolSubexpression, GrammarTypeLiteral, GeneratorGrammarSymbol, GrammarBuilderSymbol, GrammarBuilderRule } from "../typings";
|
|
2
2
|
|
|
3
3
|
import { Parser } from "../parser/parser";
|
|
4
4
|
import { FileSystemResolver } from "./import-resolver";
|
|
@@ -18,7 +18,7 @@ const BuiltInRegistry = {
|
|
|
18
18
|
string,
|
|
19
19
|
whitespace,
|
|
20
20
|
}
|
|
21
|
-
const
|
|
21
|
+
const TemplateFormats = {
|
|
22
22
|
_default: JavascriptOutput,
|
|
23
23
|
object: (grammar, exportName) => ({ grammar, exportName }),
|
|
24
24
|
json: JSONFormatter,
|
|
@@ -26,6 +26,7 @@ const OutputFormats = {
|
|
|
26
26
|
javascript: JavascriptOutput,
|
|
27
27
|
module: ESMOutput,
|
|
28
28
|
esmodule: ESMOutput,
|
|
29
|
+
esm: ESMOutput,
|
|
29
30
|
ts: TypescriptFormat,
|
|
30
31
|
typescript: TypescriptFormat
|
|
31
32
|
}
|
|
@@ -33,7 +34,7 @@ const OutputFormats = {
|
|
|
33
34
|
export async function Compile(rules: string | LanguageDirective | (LanguageDirective[]), config: CompileOptions = {}) {
|
|
34
35
|
const builder = new GrammarBuilder(config);
|
|
35
36
|
await builder.import(rules as any);
|
|
36
|
-
return builder.export(config.
|
|
37
|
+
return builder.export(config.template);
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
export class GrammarBuilder {
|
|
@@ -51,11 +52,11 @@ export class GrammarBuilder {
|
|
|
51
52
|
this.generator.state.grammar.uuids = this.context.uuids;
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
export<T extends
|
|
55
|
+
export<T extends TemplateFormat = '_default'>(format: T, name: string = 'GWLanguage'): ReturnType<typeof TemplateFormats[T]> {
|
|
55
56
|
const grammar = this.generator.state;
|
|
56
57
|
const output = format || grammar.config.preprocessor || '_default';
|
|
57
|
-
if (
|
|
58
|
-
return
|
|
58
|
+
if (TemplateFormats[output]) {
|
|
59
|
+
return TemplateFormats[output](this.generator, name);
|
|
59
60
|
}
|
|
60
61
|
throw new Error("No such preprocessor: " + output)
|
|
61
62
|
}
|
package/src/typings.ts
CHANGED
|
@@ -12,10 +12,10 @@ export interface CompileOptions {
|
|
|
12
12
|
resolver?: ImportResolverConstructor;
|
|
13
13
|
resolverInstance?: ImportResolver;
|
|
14
14
|
exportName?: string;
|
|
15
|
-
|
|
15
|
+
template?: TemplateFormat;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export type
|
|
18
|
+
export type TemplateFormat = '_default' | 'object' | 'json' | 'js' | 'javascript' | 'module' | 'esmodule' | 'esm' | 'ts' | 'typescript'
|
|
19
19
|
|
|
20
20
|
export interface GrammarBuilderContext {
|
|
21
21
|
alreadyCompiled: Set<string>;
|
package/src/utility/general.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { Dictionary, GrammarRuleSymbol } from "../typings";
|
|
|
4
4
|
export class Collection<T> {
|
|
5
5
|
categorized: Dictionary<Dictionary<number>> = {};
|
|
6
6
|
private uncategorized = new Map<T, number>();
|
|
7
|
-
|
|
7
|
+
items: T[] = [];
|
|
8
8
|
|
|
9
9
|
constructor(ref: T[] = []) {
|
|
10
10
|
for (const s of ref) {
|
|
@@ -23,6 +23,17 @@ export class Collection<T> {
|
|
|
23
23
|
return this.items[typeof id == 'string' ? parseInt(id) : id];
|
|
24
24
|
}
|
|
25
25
|
|
|
26
|
+
has(ref: T) {
|
|
27
|
+
const c = this.resolve(ref);
|
|
28
|
+
if (c)
|
|
29
|
+
return (c.key in this.categorized[c.category])
|
|
30
|
+
return this.uncategorized.has(ref);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
redirect(source: T, target: T) {
|
|
34
|
+
this.items[this.encode(source)] = target;
|
|
35
|
+
}
|
|
36
|
+
|
|
26
37
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-empty-function
|
|
27
38
|
resolve(_: T): { category: keyof Collection<T>['categorized'], key: string } | void { }
|
|
28
39
|
|
|
@@ -63,7 +74,7 @@ export class SymbolCollection extends Collection<GrammarRuleSymbol>{
|
|
|
63
74
|
return { category: 'literalS', key: symbol.literal }
|
|
64
75
|
} else if ('token' in symbol) {
|
|
65
76
|
return { category: 'token', key: symbol.token }
|
|
66
|
-
} else if (
|
|
77
|
+
} else if (symbol instanceof RegExp) {
|
|
67
78
|
return { category: 'regex', key: symbol.toString() }
|
|
68
79
|
} else if (typeof symbol == 'function') {
|
|
69
80
|
return { category: 'function', key: symbol.toString() }
|
|
@@ -117,4 +128,48 @@ export class Matrix<T> {
|
|
|
117
128
|
}
|
|
118
129
|
}
|
|
119
130
|
|
|
120
|
-
|
|
131
|
+
export function Flatten(obj: any[] | { [key: string]: any }): FlatObject {
|
|
132
|
+
const collection = new Collection();
|
|
133
|
+
function Traverse(ref: any) {
|
|
134
|
+
if (collection.has(ref)) {
|
|
135
|
+
return collection.encode(ref)
|
|
136
|
+
}
|
|
137
|
+
if (Array.isArray(ref)) {
|
|
138
|
+
collection.redirect(ref, ref.map(v => Traverse(v)));
|
|
139
|
+
} else if (typeof ref === 'object') {
|
|
140
|
+
const o = {};
|
|
141
|
+
for (const k in ref) {
|
|
142
|
+
o[k] = Traverse(ref[k])
|
|
143
|
+
}
|
|
144
|
+
collection.redirect(ref, o);
|
|
145
|
+
} else if (typeof ref === 'function') {
|
|
146
|
+
return collection.encode(ref.toString());
|
|
147
|
+
}
|
|
148
|
+
return collection.encode(ref);
|
|
149
|
+
}
|
|
150
|
+
Traverse(obj);
|
|
151
|
+
return collection.items as any;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export function Unflatten(items: FlatObject) {
|
|
155
|
+
const visited = new Set();
|
|
156
|
+
function Traverse(id: number) {
|
|
157
|
+
if (visited.has(id)) {
|
|
158
|
+
return items[id];
|
|
159
|
+
}
|
|
160
|
+
visited.add(id);
|
|
161
|
+
if (Array.isArray(items[id])) {
|
|
162
|
+
return (items[id] as any[]).map(v => Traverse(id));
|
|
163
|
+
} else if (typeof items[id] === 'object') {
|
|
164
|
+
for (const k in items[id] as { [key: string]: any }) {
|
|
165
|
+
items[id][k] = Traverse(id[k])
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return items[id];
|
|
169
|
+
}
|
|
170
|
+
return Traverse(0);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
type FlatObject = (boolean | number | string | (number[]) | { [key: string]: number })[];
|
|
174
|
+
|
|
175
|
+
type GetCallbackOrValue<T> = T extends (...args: any) => any ? ReturnType<T> : T;
|
package/src/utility/lr.ts
CHANGED
|
@@ -5,10 +5,9 @@ import { Collection, SymbolCollection } from "./general";
|
|
|
5
5
|
export class CanonicalCollection {
|
|
6
6
|
rules: Collection<GrammarRule> = new Collection();
|
|
7
7
|
states: { [key: string]: State } = Object.create(null)
|
|
8
|
-
symbols: SymbolCollection;
|
|
9
|
-
|
|
10
|
-
constructor(public grammar: LanguageGrammar
|
|
11
|
-
this.symbols = grammar.symbols || new SymbolCollection();
|
|
8
|
+
symbols: SymbolCollection = new SymbolCollection();
|
|
9
|
+
|
|
10
|
+
constructor(public grammar: LanguageGrammar) {
|
|
12
11
|
const augmented = { name: Symbol() as unknown as string, symbols: [grammar.start] }
|
|
13
12
|
grammar.rules[augmented.name] = [augmented];
|
|
14
13
|
this.addState([{ rule: augmented, dot: 0 }]);
|