grammar-well 1.1.11 → 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.
Files changed (89) hide show
  1. package/README.md +1 -1
  2. package/bootstrap.ts +1 -1
  3. package/build/compiler/compiler.d.ts +1 -1
  4. package/build/compiler/compiler.js +2 -1
  5. package/build/compiler/compiler.js.map +1 -1
  6. package/build/compiler/generator/artifacts/lr.d.ts +51 -0
  7. package/build/{utility → compiler/generator/artifacts}/lr.js +53 -58
  8. package/build/compiler/generator/artifacts/lr.js.map +1 -0
  9. package/build/compiler/generator/artifacts/standard.d.ts +7 -0
  10. package/build/compiler/generator/artifacts/standard.js +28 -0
  11. package/build/compiler/generator/artifacts/standard.js.map +1 -0
  12. package/build/compiler/generator/generator.d.ts +24 -0
  13. package/build/compiler/{generator.js → generator/generator.js} +71 -75
  14. package/build/compiler/generator/generator.js.map +1 -0
  15. package/build/compiler/outputs/javascript.d.ts +1 -1
  16. package/build/compiler/outputs/json.d.ts +1 -1
  17. package/build/compiler/outputs/typescript.d.ts +1 -1
  18. package/build/grammars/gwell.js +1 -1
  19. package/build/index.d.ts +1 -0
  20. package/build/index.js +1 -0
  21. package/build/index.js.map +1 -1
  22. package/build/parser/algorithms/cyk.js +1 -1
  23. package/build/parser/algorithms/cyk.js.map +1 -1
  24. package/build/parser/algorithms/earley.js +10 -8
  25. package/build/parser/algorithms/earley.js.map +1 -1
  26. package/build/parser/algorithms/lr.d.ts +2 -5
  27. package/build/parser/algorithms/lr.js +88 -14
  28. package/build/parser/algorithms/lr.js.map +5 -1
  29. package/build/parser/algorithms/lr0.d.ts +7 -0
  30. package/build/parser/algorithms/lr0.js +156 -0
  31. package/build/parser/algorithms/lr0.js.map +1 -0
  32. package/build/parser/algorithms/lrk/algorithm.d.ts +7 -0
  33. package/build/parser/algorithms/lrk/algorithm.js +35 -0
  34. package/build/parser/algorithms/lrk/algorithm.js.map +1 -0
  35. package/build/parser/algorithms/lrk/bimap.d.ts +6 -0
  36. package/build/parser/algorithms/lrk/bimap.js +19 -0
  37. package/build/parser/algorithms/lrk/bimap.js.map +1 -0
  38. package/build/parser/algorithms/lrk/canonical-collection.d.ts +14 -0
  39. package/build/parser/algorithms/lrk/canonical-collection.js +73 -0
  40. package/build/parser/algorithms/lrk/canonical-collection.js.map +1 -0
  41. package/build/parser/algorithms/lrk/closure.d.ts +10 -0
  42. package/build/parser/algorithms/lrk/closure.js +30 -0
  43. package/build/parser/algorithms/lrk/closure.js.map +1 -0
  44. package/build/parser/algorithms/lrk/stack.d.ts +19 -0
  45. package/build/parser/algorithms/lrk/stack.js +39 -0
  46. package/build/parser/algorithms/lrk/stack.js.map +1 -0
  47. package/build/parser/algorithms/lrk/state.d.ts +12 -0
  48. package/build/parser/algorithms/lrk/state.js +3 -0
  49. package/build/parser/algorithms/lrk/state.js.map +1 -0
  50. package/build/parser/parser.d.ts +3 -3
  51. package/build/parser/parser.js +3 -3
  52. package/build/parser/parser.js.map +1 -1
  53. package/build/typings.d.ts +18 -1
  54. package/build/utility/general.d.ts +3 -4
  55. package/build/utility/general.js +6 -10
  56. package/build/utility/general.js.map +1 -1
  57. package/build/utility/monarch.d.ts +5 -0
  58. package/build/utility/monarch.js +42 -0
  59. package/build/utility/monarch.js.map +1 -0
  60. package/package.json +1 -1
  61. package/src/compiler/compiler.ts +3 -2
  62. package/src/compiler/generator/artifacts/lr.ts +155 -0
  63. package/src/compiler/generator/artifacts/standard.ts +26 -0
  64. package/src/compiler/{generator.ts → generator/generator.ts} +75 -75
  65. package/src/compiler/outputs/javascript.ts +1 -1
  66. package/src/compiler/outputs/json.ts +1 -1
  67. package/src/compiler/outputs/typescript.ts +1 -1
  68. package/src/grammars/gwell.gwell +1 -1
  69. package/src/grammars/gwell.js +1 -1
  70. package/src/grammars/gwell.json +1 -1
  71. package/src/index.ts +2 -1
  72. package/src/parser/algorithms/cyk.ts +1 -1
  73. package/src/parser/algorithms/earley.ts +10 -10
  74. package/src/parser/algorithms/lrk/algorithm.ts +36 -0
  75. package/src/parser/algorithms/lrk/bimap.ts +17 -0
  76. package/src/parser/algorithms/lrk/canonical-collection.ts +79 -0
  77. package/src/parser/algorithms/lrk/closure.ts +37 -0
  78. package/src/parser/algorithms/lrk/stack.ts +53 -0
  79. package/src/parser/algorithms/lrk/state.ts +10 -0
  80. package/src/parser/parser.ts +5 -5
  81. package/src/typings.ts +17 -1
  82. package/src/utility/general.ts +6 -9
  83. package/src/utility/monarch.ts +36 -0
  84. package/build/compiler/generator.d.ts +0 -23
  85. package/build/compiler/generator.js.map +0 -1
  86. package/build/utility/lr.d.ts +0 -52
  87. package/build/utility/lr.js.map +0 -1
  88. package/src/parser/algorithms/lr.ts +0 -37
  89. package/src/utility/lr.ts +0 -152
