grammar-well 1.2.0 → 1.2.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.
Files changed (67) hide show
  1. package/bootstrap.ts +14 -7
  2. package/build/compiler/builtin.json +1 -0
  3. package/build/compiler/compiler.d.ts +2 -1
  4. package/build/compiler/compiler.js +43 -24
  5. package/build/compiler/compiler.js.map +1 -1
  6. package/build/compiler/gwell.d.ts +1050 -0
  7. package/build/compiler/gwell.js +555 -0
  8. package/build/compiler/gwell.js.map +1 -0
  9. package/build/index.d.ts +1 -0
  10. package/build/index.js +1 -0
  11. package/build/index.js.map +1 -1
  12. package/build/parser/algorithms/cyk.js +1 -1
  13. package/build/parser/algorithms/cyk.js.map +1 -1
  14. package/build/parser/algorithms/earley.js +10 -8
  15. package/build/parser/algorithms/earley.js.map +1 -1
  16. package/build/parser/algorithms/lr.js +47 -0
  17. package/build/parser/algorithms/lr.js.map +5 -1
  18. package/build/parser/algorithms/lr0.d.ts +7 -0
  19. package/build/parser/algorithms/lr0.js +156 -0
  20. package/build/parser/algorithms/lr0.js.map +1 -0
  21. package/build/parser/algorithms/lrk/algorithm.d.ts +7 -0
  22. package/build/parser/algorithms/lrk/algorithm.js +35 -0
  23. package/build/parser/algorithms/lrk/algorithm.js.map +1 -0
  24. package/build/parser/algorithms/lrk/bimap.d.ts +6 -0
  25. package/build/parser/algorithms/lrk/bimap.js +19 -0
  26. package/build/parser/algorithms/lrk/bimap.js.map +1 -0
  27. package/build/parser/algorithms/lrk/canonical-collection.d.ts +14 -0
  28. package/build/parser/algorithms/lrk/canonical-collection.js +73 -0
  29. package/build/parser/algorithms/lrk/canonical-collection.js.map +1 -0
  30. package/build/parser/algorithms/lrk/closure.d.ts +10 -0
  31. package/build/parser/algorithms/lrk/closure.js +30 -0
  32. package/build/parser/algorithms/lrk/closure.js.map +1 -0
  33. package/build/parser/algorithms/lrk/stack.d.ts +19 -0
  34. package/build/parser/algorithms/lrk/stack.js +39 -0
  35. package/build/parser/algorithms/lrk/stack.js.map +1 -0
  36. package/build/parser/algorithms/lrk/state.d.ts +12 -0
  37. package/build/parser/algorithms/lrk/state.js +3 -0
  38. package/build/parser/algorithms/lrk/state.js.map +1 -0
  39. package/build/parser/parser.d.ts +3 -3
  40. package/build/parser/parser.js +3 -3
  41. package/build/parser/parser.js.map +1 -1
  42. package/build/typings.d.ts +1 -0
  43. package/build/utility/monarch.d.ts +5 -0
  44. package/build/utility/monarch.js +42 -0
  45. package/build/utility/monarch.js.map +1 -0
  46. package/package.json +1 -1
  47. package/src/compiler/builtin/json.gwell +74 -0
  48. package/src/compiler/builtin/number.gwell +20 -0
  49. package/src/compiler/builtin/string.gwell +48 -0
  50. package/src/compiler/builtin/whitespace.gwell +10 -0
  51. package/src/compiler/builtin.json +1 -0
  52. package/src/compiler/compiler.ts +45 -24
  53. package/src/compiler/gwell.gwell +283 -0
  54. package/src/compiler/gwell.js +557 -0
  55. package/src/index.ts +2 -1
  56. package/src/parser/algorithms/cyk.ts +1 -1
  57. package/src/parser/algorithms/earley.ts +10 -10
  58. package/src/parser/algorithms/lrk/algorithm.ts +36 -0
  59. package/src/parser/algorithms/lrk/bimap.ts +17 -0
  60. package/src/parser/algorithms/lrk/canonical-collection.ts +79 -0
  61. package/src/parser/algorithms/lrk/closure.ts +37 -0
  62. package/src/parser/algorithms/lrk/stack.ts +53 -0
  63. package/src/parser/algorithms/lrk/state.ts +10 -0
  64. package/src/parser/parser.ts +5 -5
  65. package/src/typings.ts +1 -0
  66. package/src/utility/monarch.ts +36 -0
  67. package/src/parser/algorithms/lr.ts +0 -74
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LRStack = void 0;
4
+ class LRStack {
5
+ stack = [];
6
+ get current() {
7
+ return this.stack[this.stack.length - 1];
8
+ }
9
+ get previous() {
10
+ return this.stack[this.stack.length - 2];
11
+ }
12
+ shift(state) {
13
+ this.current.state = state;
14
+ }
15
+ reduce(rule) {
16
+ const n = LRStack.NewItem();
17
+ const l = rule.symbols.length;
18
+ n.children = this.stack.splice(l * -1, l);
19
+ n.children.forEach(v => delete v.state);
20
+ n.rule = rule;
21
+ n.symbol = rule.name;
22
+ this.stack.push(n);
23
+ }
24
+ append(symbol) {
25
+ this.stack.push(LRStack.NewItem());
26
+ this.current.symbol = symbol;
27
+ }
28
+ static NewItem() {
29
+ return {
30
+ children: [],
31
+ state: null,
32
+ symbol: null,
33
+ rule: null,
34
+ value: null
35
+ };
36
+ }
37
+ }
38
+ exports.LRStack = LRStack;
39
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../../../src/parser/algorithms/lrk/stack.ts"],"names":[],"mappings":";;;AAGA,MAAa,OAAO;IAEhB,KAAK,GAAkB,EAAE,CAAC;IAE1B,IAAI,OAAO;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC7C,CAAC;IAGD,KAAK,CAAC,KAAY;QACd,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,IAAiB;QACpB,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QAC9B,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC;QACxC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC;QACd,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACrB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,MAAyB;QAC5B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAA;QAClC,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,MAAM,CAAC;IACjC,CAAC;IAED,MAAM,CAAC,OAAO;QACV,OAAO;YACH,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI;YACZ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI;SACd,CAAA;IACL,CAAC;CACJ;AAzCD,0BAyCC"}
@@ -0,0 +1,12 @@
1
+ import { GrammarRule, GrammarRuleSymbol } from "../../../typings";
2
+ export interface State {
3
+ items: {
4
+ rule: GrammarRule;
5
+ dot: number;
6
+ }[];
7
+ isFinal: boolean;
8
+ actions: Map<GrammarRuleSymbol, string>;
9
+ goto: Map<GrammarRuleSymbol, string>;
10
+ reduce: number;
11
+ rule: GrammarRule;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../../../src/parser/algorithms/lrk/state.ts"],"names":[],"mappings":""}
@@ -14,9 +14,9 @@ export declare class Parser {
14
14
  };
15
15
  private getTokenQueue;
16
16
  }