@@ -0,0 +1,79 @@
1
+ import { GrammarRule, GrammarRuleSymbol, LanguageDefinition } from "../../../typings";
2
+ import { ParserUtility } from "../../parser";
3
+ import { BiMap } from "./bimap";
4
+ import { ClosureBuilder } from "./closure";
5
+ import { State } from "./state";
6
+
7
+ export class CanonicalCollection {
8
+ states: Map<string, State> = new Map();
9
+ rules: BiMap<GrammarRule> = new BiMap();
10
+ terminals: BiMap<GrammarRuleSymbol> = new BiMap();
11
+
12
+ private closure: ClosureBuilder;
13
+ constructor(
14
+ public grammar: LanguageDefinition['grammar']
15
+ ) {
16
+ const augmented = {
17
+ name: Symbol() as unknown as string,
18
+ symbols: [grammar.start]
19
+ }
20
+ grammar['rules'][augmented.name] = [augmented];
21
+ this.closure = new ClosureBuilder(grammar);
22
+ this.rules.id(augmented);
23
+ this.addState(grammar['rules'][augmented.name][0], 0);
24
+ this.linkStates('0.0');
25
+ }
26
+
27
+ private addState(rule: GrammarRule, dot: number) {
28
+ const id = this.getStateId(rule, dot);
29
+ if (this.states.has(id))
30
+ return;
31
+
32
+ const state: State = {
33
+ items: [],
34
+ isFinal: false,
35
+ actions: new Map(),
36
+ goto: new Map(),
37
+ reduce: null,
38
+ rule: rule
39
+ }
40
+
41
+ state.items.push({ rule, dot });
42
+ if (rule.symbols.length == dot)
43
+ state.isFinal = true;
44
+
45
+ this.states.set(id, state);
46
+
47
+ state.items.push(...this.closure.get(rule.symbols[dot] as string))
48
+
49
+ if (!state.isFinal)
50
+ for (const { rule, dot } of state.items) {
51
+ this.addState(rule, dot + 1);
52
+ }
53
+ }
54
+
55
+ private linkStates(id: string, completed: Set<string> = new Set()) {
56
+ completed.add(id);
57
+ const state = this.states.get(id);
58
+ if (!state.isFinal) {
59
+ for (const { rule, dot } of state.items) {
60
+ const symbol = rule.symbols[dot];
61
+ const itemStateId = this.getStateId(rule, dot + 1);
62
+ if (ParserUtility.SymbolIsTerminal(symbol) && typeof symbol != 'symbol') {
63
+ state.actions.set(symbol, itemStateId);
64
+ } else {
65
+ state.goto.set(symbol, itemStateId);
66
+ }
67
+
68
+ if (!completed.has(itemStateId))
69
+ this.linkStates(itemStateId, completed);
70
+ }
71
+ } else {
72
+ state.reduce = this.rules.id(state.rule);
73
+ }
74
+ }
75
+
76
+ private getStateId(rule: GrammarRule, dot: number) {
77
+ return this.rules.id(rule) + '.' + dot;
78
+ }
79
+ }
@@ -0,0 +1,37 @@
1
+ import { GrammarRule, GrammarRuleSymbol, LanguageDefinition } from "../../../typings"
2
+ import { ParserUtility } from "../../parser"
3
+
4
+ export class ClosureBuilder {
5
+ constructor(
6
+ private grammar: LanguageDefinition['grammar'],
7
+ ) { }
8
+
9
+ get(rule: string) {
10
+ const closure: RuleClosure = { items: [], visited: new Set() };
11
+ this.addClosure(closure, rule);
12
+ return closure.items;
13
+ }
14
+
15
+ private addClosure(closure: RuleClosure, symbol: GrammarRuleSymbol) {
16
+ if (!ParserUtility.SymbolIsTerminal(symbol)) {
17
+ const key = symbol as string;
18
+ if (!(closure.visited.has(key))) {
19
+ closure.visited.add(key);
20
+
21
+ const rules = this.grammar.rules[key];
22
+ for (const rule of rules) {
23
+ closure.items.push({ rule, dot: 0 })
24
+ this.addClosure(closure, rule.symbols[0]);
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ interface RuleClosure {
32
+ items: {
33
+ rule: GrammarRule,
34
+ dot: number,
35
+ }[]
36
+ visited: Set<GrammarRuleSymbol>;
37
+ }
@@ -0,0 +1,53 @@
1
+ import { GrammarRule, GrammarRuleSymbol } from "../../../typings";
2
+ import { State } from "./state";
3
+
4
+ export class LRStack {
5
+
6
+ stack: LRStackItem[] = [];
7
+
8
+ get current() {
9
+ return this.stack[this.stack.length - 1];
10
+ }
11
+
12
+ get previous() {
13
+ return this.stack[this.stack.length - 2];
14
+ }
15
+
16
+
17
+ shift(state: State) {
18
+ this.current.state = state;
19
+ }
20
+
21
+ reduce(rule: GrammarRule) {
22
+ const n = LRStack.NewItem();
23
+ const l = rule.symbols.length;
24
+ n.children = this.stack.splice(l * -1, l);
25
+ n.children.forEach(v => delete v.state);
26
+ n.rule = rule;
27
+ n.symbol = rule.name;
28
+ this.stack.push(n);
29
+ }
30
+
31
+ append(symbol: GrammarRuleSymbol) {
32
+ this.stack.push(LRStack.NewItem())
33
+ this.current.symbol = symbol;
34
+ }
35
+
36
+ static NewItem(): LRStackItem {
37
+ return {
38
+ children: [],
39
+ state: null,
40
+ symbol: null,
41
+ rule: null,
42
+ value: null
43
+ }
44
+ }
45
+ }
46
+
47
+ interface LRStackItem {
48
+ children: LRStackItem[];
49
+ state: State;
50
+ symbol: GrammarRuleSymbol;
51
+ rule: GrammarRule;
52
+ value: any;
53
+ }
@@ -0,0 +1,10 @@
1
+ import { GrammarRule, GrammarRuleSymbol } from "../../../typings";
2
+
3
+ export interface State {
4
+ items: { rule: GrammarRule, dot: number }[];
5
+ isFinal: boolean;
6
+ actions: Map<GrammarRuleSymbol, string>;
7
+ goto: Map<GrammarRuleSymbol, string>;
8
+ reduce: number;
9
+ rule: GrammarRule
10
+ }
@@ -4,12 +4,12 @@ import { TokenBuffer } from "../lexers/token-buffer";
4
4
  import { GrammarRule, GrammarRuleSymbol, LanguageDefinition, LexerToken, ParserAlgorithm } from "../typings";
5
5
  import { CYK } from "./algorithms/cyk";
6
6
  import { Earley } from "./algorithms/earley";
7
- import { LR } from "./algorithms/lr";
7
+ import { LRK } from "./algorithms/lrk/algorithm";
8
8
 
9
9
  const ParserRegistry: { [key: string]: ParserAlgorithm } = {
10
10
  earley: Earley,
11
11
  cyk: CYK,
12
- lr: LR
12
+ lr0: LRK
13
13
  }
14
14
 
15
15
  export function Parse(language: LanguageDefinition, input: string, options?: ParserOptions) {
@@ -42,9 +42,9 @@ export class Parser {
42
42
  }
43
43
 
44
44
 
45
- export class ParserUtility {
45
+ export abstract class ParserUtility {
46
46
 
47
- static TokenMatchesSymbol(token: LexerToken, symbol: GrammarRuleSymbol) {
47
+ static SymbolMatchesToken(symbol: GrammarRuleSymbol, token: LexerToken) {
48
48
  if (typeof symbol === 'string')
49
49
  throw 'Attempted to match token against non-terminal';
50
50
  if (typeof symbol == 'function')
@@ -59,7 +59,7 @@ export class ParserUtility {
59
59
  return symbol.literal === token.value;
60
60
  }
61
61
 
62
- static SymbolIsTerminal<T extends GrammarRuleSymbol>(symbol: T) {
62
+ static SymbolIsTerminal(symbol: GrammarRuleSymbol) {
63
63
  return typeof symbol != 'string';
64
64
  }
65
65
 
package/src/typings.ts CHANGED
@@ -13,6 +13,7 @@ export interface CompileOptions {
13
13
  resolverInstance?: ImportResolver;
14
14
  exportName?: string;
15
15
  template?: TemplateFormat;
16
+ overrides?: Dictionary<string>;
16
17
  }
17
18
 
18
19
  export type TemplateFormat = '_default' | 'object' | 'json' | 'js' | 'javascript' | 'module' | 'esmodule' | 'esm' | 'ts' | 'typescript'
@@ -131,7 +132,7 @@ export interface GeneratorGrammarRule {
131
132
  postprocess?: GrammarTypeTemplate | GrammarTypeBuiltIn | GrammarTypeJS;
132
133
  }
133
134
 
134
- export type GeneratorGrammarSymbol = { alias?: string } & (GrammarTypeRule | GrammarTypeRegex | GrammarTypeLiteral | GrammarTypeToken | GrammarTypeJS);
135
+ export type GeneratorGrammarSymbol = { alias?: string } & (GrammarTypeRule | GrammarTypeRegex | GrammarTypeLiteral | GrammarTypeToken);
135
136
 
136
137
  export interface LanguageDefinition {
137
138
  lexer?: Lexer | LexerConfig;
@@ -139,8 +140,23 @@ export interface LanguageDefinition {
139
140
  start: string;
140
141
  rules: Dictionary<GrammarRule[]>;
141
142
  }
143
+ lr?: {
144
+ k: number;
145
+ table: Dictionary<LRState>;
146
+ }
147
+
148
+ }
149
+
150
+ export interface LRState {
151
+ actions: Next[];
152
+ goto: { [key: string]: string };
153
+ reduce?: GrammarRule;
154
+ isFinal: boolean;
142
155
  }
143
156
 
157
+ type Next = { symbol: GrammarRuleSymbol, next: string };
158
+
159
+
144
160
  export interface TQRestorePoint {
145
161
  historyIndex: number;
146
162
  offset: number;
@@ -1,4 +1,4 @@
1
- import { Dictionary, GrammarRuleSymbol } from "../typings";
1
+ import { Dictionary, GeneratorGrammarSymbol, GrammarRuleSymbol } from "../typings";
2
2
 
3
3
 
4
4
  export class Collection<T> {
@@ -55,17 +55,16 @@ export class Collection<T> {
55
55
 
56
56
  }
57
57
 
58
- export class SymbolCollection extends Collection<GrammarRuleSymbol>{
58
+ export class GeneratorSymbolCollection extends Collection<GeneratorGrammarSymbol>{
59
59
  categorized = {
60
60
  nonTerminal: {},
61
61
  literalI: {},
62
62
  literalS: {},
63
63
  token: {},
64
- regex: {},
65
- function: {},
64
+ regex: {}
66
65
  }
67
66
 
68
- resolve(symbol: GrammarRuleSymbol) {
67
+ resolve(symbol: GeneratorGrammarSymbol) {
69
68
  if (typeof symbol == 'string') {
70
69
  return { category: 'nonTerminal', key: symbol };
71
70
  } else if ('literal' in symbol) {
@@ -74,10 +73,8 @@ export class SymbolCollection extends Collection<GrammarRuleSymbol>{
74
73
  return { category: 'literalS', key: symbol.literal }
75
74
  } else if ('token' in symbol) {
76
75
  return { category: 'token', key: symbol.token }
77
- } else if (symbol instanceof RegExp) {
78
- return { category: 'regex', key: symbol.toString() }
79
- } else if (typeof symbol == 'function') {
80
- return { category: 'function', key: symbol.toString() }
76
+ } else if ('regex' in symbol) {
77
+ return { category: 'regex', key: symbol.flags + ':' + symbol.regex }
81
78
  }
82
79
  }
83
80
  }
@@ -0,0 +1,36 @@
1
+ import { LexerConfig } from "../typings";
2
+
3
+ export function CreateMonarchTokenizer(lexer: LexerConfig) {
4
+ const tokenizer: any = {}; // languages.IMonarchLanguage['tokenizer']
5
+ const { start, states } = lexer;
6
+ for (const key in states) {
7
+ const { name, rules } = states[key];
8
+ tokenizer[name] = [];
9
+ for (const rule of rules) {
10
+ if ('import' in rule) {
11
+ for (const i of rule.import) {
12
+ tokenizer[name].push({ include: i })
13
+ }
14
+ } else if ('pop' in rule) {
15
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@pop' }])
16
+ } else if ('goto' in rule) {
17
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@' + rule.goto }])
18
+ } else if ('set' in rule) {
19
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', switchTo: '@' + rule.set }])
20
+ } else if ('inset' in rule) {
21
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source', next: '@push' }])
22
+ } else if ('when' in rule) {
23
+ tokenizer[name].push([TransformWhen(rule.when), { token: rule.highlight || 'source' }])
24
+ }
25
+ }
26
+ }
27
+ return { start, tokenizer };
28
+ }
29
+
30
+ function TransformWhen(obj) {
31
+ return typeof obj == 'string' ? new RegExp(RegexEscape(obj)) : new RegExp(obj.regex, obj.flags);
32
+ }
33
+
34
+ function RegexEscape(string) {
35
+ return string.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
36
+ }
@@ -1,23 +0,0 @@
1
- import { GeneratorState, GeneratorGrammarRule, LexerStateDefinition } from "../typings";
2
- export declare class Generator {
3
- state: GeneratorState;
4
- serializeHead(): string;
5
- serializeBody(): string;
6
- serializeLanguage(depth?: number): string;
7
- merge(state: GeneratorState): void;
8
- grammarUUID(name: string): string;
9
- addGrammarRule(rule: GeneratorGrammarRule): void;
10
- addLexerState(state: LexerStateDefinition): void;
11
- private serializeGrammar;
12
- private serializeGrammarRules;
13
- private serializeSymbol;
14
- private serializeGrammarRule;
15
- private serializePostProcess;
16
- private templatePostProcess;
17
- private serializeLexerConfig;
18
- private serializeLexerConfigStates;
19
- private serializeLexerConfigStateRules;
20
- private newLine;
21
- private pretty;
22
- private isVal;
23
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../src/compiler/generator.ts"],"names":[],"mappings":";;;AAEA,MAAM,cAAc,GAAG;IACnB,MAAM,EAAE,2BAA2B;IACnC,QAAQ,EAAE,uCAAuC;IACjD,MAAM,EAAE,YAAY;IACpB,OAAO,EAAE,qBAAqB;CACjC,CAAC;AAEF,MAAa,SAAS;IAElB,KAAK,GAAmB;QACpB,OAAO,EAAE;YACL,KAAK,EAAE,EAAE;YACT,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACZ;QACD,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,EAAE;QACR,IAAI,EAAE,EAAE;QACR,MAAM,EAAE,EAAE;QACV,OAAO,EAAE,SAAS;KACrB,CAAA;IAED,aAAa;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC1B,OAAO,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,aAAa;QACT,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC1B,OAAO,EAAE,CAAC;QACd,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,iBAAiB,CAAC,QAAgB,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC;YACf,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,KAAK,GAAG,CAAC,CAAC;YACzC,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC,KAAK,GAAG,CAAC,CAAC;SAC9C,EAAE,KAAK,CAAC,CAAC;IACd,CAAC;IAED,KAAK,CAAC,KAAqB;QAEvB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAC3E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC7I,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,CAAC;QAEhJ,IAAI,KAAK,CAAC,KAAK,EAAE;YACb,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;gBAClB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;aAC9D;iBAAM;gBACH,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;aAClC;YACD,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;SACxE;QACD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IACnD,CAAC;IAED,WAAW,CAAC,IAAY;QACpB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3E,OAAO,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,cAAc,CAAC,IAA0B;QACrC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAChF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnD,CAAC;IAED,aAAa,CAAC,KAA2B;QACrC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAA;QAC5G,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,OAAO,GAAG,OAAO,KAAK,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;QACnF,MAAM,CAAC,SAAS,GAAG,OAAO,KAAK,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAC3F,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;IAEO,gBAAgB,CAAC,QAAgB,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE;YACrB,OAAO,IAAI,CAAC;SACf;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC/C,KAAK,EAAE,IAAI,CAAC,qBAAqB,CAAC,KAAK,GAAG,CAAC,CAAC;SAC/C,EAAE,KAAK,CAAC,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,QAAgB,CAAC;QAC3C,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE;YACzC,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAA;SACpF;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,eAAe,CAAC,CAAyB;QAC7C,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE;YACvB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC5B;aAAM,IAAI,MAAM,IAAI,CAAC,EAAE;YACpB,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SACjC;aAAM,IAAI,OAAO,IAAI,CAAC,EAAE;YACrB,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;SACzC;aAAM,IAAI,OAAO,IAAI,CAAC,EAAE;YACrB,OAAO,YAAY,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;SAClD;aAAM,IAAI,SAAS,IAAI,CAAC,EAAE;YACvB,OAAO,cAAc,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;SACtD;aAAM,IAAI,IAAI,IAAI,CAAC,EAAE;YAClB,OAAO,CAAC,CAAC,EAAE,CAAC;SACf;aAAM;YACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;SAC5B;IACL,CAAC;IAEO,oBAAoB,CAAC,IAA0B;QACnD,MAAM,OAAO,GAAG,EAAE,CAAC;QACnB,MAAM,KAAK,GAAG,EAAE,CAAC;QACjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC1C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE;gBACvB,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;aACpC;SACJ;QACD,OAAO,IAAI,CAAC,MAAM,CAAC;YACf,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;YAC/B,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACjC,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;SAClE,EAAE,CAAC,CAAC,CAAC,CAAC;IACX,CAAC;IAEO,oBAAoB,CAAC,WAAgD,EAAE,KAAyB;QACpG,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,qBAAqB,IAAI,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAC/H,IAAI,CAAC,WAAW;YACZ,OAAO,IAAI,CAAC;QAChB,IAAI,SAAS,IAAI,WAAW;YACxB,OAAO,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;QAC/C,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ;YAC1B,OAAO;QACX,IAAI,OAAO,WAAW,IAAI,QAAQ;YAC9B,OAAO,WAAW,CAAC;QACvB,IAAI,IAAI,IAAI,WAAW;YACnB,OAAO,WAAW,CAAC,EAAE,CAAC;QAC1B,IAAI,UAAU,IAAI,WAAW;YACzB,OAAO,IAAI,CAAC,mBAAmB,CAAC,WAAW,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrE,CAAC;IAEO,mBAAmB,CAAC,YAAoB,EAAE,KAAgC;QAC9E,KAAK,MAAM,GAAG,IAAI,KAAK,EAAE;YACrB,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,SAAS,GAAG,GAAG,GAAG,qBAAqB,CAAC,EAAE,QAAQ,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;SACnH;QACD,OAAO,uBAAuB,GAAG,YAAY,CAAC,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;IAC1F,CAAC;IAEO,oBAAoB,CAAC,QAAgB,CAAC;QAC1C,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK;YACjB,OAAO,IAAI,CAAC;QAEhB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ;YACpC,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QAE5B,OAAO,IAAI,CAAC,MAAM,CAAC;YACf,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,0BAA0B,CAAC,KAAK,GAAG,CAAC,CAAC;SACrD,EAAE,KAAK,CAAC,CAAC;IACd,CAAC;IAEO,0BAA0B,CAAC,KAAa;QAC5C,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE;YACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC3C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;gBAC1B,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;gBAChC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI;gBAC7D,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI;gBACnE,KAAK,EAAE,IAAI,CAAC,8BAA8B,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,GAAG,CAAC,CAAC;aACrE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;SACjB;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,8BAA8B,CAAC,KAAwC,EAAE,KAAa;QAC1F,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;YACzB,IAAI,QAAQ,IAAI,IAAI;gBAChB,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;YACnE,OAAO,IAAI,CAAC,MAAM,CAAC;gBACf,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAW,CAAC;gBAC5C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC/B,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC;gBACzC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC7B,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;gBACjC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;aAClC,EAAE,CAAC,CAAC,CAAC,CAAC;QACX,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;IAEO,OAAO,CAAC,KAAa;QACzB,OAAO,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACxC,CAAC;IAEO,MAAM,CAAC,GAAsD,EAAE,KAAK,GAAG,CAAC;QAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YACpB,IAAI,CAAC,GAAG,GAAG,CAAC;YACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACjC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;gBACrB,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;aACtG;YACD,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;YAClD,OAAO,CAAC,CAAC;SACZ;QAED,IAAI,CAAC,GAAG,GAAG,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC1D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAClC,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAa,EAAE,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAC9H,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACzD,CAAC,IAAI,GAAG,MAAM,GAAG,GAAG,KAAK,KAAK,GAAG,MAAM,EAAE,CAAC;SAC7C;QACD,CAAC,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC;QAClD,OAAO,CAAC,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,KAAK;QACf,OAAO,OAAO,KAAK,KAAK,WAAW,IAAI,KAAK,KAAK,IAAI,CAAC;IAC1D,CAAC;CACJ;AAhOD,8BAgOC"}
@@ -1,52 +0,0 @@
1
- import { Dictionary, GrammarRule, GrammarRuleSymbol, LanguageDefinition } from "../typings";
2
- import { Collection, SymbolCollection } from "./general";
3
- export declare class CanonicalCollection {
4
- grammar: LanguageGrammar;
5
- rules: Collection<GrammarRule>;
6
- states: {
7
- [key: string]: State;
8
- };
9
- symbols: SymbolCollection;
10
- constructor(grammar: LanguageGrammar);
11
- addState(seed: StateItem[]): State;
12
- encodeRule(rule: GrammarRule, dot: number): string;
13
- encodeStateItems(seed: StateItem[]): string;
14
- }
15
- declare class State {
16
- private collection;
17
- isFinal: boolean;
18
- outputs: StateOut;
19
- queue: {
20
- [key: string]: StateItem[];
21
- };
22
- actions: Map<GrammarRuleSymbol, string>;
23
- goto: Map<GrammarRuleSymbol, string>;
24
- reduce?: GrammarRule;
25
- constructor(collection: CanonicalCollection, items: StateItem[]);
26
- private closure;
27
- }
28
- export declare class LRStack {
29
- stack: LRStackItem[];
30
- get current(): LRStackItem;
31
- get previous(): LRStackItem;
32
- shift(state: State): void;
33
- reduce(rule: GrammarRule): void;
34
- add(symbol: GrammarRuleSymbol): void;
35
- }
36
- declare class LRStackItem {
37
- children: LRStackItem[];
38
- state: State;
39
- symbol: GrammarRuleSymbol;
40
- rule: GrammarRule;
41
- value: any;
42
- }
43
- type LanguageGrammar = LanguageDefinition['grammar'];
44
- type StateItem = {
45
- rule: GrammarRule;
46
- dot: number;
47
- };
48
- interface StateOut {
49
- action: Dictionary<StateItem[]>;
50
- goto: Dictionary<StateItem[]>;
51
- }
52
- export {};
@@ -1 +0,0 @@
1
- {"version":3,"file":"lr.js","sourceRoot":"","sources":["../../src/utility/lr.ts"],"names":[],"mappings":"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"}
@@ -1,37 +0,0 @@
1
- import { TokenBuffer } from "../../lexers/token-buffer";
2
- import { LanguageDefinition } from "../../typings";
3
- import { CanonicalCollection, LRStack } from "../../utility/lr";
4
- import { ParserUtility } from "../parser";
5
-
6
- export function LR(language: LanguageDefinition & { tokens: TokenBuffer, canonical?: CanonicalCollection }, _options = {}) {
7
- const { grammar, tokens, canonical } = language;
8
- const collection = canonical || new CanonicalCollection(grammar);
9
- const stack = new LRStack();
10
- const s = collection.states['0.0'];
11
- stack.add(null);
12
- stack.shift(s);
13
- let token;
14
-
15
- // eslint-disable-next-line no-cond-assign
16
- while (token = tokens.next()) {
17
- for (const [symbol, state] of stack.current.state.actions) {
18
- if (ParserUtility.TokenMatchesSymbol(token, symbol)) {
19
- stack.add(symbol);
20
- stack.shift(collection.states[state]);
21
- stack.current.value = token;
22
- break;
23
- }
24
- }
25
-
26
- while (stack.current.state?.isFinal) {
27
- const rule = stack.current.state.reduce;
28
- stack.reduce(rule);
29
- stack.current.value = ParserUtility.PostProcess(rule, stack.current.children.map(v => v.value));
30
- const s = stack.previous.state.goto.get(rule.name);
31
- stack.shift(collection.states[s]);
32
-
33
- }
34
- }
35
-
36
- return { results: [stack.current.value], canonical: collection }
37
- }
package/src/utility/lr.ts DELETED
@@ -1,152 +0,0 @@
1
- import { ParserUtility } from "../parser/parser";
2
- import { Dictionary, GrammarRule, GrammarRuleSymbol, LanguageDefinition } from "../typings";
3
- import { Collection, SymbolCollection } from "./general";
4
-
5
- export class CanonicalCollection {
6
- rules: Collection<GrammarRule> = new Collection();
7
- states: { [key: string]: State } = Object.create(null)
8
- symbols: SymbolCollection = new SymbolCollection();
9
-
10
- constructor(public grammar: LanguageGrammar) {
11
- const augmented = { name: Symbol() as unknown as string, symbols: [grammar.start] }
12
- grammar.rules[augmented.name] = [augmented];
13
- this.addState([{ rule: augmented, dot: 0 }]);
14
- }
15
-
16
- addState(seed: StateItem[]) {
17
- const id = this.encodeStateItems(seed);
18
- if (id in this.states)
19
- return this.states[id];
20
-
21
- const state = new State(this, seed);
22
- this.states[id] = state;
23
- for (const q in state.queue) {
24
- this.addState(state.queue[q])
25
- }
26
- state.queue = {};
27
- }
28
-
29
- encodeRule(rule: GrammarRule, dot: number) {
30
- return this.rules.encode(rule) + '.' + dot;
31
- }
32
-
33
- encodeStateItems(seed: StateItem[]) {
34
- return Array.from(new Set(seed)).map(v => this.encodeRule(v.rule, v.dot)).sort().join()
35
- }
36
- }
37
-
38
- class State {
39
- isFinal = false;
40
-
41
- outputs: StateOut = {
42
- goto: {},
43
- action: {}
44
- };
45
-
46
- queue: { [key: string]: StateItem[] } = {};
47
- actions: Map<GrammarRuleSymbol, string> = new Map();
48
- goto: Map<GrammarRuleSymbol, string> = new Map();
49
- reduce?: GrammarRule;
50
-
51
- constructor(private collection: CanonicalCollection, items: StateItem[]) {
52
- const visited = new Set<GrammarRuleSymbol>();
53
- for (const item of items) {
54
- this.closure(item.rule, item.dot, visited);
55
- }
56
- if (this.isFinal) {
57
- if (items.length == 1 && visited.size < 1) {
58
- this.reduce = items[0].rule;
59
- } else {
60
- throw 'Conflict Detected';
61
- }
62
- }
63
-
64
- for (const k in this.outputs.goto) {
65
- const seed = this.outputs.goto[k];
66
- const stateId = this.collection.encodeStateItems(seed);
67
- this.queue[stateId] = seed;
68
- this.goto.set(this.collection.symbols.decode(k), stateId);
69
- }
70
-
71
- for (const k in this.outputs.action) {
72
- const seed = this.outputs.action[k];
73
- const stateId = this.collection.encodeStateItems(seed);
74
- this.queue[stateId] = seed;
75
- this.actions.set(this.collection.symbols.decode(k), stateId);
76
- }
77
- }
78
-
79
- private closure(rule: GrammarRule, dot: number, visited: Set<GrammarRuleSymbol>) {
80
- const isFinal = rule.symbols.length == dot;
81
- this.isFinal = isFinal || this.isFinal;
82
- const { [dot]: symbol } = rule.symbols;
83
-
84
- if (isFinal || visited.has(symbol))
85
- return;
86
-
87
- visited.add(symbol);
88
- const stateItem = { rule, dot: dot + 1 };
89
-
90
- if (ParserUtility.SymbolIsTerminal(symbol)) {
91
- const id = this.collection.symbols.encode(symbol);
92
- this.outputs.action[id] = this.outputs.action[id] || [];
93
- this.outputs.action[id].push(stateItem);
94
- } else {
95
- const id = this.collection.symbols.encode(symbol);
96
- this.outputs.goto[id] = this.outputs.goto[id] || [];
97
- this.outputs.goto[id].push(stateItem);
98
- for (const rule of this.collection.grammar.rules[symbol as string]) {
99
- this.closure(rule, 0, visited)
100
- }
101
- }
102
- }
103
- }
104
-
105
- export class LRStack {
106
-
107
- stack: LRStackItem[] = [];
108
-
109
- get current() {
110
- return this.stack[this.stack.length - 1];
111
- }
112
-
113
- get previous() {
114
- return this.stack[this.stack.length - 2];
115
- }
116
-
117
- shift(state: State) {
118
- this.current.state = state;
119
- }
120
-
121
- reduce(rule: GrammarRule) {
122
- const n = new LRStackItem();
123
- const l = rule.symbols.length;
124
- n.children = this.stack.splice(l * -1, l);
125
- n.children.forEach(v => delete v.state);
126
- n.rule = rule;
127
- n.symbol = rule.name;
128
- this.stack.push(n);
129
- }
130
-
131
- add(symbol: GrammarRuleSymbol) {
132
- this.stack.push(new LRStackItem())
133
- this.current.symbol = symbol;
134
- }
135
- }
136
-
137
-
138
- class LRStackItem {
139
- children: LRStackItem[] = [];
140
- state: State;
141
- symbol: GrammarRuleSymbol;
142
- rule: GrammarRule;
143
- value: any;
144
- }
145
-
146
- type LanguageGrammar = LanguageDefinition['grammar'];
147
- type StateItem = { rule: GrammarRule, dot: number };
148
-
149
- interface StateOut {
150
- action: Dictionary<StateItem[]>;
151
- goto: Dictionary<StateItem[]>;
152
- }