17
- export declare class ParserUtility {
18
- static TokenMatchesSymbol(token: LexerToken, symbol: GrammarRuleSymbol): boolean;
19
- static SymbolIsTerminal<T extends GrammarRuleSymbol>(symbol: T): boolean;
17
+ export declare abstract class ParserUtility {
18
+ static SymbolMatchesToken(symbol: GrammarRuleSymbol, token: LexerToken): boolean;
19
+ static SymbolIsTerminal(symbol: GrammarRuleSymbol): boolean;
20
20
  static PostProcess(rule: GrammarRule, data: any, meta?: any): any;
21
21
  }
22
22
  interface ParserOptions {
@@ -6,11 +6,11 @@ const stateful_lexer_1 = require("../lexers/stateful-lexer");
6
6
  const token_buffer_1 = require("../lexers/token-buffer");
7
7
  const cyk_1 = require("./algorithms/cyk");
8
8
  const earley_1 = require("./algorithms/earley");
9
- const lr_1 = require("./algorithms/lr");
9
+ const algorithm_1 = require("./algorithms/lrk/algorithm");
10
10
  const ParserRegistry = {
11
11
  earley: earley_1.Earley,
12
12
  cyk: cyk_1.CYK,
13
- lr: lr_1.LR
13
+ lr0: algorithm_1.LRK
14
14
  };
15
15
  function Parse(language, input, options) {
16
16
  const i = new Parser(language, options);
@@ -46,7 +46,7 @@ class Parser {
46
46
  }
47
47
  exports.Parser = Parser;
48
48
  class ParserUtility {
49
- static TokenMatchesSymbol(token, symbol) {
49
+ static SymbolMatchesToken(symbol, token) {
50
50
  if (typeof symbol === 'string')
51
51
  throw 'Attempted to match token against non-terminal';
52
52
  if (typeof symbol == 'function')
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/parser/parser.ts"],"names":[],"mappings":"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"}
@@ -40,6 +40,7 @@ export type JavascriptDirective = {
40
40
  export interface ImportDirective {
41
41
  import: string;
42
42
  path?: boolean;
43
+ alias?: string;
43
44
  }
44
45
  export interface ConfigDirective {
45
46
  config: Dictionary<any>;
@@ -0,0 +1,5 @@
1
+ import { LexerConfig } from "../typings";
2
+ export declare function CreateMonarchTokenizer(lexer: LexerConfig): {
3
+ start: string;
4
+ tokenizer: any;
5
+ };
@@ -0,0 +1,42 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CreateMonarchTokenizer = void 0;
4
+ function CreateMonarchTokenizer(lexer) {
5
+ const tokenizer = {};
6
+ const { start, states } = lexer;
7
+ for (const key in states) {
8
+ const { name, rules } = states[key];
9
+ tokenizer[name] = [];
10
+ for (const rule of rules) {
11
+ if ('import' in rule) {
12
+ for (const i of rule.import) {
13
+ tokenizer[name].push({ include: i });
14
+ }
15
+ }
16
+ else if ('pop' in rule) {
17
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@pop' }]);
18
+ }
19
+ else if ('goto' in rule) {
20
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@' + rule.goto }]);
21
+ }
22
+ else if ('set' in rule) {
23
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', switchTo: '@' + rule.set }]);
24
+ }
25
+ else if ('inset' in rule) {
26
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@push' }]);
27
+ }
28
+ else if ('when' in rule) {
29
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source' }]);
30
+ }
31
+ }
32
+ }
33
+ return { start, tokenizer };
34
+ }
35
+ exports.CreateMonarchTokenizer = CreateMonarchTokenizer;
36
+ function TransformWhen(obj) {
37
+ return typeof obj == 'string' ? new RegExp(RegexEscape(obj)) : new RegExp(obj.regex, obj.flags);
38
+ }
39
+ function RegexEscape(string) {
40
+ return string.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
41
+ }
42
+ //# sourceMappingURL=monarch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monarch.js","sourceRoot":"","sources":["../../src/utility/monarch.ts"],"names":[],"mappings":";;;AAEA,SAAgB,sBAAsB,CAAC,KAAkB;IACrD,MAAM,SAAS,GAAQ,EAAE,CAAC;IAC1B,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE;QACtB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACpC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;YACtB,IAAI,QAAQ,IAAI,IAAI,EAAE;gBAClB,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE;oBACzB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;iBACvC;aACJ;iBAAM,IAAI,KAAK,IAAI,IAAI,EAAE;gBACtB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,CAAA;aACxG;iBAAM,IAAI,MAAM,IAAI,IAAI,EAAE;gBACvB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;aACjH;iBAAM,IAAI,KAAK,IAAI,IAAI,EAAE;gBACtB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,QAAQ,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;aACpH;iBAAM,IAAI,OAAO,IAAI,IAAI,EAAE;gBACxB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;aACzG;iBAAM,IAAI,MAAM,IAAI,IAAI,EAAE;gBACvB,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,QAAQ,EAAE,CAAC,CAAC,CAAA;aAC1F;SACJ;KACJ;IACD,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;AAChC,CAAC;AAzBD,wDAyBC;AAED,SAAS,aAAa,CAAC,GAAG;IACtB,OAAO,OAAO,GAAG,IAAI,QAAQ,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,WAAW,CAAC,MAAM;IACvB,OAAO,MAAM,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAA;AAC1D,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "grammar-well",
3
- "version": "1.2.0",
3
+ "version": "1.2.2",
4
4
  "description": "Cross-platform Parser written in TypeScript",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -0,0 +1,74 @@
1
+ import * from whitespace;
2
+
3
+ lexer: {{
4
+ start: "json"
5
+
6
+ json ->
7
+ - import: whitespace
8
+ - when: /-?(?:[0-9]|[1-9][0-9]+)(?:\.[0-9]+)?(?:[eE][-+]?[0-9]+)?\b/ tag: "number"
9
+ - when: /"(?:\\["bfnrt\/\\]|\\u[a-fA-F0-9]{4}|[^"\\])*"/ tag: "string"
10
+ - when: "{" tag: "{"
11
+ - when: "}" tag: "}"
12
+ - when: "[" tag: "["
13
+ - when: "]" tag: "]"
14
+ - when: "," tag: ","
15
+ - when: ":" tag: ":"
16
+ - when: "true" tag: "true"
17
+ - when: "false" tag: "false"
18
+ - when: "null" tag: "null"
19
+ }}
20
+
21
+ grammar: {{
22
+ json -> _ (object | array) _ : {{ $1[0] }}
23
+
24
+ object -> "{" _ "}" : {{ {} }}
25
+ | "{" _ pair (_ "," _ pair)* _ "}" : ${ extractObject }
26
+
27
+ array -> "[" _ "]" : {{ [] }}
28
+ | "[" _ value (_ "," _ value)* _ "]" : ${ extractArray }
29
+
30
+ value : {{ $0 }} ->
31
+ object
32
+ | array
33
+ | number
34
+ | string
35
+ | "true" : {{ true }}
36
+ | "false" : {{ false }}
37
+ | "null" : {{ null }}
38
+
39
+ number -> $number : {{ parseFloat($0.value) }}
40
+
41
+ string -> $string : {{ JSON.parse($0.value) }}
42
+
43
+ pair -> key:k _ ":" _ value:v : {{ [$k, $v] }}
44
+
45
+ key -> string : {{ $0 }}
46
+ }}
47
+
48
+ head: ${
49
+ function extractPair(kv, output) {
50
+ if(kv[0]) { output[kv[0]] = kv[1]; }
51
+ }
52
+
53
+ function extractObject({data}) {
54
+ let output = {};
55
+
56
+ extractPair(data[2], output);
57
+
58
+ for (let i in data[3]) {
59
+ extractPair(data[3][i][3], output);
60
+ }
61
+
62
+ return output;
63
+ }
64
+
65
+ function extractArray({data}) {
66
+ let output = [data[2]];
67
+
68
+ for (let i in data[3]) {
69
+ output.push(data[3][i][3]);
70
+ }
71
+
72
+ return output;
73
+ }
74
+ }
@@ -0,0 +1,20 @@
1
+ grammar: {{
2
+
3
+ unsigned_int ->
4
+ /[0-9]/+ : {{ parseInt($0.join("")) }}
5
+
6
+ int ->
7
+ ("-"|"+")? /[0-9]/+ : {{ $0 ? parseInt($0[0]+$1.join("")) : parseInt($1.join("")) }}
8
+
9
+ unsigned_decimal ->
10
+ /[0-9]/+ ("." /[0-9]/+)? : {{ parseFloat($0.join("") + ($1 ? "."+$1[1].join("") : "")) }}
11
+
12
+ decimal ->
13
+ "-"? /[0-9]/+ ("." /[0-9]/+)? : {{ parseFloat( ($0 || "") + $1.join("") +($2 ? "."+$2[1].join("") : "")) }}
14
+
15
+ percentage ->
16
+ decimal "%" : {{ $0/100 }}
17
+
18
+ jsonfloat ->
19
+ "-"? /[0-9]/+ ("." /[0-9]/+)? (/[eE]/ /[+-]/? /[0-9]/+)? : {{ parseFloat( ($0 || "") + $1.join("") + ($2 ? "."+$2[1].join("") : "") + ($3 ? "e" + ($3[1] || "+") + $3[2].join("") : "")) }}
20
+ }}
@@ -0,0 +1,48 @@
1
+ lexer: {{
2
+ string ->
3
+ - import: singleQuoteString, doubleQuoteString
4
+
5
+ doubleQuoteString ->
6
+ - when: /"/ tag: "dquote" highlight:"string" goto: doubleQuoteStringEnd
7
+
8
+ singleQuoteString ->
9
+ - when: /'/ tag: "squote" highlight:"string" goto: singleQuoteStringEnd
10
+
11
+ doubleQuoteStringEnd ->
12
+ - when: /\\[\\\/bnrft]/ tag: "escaped" highlight:"constant"
13
+ - when: /\\"/ tag: "quoteEscape"
14
+ - when: /\\u[A-Fa-f\d]{4}/ tag: "escaped" highlight:"constant"
15
+ - when: /\\./ tag:"badEscape"
16
+ - when: /[^"\\]+/ tag: "string" highlight:"string"
17
+ - when: "\"" tag: "dquote" highlight:"string" pop
18
+
19
+ singleQuoteStringEnd ->
20
+ - when: /\\[\\\/bnrft]/ tag: "escaped"
21
+ - when: /\\'/ tag: "quoteEscape"
22
+ - when: /\\u[A-Fa-f\d]{4}/ tag: "escaped"
23
+ - when: /\\./ tag:"badEscape"
24
+ - when: /[^'\\]+/ tag: "string" highlight:"string"
25
+ - when: "'" tag: "squote" highlight:"string" pop
26
+ }}
27
+
28
+ grammar: {{
29
+ string : {{ $0 }}
30
+ -> singleQuoteString
31
+ | doubleQuoteString
32
+
33
+ doubleQuoteString
34
+ -> $dquote stringInner $dquote : {{ $1 }}
35
+ | $dquote $dquote : {{ '' }}
36
+
37
+ singleQuoteString
38
+ -> $squote stringInner $squote : {{ $1 }}
39
+ | $squote $squote : {{ '' }}
40
+
41
+ stringInner -> stringEscape : {{ $0 }}
42
+ | $string : {{ $0.value }}
43
+ | stringInner stringEscape : {{ $0 + $1 }}
44
+ | stringInner $string : {{ $0 + $1.value }}
45
+
46
+ stringEscape -> $escaped : {{ JSON.parse('"' +$0.value + '"') }}
47
+ | $quoteEscape : {{ $0.value[1] }}
48
+ }}
@@ -0,0 +1,10 @@
1
+ lexer: {{
2
+ start: "whitespace"
3
+ whitespace ->
4
+ - when: /\s+/ tag: "whitespace"
5
+ }}
6
+
7
+ grammar: {{
8
+ _ -> $whitespace* : {{ null }}
9
+ __ -> $whitespace+ : {{ null }}
10
+ }}
@@ -0,0 +1 @@
1
+ {"json":"import * from whitespace;\r\n\r\nlexer: {{\r\n start: \"json\"\r\n\r\n json ->\r\n - import: whitespace\r\n - when: /-?(?:[0-9]|[1-9][0-9]+)(?:\\.[0-9]+)?(?:[eE][-+]?[0-9]+)?\\b/ tag: \"number\"\r\n - when: /\"(?:\\\\[\"bfnrt\\/\\\\]|\\\\u[a-fA-F0-9]{4}|[^\"\\\\])*\"/ tag: \"string\"\r\n - when: \"{\" tag: \"{\"\r\n - when: \"}\" tag: \"}\"\r\n - when: \"[\" tag: \"[\"\r\n - when: \"]\" tag: \"]\"\r\n - when: \",\" tag: \",\"\r\n - when: \":\" tag: \":\"\r\n - when: \"true\" tag: \"true\"\r\n - when: \"false\" tag: \"false\"\r\n - when: \"null\" tag: \"null\"\r\n}}\r\n\r\ngrammar: {{\r\n json -> _ (object | array) _ : {{ $1[0] }}\r\n\r\n object -> \"{\" _ \"}\" : {{ {} }}\r\n | \"{\" _ pair (_ \",\" _ pair)* _ \"}\" : ${ extractObject }\r\n\r\n array -> \"[\" _ \"]\" : {{ [] }}\r\n | \"[\" _ value (_ \",\" _ value)* _ \"]\" : ${ extractArray }\r\n\r\n value : {{ $0 }} ->\r\n object\r\n | array\r\n | number\r\n | string\r\n | \"true\" : {{ true }}\r\n | \"false\" : {{ false }}\r\n | \"null\" : {{ null }}\r\n\r\n number -> $number : {{ parseFloat($0.value) }}\r\n\r\n string -> $string : {{ JSON.parse($0.value) }}\r\n\r\n pair -> key:k _ \":\" _ value:v : {{ [$k, $v] }}\r\n\r\n key -> string : {{ $0 }}\r\n}}\r\n\r\nhead: ${\r\n function extractPair(kv, output) {\r\n if(kv[0]) { output[kv[0]] = kv[1]; }\r\n }\r\n\r\n function extractObject({data}) {\r\n let output = {};\r\n\r\n extractPair(data[2], output);\r\n\r\n for (let i in data[3]) {\r\n extractPair(data[3][i][3], output);\r\n }\r\n\r\n return output;\r\n }\r\n\r\n function extractArray({data}) {\r\n let output = [data[2]];\r\n\r\n for (let i in data[3]) {\r\n output.push(data[3][i][3]);\r\n }\r\n\r\n return output;\r\n }\r\n}\r\n","number":"grammar: {{\r\n\r\n unsigned_int -> \r\n /[0-9]/+ : {{ parseInt($0.join(\"\")) }}\r\n\r\n int -> \r\n (\"-\"|\"+\")? /[0-9]/+ : {{ $0 ? parseInt($0[0]+$1.join(\"\")) : parseInt($1.join(\"\")) }}\r\n\r\n unsigned_decimal -> \r\n /[0-9]/+ (\".\" /[0-9]/+)? : {{ parseFloat($0.join(\"\") + ($1 ? \".\"+$1[1].join(\"\") : \"\")) }}\r\n\r\n decimal -> \r\n \"-\"? /[0-9]/+ (\".\" /[0-9]/+)? : {{ parseFloat( ($0 || \"\") + $1.join(\"\") +($2 ? \".\"+$2[1].join(\"\") : \"\")) }}\r\n\r\n percentage -> \r\n decimal \"%\" : {{ $0/100 }}\r\n \r\n jsonfloat -> \r\n \"-\"? /[0-9]/+ (\".\" /[0-9]/+)? (/[eE]/ /[+-]/? /[0-9]/+)? : {{ parseFloat( ($0 || \"\") + $1.join(\"\") + ($2 ? \".\"+$2[1].join(\"\") : \"\") + ($3 ? \"e\" + ($3[1] || \"+\") + $3[2].join(\"\") : \"\")) }}\r\n}}","string":"lexer: {{\r\n string ->\r\n - import: singleQuoteString, doubleQuoteString\r\n\r\n doubleQuoteString ->\r\n - when: /\"/ tag: \"dquote\" highlight:\"string\" goto: doubleQuoteStringEnd \r\n\r\n singleQuoteString ->\r\n - when: /'/ tag: \"squote\" highlight:\"string\" goto: singleQuoteStringEnd \r\n\r\n doubleQuoteStringEnd ->\r\n - when: /\\\\[\\\\\\/bnrft]/ tag: \"escaped\" highlight:\"constant\"\r\n - when: /\\\\\"/ tag: \"quoteEscape\"\r\n - when: /\\\\u[A-Fa-f\\d]{4}/ tag: \"escaped\" highlight:\"constant\"\r\n - when: /\\\\./ tag:\"badEscape\"\r\n - when: /[^\"\\\\]+/ tag: \"string\" highlight:\"string\"\r\n - when: \"\\\"\" tag: \"dquote\" highlight:\"string\" pop\r\n\r\n singleQuoteStringEnd ->\r\n - when: /\\\\[\\\\\\/bnrft]/ tag: \"escaped\"\r\n - when: /\\\\'/ tag: \"quoteEscape\"\r\n - when: /\\\\u[A-Fa-f\\d]{4}/ tag: \"escaped\" \r\n - when: /\\\\./ tag:\"badEscape\"\r\n - when: /[^'\\\\]+/ tag: \"string\" highlight:\"string\"\r\n - when: \"'\" tag: \"squote\" highlight:\"string\" pop\r\n}}\r\n\r\ngrammar: {{\r\n string : {{ $0 }} \r\n -> singleQuoteString \r\n | doubleQuoteString \r\n\r\n doubleQuoteString \r\n -> $dquote stringInner $dquote : {{ $1 }}\r\n | $dquote $dquote : {{ '' }}\r\n \r\n singleQuoteString \r\n -> $squote stringInner $squote : {{ $1 }}\r\n | $squote $squote : {{ '' }}\r\n\r\n stringInner -> stringEscape : {{ $0 }}\r\n | $string : {{ $0.value }}\r\n | stringInner stringEscape : {{ $0 + $1 }}\r\n | stringInner $string : {{ $0 + $1.value }}\r\n \r\n stringEscape -> $escaped : {{ JSON.parse('\"' +$0.value + '\"') }}\r\n | $quoteEscape : {{ $0.value[1] }}\r\n}}","whitespace":"lexer: {{\r\n start: \"whitespace\"\r\n whitespace ->\r\n - when: /\\s+/ tag: \"whitespace\" \r\n}}\r\n\r\ngrammar: {{\r\n _ -> $whitespace* : {{ null }}\r\n __ -> $whitespace+ : {{ null }}\r\n}}"}
@@ -2,22 +2,15 @@ import { CompileOptions, GrammarBuilderContext, TemplateFormat, LanguageDirectiv
2
2
 
3
3
  import { Parser } from "../parser/parser";
4
4
  import { FileSystemResolver } from "./import-resolver";
5
- import Language from '../grammars/gwell';
5
+ import Language from './gwell';
6
6
 
7
7
  import { ESMOutput, JavascriptOutput } from "./outputs/javascript";
8
8
  import { TypescriptFormat } from "./outputs/typescript";
9
9
  import { JSONFormatter } from "./outputs/json";
10
10
 
11
- import * as number from '../grammars/number.json';
12
- import * as string from '../grammars/string.json';
13
- import * as whitespace from '../grammars/whitespace.json';
14
11
  import { Generator } from "./generator/generator";
12
+ import * as BuiltInRegistry from "./builtin.json"
15
13
 
16
- const BuiltInRegistry = {
17
- number,
18
- string,
19
- whitespace,
20
- }
21
14
  const TemplateFormats = {
22
15
  _default: JavascriptOutput,
23
16
  object: (grammar, exportName) => ({ grammar, exportName }),
@@ -44,7 +37,7 @@ export class GrammarBuilder {
44
37
 
45
38
  generator = new Generator();
46
39
 
47
- constructor(private config: CompileOptions = {}, context?: GrammarBuilderContext) {
40
+ constructor(private config: CompileOptions = {}, context?: GrammarBuilderContext, private alias: string = '') {
48
41
  this.context = context || {
49
42
  alreadyCompiled: new Set(),
50
43
  resolver: config.resolverInstance ? config.resolverInstance : config.resolver ? new config.resolver(config.basedir) : new FileSystemResolver(config.basedir),
@@ -90,7 +83,7 @@ export class GrammarBuilder {
90
83
 
91
84
  private async processImportDirective(directive: ImportDirective) {
92
85
  if (directive.path) {
93
- await this.importGrammar(directive.import);
86
+ await this.importGrammar(directive.import, directive.alias);
94
87
  } else {
95
88
  this.importBuiltIn(directive.import);
96
89
  }
@@ -102,15 +95,22 @@ export class GrammarBuilder {
102
95
 
103
96
  private processGrammarDirective(directive: GrammarDirective) {
104
97
  if (directive.grammar.config) {
105
- this.generator.state.grammar.start = directive.grammar.config.start || this.generator.state.grammar.start;
98
+ if (directive.grammar.config.start) {
99
+ this.generator.state.grammar.start = this.alias + directive.grammar.config.start;
100
+ }
101
+
106
102
  Object.assign(this.generator.state.grammar.config, directive.grammar.config);
107
103
  // this.generator.state.grammar.postprocessDefault = directive.grammar.config.postprocessDefault || this.generator.state.grammar.postprocessDefault;
108
104
  // this.generator.state.grammar.postprocessOverride = directive.grammar.config.postprocessOverride || this.generator.state.grammar.postprocessOverride;
109
105
  }
110
106
 
107
+ if (!this.generator.state.grammar.start && directive.grammar.rules.length) {
108
+ this.generator.state.grammar.start = this.alias + directive.grammar.rules[0].name;
109
+ }
110
+
111
111
  for (const rule of directive.grammar.rules) {
112
+ rule.name = this.alias + rule.name;
112
113
  this.buildRules(rule.name, rule.expressions, rule);
113
- this.generator.state.grammar.start = this.generator.state.grammar.start || rule.name;
114
114
  }
115
115
  }
116
116
 
@@ -121,33 +121,54 @@ export class GrammarBuilder {
121
121
  states: {}
122
122
  };
123
123
  }
124
- this.generator.state.lexer.start = directive.lexer.start || this.generator.state.lexer.start || (directive.lexer.states.length ? directive.lexer.states[0].name : '');
124
+ if (directive.lexer.start) {
125
+ this.generator.state.lexer.start = this.alias + directive.lexer.start;
126
+ }
127
+
128
+ if (!this.generator.state.lexer.start && directive.lexer.states.length) {
129
+ this.generator.state.lexer.start = this.alias + directive.lexer.states[0].name
130
+ }
131
+
125
132
  for (const state of directive.lexer.states) {
133
+ state.name = this.alias + state.name;
134
+ if (this.alias) {
135
+ state.rules.forEach(v => {
136
+ if ('import' in v) {
137
+ v.import = v.import.map(v2 => this.alias + v2);
138
+ }
139
+ if ('set' in v) {
140
+ v.set = this.alias + v.set;
141
+ }
142
+ if ('goto' in v) {
143
+ v.goto = this.alias + v.goto;
144
+ }
145
+ })
146
+ }
126
147
  this.generator.addLexerState(state);
127
148
  }
128
149
  }
129
150
 
130
- private importBuiltIn(name: string) {
151
+ private async importBuiltIn(name: string, alias?: string) {
131
152
  name = name.toLowerCase();
132
153
  if (!this.context.alreadyCompiled.has(name)) {
133
154
  this.context.alreadyCompiled.add(name);
134
155
  if (!BuiltInRegistry[name])
135
156
  return;
136
- this.generator.merge(BuiltInRegistry[name].state);
157
+ await this.mergeLanguageDefinitionString(BuiltInRegistry[name], alias);
137
158
  }
138
159
  }
139
160
 
140
- private async importGrammar(name) {
161
+ private async importGrammar(path: string, alias?: string) {
141
162
  const resolver = this.context.resolver;
142
- const path = resolver.path(name);
143
- if (!this.context.alreadyCompiled.has(path)) {
144
- this.context.alreadyCompiled.add(path);
145
- await this.mergeLanguageDefinitionString(await resolver.body(path))
163
+ const fullPath = resolver.path(path);
164
+ if (!this.context.alreadyCompiled.has(fullPath)) {
165
+ this.context.alreadyCompiled.add(fullPath);
166
+ await this.mergeLanguageDefinitionString(await resolver.body(fullPath), alias);
146
167
  }
147
168
  }
148
169
 
149
- private async mergeLanguageDefinitionString(body: string) {
150
- const builder = new GrammarBuilder(this.config, this.context);
170
+ private async mergeLanguageDefinitionString(body: string, alias: string = '') {
171
+ const builder = new GrammarBuilder(this.config, this.context, alias);
151
172
  await builder.import(this.parser.run(body).results[0]);
152
173
  this.generator.merge(builder.generator.state);
153
174
  return;
@@ -174,7 +195,7 @@ export class GrammarBuilder {
174
195
  return this.buildRepeatRules(name, symbol);
175
196
  }
176
197
  if ('rule' in symbol) {
177
- return symbol;
198
+ return { ...symbol, rule: this.alias + symbol.rule };
178
199
  }
179
200
  if ('regex' in symbol) {
180
201
  return symbol;