parser-lr 0.0.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -1
- package/bin/parser-lr.js +12502 -16
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/ast/ast-node.d.ts +59 -0
- package/dist/lib/ast/ast-node.d.ts.map +1 -0
- package/dist/lib/ast/ast-node.js +66 -0
- package/dist/lib/ast/ast-node.js.map +1 -0
- package/dist/lib/errors/index.d.ts +2 -0
- package/dist/lib/errors/index.d.ts.map +1 -0
- package/dist/lib/errors/index.js +2 -0
- package/dist/lib/errors/index.js.map +1 -0
- package/dist/lib/errors/parser-lr-error.d.ts +30 -0
- package/dist/lib/errors/parser-lr-error.d.ts.map +1 -0
- package/dist/lib/errors/parser-lr-error.js +45 -0
- package/dist/lib/errors/parser-lr-error.js.map +1 -0
- package/dist/lib/grammar/ast-schema.d.ts +28 -0
- package/dist/lib/grammar/ast-schema.d.ts.map +1 -0
- package/dist/lib/grammar/ast-schema.js +39 -0
- package/dist/lib/grammar/ast-schema.js.map +1 -0
- package/dist/lib/grammar/ast-type.d.ts +12 -0
- package/dist/lib/grammar/ast-type.d.ts.map +1 -0
- package/dist/lib/grammar/ast-type.js +2 -0
- package/dist/lib/grammar/ast-type.js.map +1 -0
- package/dist/lib/grammar/expression.d.ts +69 -0
- package/dist/lib/grammar/expression.d.ts.map +1 -0
- package/dist/lib/grammar/expression.js +2 -0
- package/dist/lib/grammar/expression.js.map +1 -0
- package/dist/lib/grammar/grammar-from-cst.d.ts +10 -0
- package/dist/lib/grammar/grammar-from-cst.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-from-cst.js +638 -0
- package/dist/lib/grammar/grammar-from-cst.js.map +1 -0
- package/dist/lib/grammar/grammar-literals.d.ts +18 -0
- package/dist/lib/grammar/grammar-literals.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-literals.js +67 -0
- package/dist/lib/grammar/grammar-literals.js.map +1 -0
- package/dist/lib/grammar/grammar.d.ts +45 -0
- package/dist/lib/grammar/grammar.d.ts.map +1 -0
- package/dist/lib/grammar/grammar.js +60 -0
- package/dist/lib/grammar/grammar.js.map +1 -0
- package/dist/lib/grammar/grammar.json +7950 -0
- package/dist/lib/grammar/index.d.ts +13 -0
- package/dist/lib/grammar/index.d.ts.map +1 -0
- package/dist/lib/grammar/index.js +7 -0
- package/dist/lib/grammar/index.js.map +1 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts +19 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -0
- package/dist/lib/grammar/meta-grammar-table.js +32 -0
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -0
- package/dist/lib/grammar/production.d.ts +9 -0
- package/dist/lib/grammar/production.d.ts.map +1 -0
- package/dist/lib/grammar/production.js +2 -0
- package/dist/lib/grammar/production.js.map +1 -0
- package/dist/lib/grammar/read-grammar-error.d.ts +15 -0
- package/dist/lib/grammar/read-grammar-error.d.ts.map +1 -0
- package/dist/lib/grammar/read-grammar-error.js +18 -0
- package/dist/lib/grammar/read-grammar-error.js.map +1 -0
- package/dist/lib/grammar/read-grammar.d.ts +9 -0
- package/dist/lib/grammar/read-grammar.d.ts.map +1 -0
- package/dist/lib/grammar/read-grammar.js +21 -0
- package/dist/lib/grammar/read-grammar.js.map +1 -0
- package/dist/lib/grammar/token-rule.d.ts +11 -0
- package/dist/lib/grammar/token-rule.d.ts.map +1 -0
- package/dist/lib/grammar/token-rule.js +2 -0
- package/dist/lib/grammar/token-rule.js.map +1 -0
- package/dist/lib/grammar/transform-expression.d.ts +55 -0
- package/dist/lib/grammar/transform-expression.d.ts.map +1 -0
- package/dist/lib/grammar/transform-expression.js +2 -0
- package/dist/lib/grammar/transform-expression.js.map +1 -0
- package/dist/lib/grammar/transform-rule.d.ts +16 -0
- package/dist/lib/grammar/transform-rule.d.ts.map +1 -0
- package/dist/lib/grammar/transform-rule.js +2 -0
- package/dist/lib/grammar/transform-rule.js.map +1 -0
- package/dist/lib/grammar/transform-schema.d.ts +28 -0
- package/dist/lib/grammar/transform-schema.d.ts.map +1 -0
- package/dist/lib/grammar/transform-schema.js +39 -0
- package/dist/lib/grammar/transform-schema.js.map +1 -0
- package/dist/lib/index.d.ts +19 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +13 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/lexer/index.d.ts +10 -0
- package/dist/lib/lexer/index.d.ts.map +1 -0
- package/dist/lib/lexer/index.js +8 -0
- package/dist/lib/lexer/index.js.map +1 -0
- package/dist/lib/lexer/lexer-compile-error.d.ts +15 -0
- package/dist/lib/lexer/lexer-compile-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-compile-error.js +18 -0
- package/dist/lib/lexer/lexer-compile-error.js.map +1 -0
- package/dist/lib/lexer/lexer-compile.d.ts +94 -0
- package/dist/lib/lexer/lexer-compile.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-compile.js +189 -0
- package/dist/lib/lexer/lexer-compile.js.map +1 -0
- package/dist/lib/lexer/lexer-error.d.ts +15 -0
- package/dist/lib/lexer/lexer-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-error.js +18 -0
- package/dist/lib/lexer/lexer-error.js.map +1 -0
- package/dist/lib/lexer/lexer-input-error.d.ts +11 -0
- package/dist/lib/lexer/lexer-input-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-input-error.js +13 -0
- package/dist/lib/lexer/lexer-input-error.js.map +1 -0
- package/dist/lib/lexer/lexer-state-error.d.ts +13 -0
- package/dist/lib/lexer/lexer-state-error.d.ts.map +1 -0
- package/dist/lib/lexer/lexer-state-error.js +15 -0
- package/dist/lib/lexer/lexer-state-error.js.map +1 -0
- package/dist/lib/lexer/lexer.d.ts +111 -0
- package/dist/lib/lexer/lexer.d.ts.map +1 -0
- package/dist/lib/lexer/lexer.js +270 -0
- package/dist/lib/lexer/lexer.js.map +1 -0
- package/dist/lib/lexer/token.d.ts +34 -0
- package/dist/lib/lexer/token.d.ts.map +1 -0
- package/dist/lib/lexer/token.js +38 -0
- package/dist/lib/lexer/token.js.map +1 -0
- package/dist/lib/parse-context-error.d.ts +13 -0
- package/dist/lib/parse-context-error.d.ts.map +1 -0
- package/dist/lib/parse-context-error.js +15 -0
- package/dist/lib/parse-context-error.js.map +1 -0
- package/dist/lib/parse-context.d.ts +106 -0
- package/dist/lib/parse-context.d.ts.map +1 -0
- package/dist/lib/parse-context.js +133 -0
- package/dist/lib/parse-context.js.map +1 -0
- package/dist/lib/parse-output-error.d.ts +13 -0
- package/dist/lib/parse-output-error.d.ts.map +1 -0
- package/dist/lib/parse-output-error.js +15 -0
- package/dist/lib/parse-output-error.js.map +1 -0
- package/dist/lib/parse-output.d.ts +10 -0
- package/dist/lib/parse-output.d.ts.map +1 -0
- package/dist/lib/parse-output.js +15 -0
- package/dist/lib/parse-output.js.map +1 -0
- package/dist/lib/parse-table/analysis/first-follow.d.ts +124 -0
- package/dist/lib/parse-table/analysis/first-follow.d.ts.map +1 -0
- package/dist/lib/parse-table/analysis/first-follow.js +274 -0
- package/dist/lib/parse-table/analysis/first-follow.js.map +1 -0
- package/dist/lib/parse-table/analysis/index.d.ts +2 -0
- package/dist/lib/parse-table/analysis/index.d.ts.map +1 -0
- package/dist/lib/parse-table/analysis/index.js +2 -0
- package/dist/lib/parse-table/analysis/index.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.d.ts +65 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.js +136 -0
- package/dist/lib/parse-table/bnf/bnf-grammar.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-production.d.ts +12 -0
- package/dist/lib/parse-table/bnf/bnf-production.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-production.js +2 -0
- package/dist/lib/parse-table/bnf/bnf-production.js.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.d.ts +40 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.js +35 -0
- package/dist/lib/parse-table/bnf/bnf-symbol.js.map +1 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts +104 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.js +217 -0
- package/dist/lib/parse-table/bnf/desugar-ebnf.js.map +1 -0
- package/dist/lib/parse-table/bnf/index.d.ts +6 -0
- package/dist/lib/parse-table/bnf/index.d.ts.map +1 -0
- package/dist/lib/parse-table/bnf/index.js +4 -0
- package/dist/lib/parse-table/bnf/index.js.map +1 -0
- package/dist/lib/parse-table/build-lr-table.d.ts +11 -0
- package/dist/lib/parse-table/build-lr-table.d.ts.map +1 -0
- package/dist/lib/parse-table/build-lr-table.js +158 -0
- package/dist/lib/parse-table/build-lr-table.js.map +1 -0
- package/dist/lib/parse-table/index.d.ts +22 -0
- package/dist/lib/parse-table/index.d.ts.map +1 -0
- package/dist/lib/parse-table/index.js +15 -0
- package/dist/lib/parse-table/index.js.map +1 -0
- package/dist/lib/parse-table/lr-algorithm-error.d.ts +13 -0
- package/dist/lib/parse-table/lr-algorithm-error.d.ts.map +1 -0
- package/dist/lib/parse-table/lr-algorithm-error.js +15 -0
- package/dist/lib/parse-table/lr-algorithm-error.js.map +1 -0
- package/dist/lib/parse-table/lr-algorithm.d.ts +19 -0
- package/dist/lib/parse-table/lr-algorithm.d.ts.map +1 -0
- package/dist/lib/parse-table/lr-algorithm.js +27 -0
- package/dist/lib/parse-table/lr-algorithm.js.map +1 -0
- package/dist/lib/parse-table/lr0/index.d.ts +3 -0
- package/dist/lib/parse-table/lr0/index.d.ts.map +1 -0
- package/dist/lib/parse-table/lr0/index.js +2 -0
- package/dist/lib/parse-table/lr0/index.js.map +1 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.d.ts +106 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.d.ts.map +1 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.js +235 -0
- package/dist/lib/parse-table/lr0/lr0-item-set.js.map +1 -0
- package/dist/lib/parse-table/lr1/index.d.ts +3 -0
- package/dist/lib/parse-table/lr1/index.d.ts.map +1 -0
- package/dist/lib/parse-table/lr1/index.js +2 -0
- package/dist/lib/parse-table/lr1/index.js.map +1 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.d.ts +157 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.d.ts.map +1 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.js +380 -0
- package/dist/lib/parse-table/lr1/lr1-item-set.js.map +1 -0
- package/dist/lib/parse-table/parse-table-build-error.d.ts +17 -0
- package/dist/lib/parse-table/parse-table-build-error.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-build-error.js +20 -0
- package/dist/lib/parse-table/parse-table-build-error.js.map +1 -0
- package/dist/lib/parse-table/parse-table-error.d.ts +13 -0
- package/dist/lib/parse-table/parse-table-error.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-error.js +15 -0
- package/dist/lib/parse-table/parse-table-error.js.map +1 -0
- package/dist/lib/parse-table/parse-table-json.d.ts +50 -0
- package/dist/lib/parse-table/parse-table-json.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table-json.js +9 -0
- package/dist/lib/parse-table/parse-table-json.js.map +1 -0
- package/dist/lib/parse-table/parse-table.d.ts +154 -0
- package/dist/lib/parse-table/parse-table.d.ts.map +1 -0
- package/dist/lib/parse-table/parse-table.js +314 -0
- package/dist/lib/parse-table/parse-table.js.map +1 -0
- package/dist/lib/parse-table/slr/index.d.ts +4 -0
- package/dist/lib/parse-table/slr/index.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/index.js +3 -0
- package/dist/lib/parse-table/slr/index.js.map +1 -0
- package/dist/lib/parse-table/slr/parse-action.d.ts +3 -0
- package/dist/lib/parse-table/slr/parse-action.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/parse-action.js +2 -0
- package/dist/lib/parse-table/slr/parse-action.js.map +1 -0
- package/dist/lib/parse-table/slr/slr-table.d.ts +14 -0
- package/dist/lib/parse-table/slr/slr-table.d.ts.map +1 -0
- package/dist/lib/parse-table/slr/slr-table.js +14 -0
- package/dist/lib/parse-table/slr/slr-table.js.map +1 -0
- package/dist/lib/parse-table/table/index.d.ts +5 -0
- package/dist/lib/parse-table/table/index.d.ts.map +1 -0
- package/dist/lib/parse-table/table/index.js +4 -0
- package/dist/lib/parse-table/table/index.js.map +1 -0
- package/dist/lib/parse-table/table/lr-parse-table.d.ts +92 -0
- package/dist/lib/parse-table/table/lr-parse-table.d.ts.map +1 -0
- package/dist/lib/parse-table/table/lr-parse-table.js +144 -0
- package/dist/lib/parse-table/table/lr-parse-table.js.map +1 -0
- package/dist/lib/parse-table/table/parse-action.d.ts +47 -0
- package/dist/lib/parse-table/table/parse-action.d.ts.map +1 -0
- package/dist/lib/parse-table/table/parse-action.js +49 -0
- package/dist/lib/parse-table/table/parse-action.js.map +1 -0
- package/dist/lib/parse-table/table/table-builder-base.d.ts +63 -0
- package/dist/lib/parse-table/table/table-builder-base.d.ts.map +1 -0
- package/dist/lib/parse-table/table/table-builder-base.js +129 -0
- package/dist/lib/parse-table/table/table-builder-base.js.map +1 -0
- package/dist/lib/parse-table/token-inventory.d.ts +9 -0
- package/dist/lib/parse-table/token-inventory.d.ts.map +1 -0
- package/dist/lib/parse-table/token-inventory.js +15 -0
- package/dist/lib/parse-table/token-inventory.js.map +1 -0
- package/dist/lib/parser-lr.d.ts +96 -2
- package/dist/lib/parser-lr.d.ts.map +1 -1
- package/dist/lib/parser-lr.js +130 -2
- package/dist/lib/parser-lr.js.map +1 -1
- package/dist/lib/shift-reduce/index.d.ts +3 -0
- package/dist/lib/shift-reduce/index.d.ts.map +1 -0
- package/dist/lib/shift-reduce/index.js +2 -0
- package/dist/lib/shift-reduce/index.js.map +1 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.d.ts +82 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.d.ts.map +1 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.js +204 -0
- package/dist/lib/shift-reduce/shift-reduce-engine.js.map +1 -0
- package/dist/lib/transform/binding-map.d.ts +32 -0
- package/dist/lib/transform/binding-map.d.ts.map +1 -0
- package/dist/lib/transform/binding-map.js +59 -0
- package/dist/lib/transform/binding-map.js.map +1 -0
- package/dist/lib/transform/cst-transformer.d.ts +158 -0
- package/dist/lib/transform/cst-transformer.d.ts.map +1 -0
- package/dist/lib/transform/cst-transformer.js +381 -0
- package/dist/lib/transform/cst-transformer.js.map +1 -0
- package/dist/lib/transform/index.d.ts +4 -0
- package/dist/lib/transform/index.d.ts.map +1 -0
- package/dist/lib/transform/index.js +3 -0
- package/dist/lib/transform/index.js.map +1 -0
- package/docs/grammar.md +170 -0
- package/package.json +12 -4
package/docs/grammar.md
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# `.grammar` file syntax
|
|
2
|
+
|
|
3
|
+
A `.grammar` file describes a language: lexer rules, parser productions, and optional AST shape and transform rules. Files are plain text with `//` line comments.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
A grammar file contains these sections in order:
|
|
8
|
+
|
|
9
|
+
1. `name` — grammar name
|
|
10
|
+
2. Zero or more of: `tokens`, `skip`, `states`
|
|
11
|
+
3. `start` — entry non-terminal
|
|
12
|
+
4. `grammar` — parse productions
|
|
13
|
+
5. Optional `ast` — AST type definitions
|
|
14
|
+
6. Optional `transform` — CST-to-AST mapping rules
|
|
15
|
+
|
|
16
|
+
Whitespace between sections is ignored. Skip rules discard matched text before tokenization.
|
|
17
|
+
|
|
18
|
+
## `name`
|
|
19
|
+
|
|
20
|
+
```ebnf
|
|
21
|
+
name "mylang" ;
|
|
22
|
+
name mylang ;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
The name is an identifier or double-quoted string.
|
|
26
|
+
|
|
27
|
+
## `tokens`
|
|
28
|
+
|
|
29
|
+
Declares lexer tokens as regular expressions:
|
|
30
|
+
|
|
31
|
+
```ebnf
|
|
32
|
+
tokens
|
|
33
|
+
identifier = /[A-Za-z_][A-Za-z0-9_]*/ ;
|
|
34
|
+
number = /[0-9]+/ ;
|
|
35
|
+
plus = /\+/ ;
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
Each rule is `name = /pattern/ flags ;`. The pattern is a JavaScript regular expression body between slashes. Optional flag letters (`g`, `i`, `m`, `s`, `u`, `y`) may follow the closing slash.
|
|
39
|
+
|
|
40
|
+
## `skip`
|
|
41
|
+
|
|
42
|
+
Declares patterns to discard (whitespace, comments):
|
|
43
|
+
|
|
44
|
+
```ebnf
|
|
45
|
+
skip
|
|
46
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
47
|
+
comment = /\/\/[^\n\r]*/ ;
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
Syntax matches `tokens`.
|
|
51
|
+
|
|
52
|
+
## `states`
|
|
53
|
+
|
|
54
|
+
Optional lexer start states (for multi-mode lexing):
|
|
55
|
+
|
|
56
|
+
```ebnf
|
|
57
|
+
states default, string ;
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## `start`
|
|
61
|
+
|
|
62
|
+
Names the parser entry non-terminal:
|
|
63
|
+
|
|
64
|
+
```ebnf
|
|
65
|
+
start program ;
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## `grammar`
|
|
69
|
+
|
|
70
|
+
Parse productions use EBNF expression syntax:
|
|
71
|
+
|
|
72
|
+
```ebnf
|
|
73
|
+
grammar
|
|
74
|
+
program = statement { statement } ;
|
|
75
|
+
statement = identifier equal expression semicolon ;
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
### Expressions
|
|
79
|
+
|
|
80
|
+
| Form | Syntax | Meaning |
|
|
81
|
+
|------|--------|---------|
|
|
82
|
+
| Sequence | `a b c` | Match in order |
|
|
83
|
+
| Choice | `a \| b \| c` | Match one alternative |
|
|
84
|
+
| Optional | `[ a ]` | Zero or one |
|
|
85
|
+
| Repeat | `{ a }` | Zero or more |
|
|
86
|
+
| Group | `( a )` | Precedence grouping |
|
|
87
|
+
| Terminal | `"while"` | Literal string in the input |
|
|
88
|
+
| Reference | `identifier` | Non-terminal or token name |
|
|
89
|
+
| Label | `#name` | Names an alternative for transforms |
|
|
90
|
+
| Binding | `[slot]:symbol` | Names a child slot for AST transforms |
|
|
91
|
+
|
|
92
|
+
Example with labels and bindings:
|
|
93
|
+
|
|
94
|
+
```ebnf
|
|
95
|
+
expr =
|
|
96
|
+
#add expr plus term
|
|
97
|
+
| #term term
|
|
98
|
+
;
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Production syntax
|
|
102
|
+
|
|
103
|
+
Each production ends with a semicolon:
|
|
104
|
+
|
|
105
|
+
```ebnf
|
|
106
|
+
identifier = expression ;
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## `ast`
|
|
110
|
+
|
|
111
|
+
Optional section declaring AST node shapes. Uses the same expression syntax as `grammar`, with `#` variants and `[slot]:` bindings naming child fields:
|
|
112
|
+
|
|
113
|
+
```ebnf
|
|
114
|
+
ast
|
|
115
|
+
expr =
|
|
116
|
+
#binary [left]:expr [operator]:operator [right]:expr
|
|
117
|
+
| #literal number
|
|
118
|
+
;
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
When present, transform rules map parse trees to these types.
|
|
122
|
+
|
|
123
|
+
## `transform`
|
|
124
|
+
|
|
125
|
+
Maps labeled parse alternatives to AST construction. One rule per parse production:
|
|
126
|
+
|
|
127
|
+
```ebnf
|
|
128
|
+
transform
|
|
129
|
+
expr ->
|
|
130
|
+
#add fold-left(expr.#binary, left, operator, right)
|
|
131
|
+
| #term pass(term)
|
|
132
|
+
;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Transform expressions
|
|
136
|
+
|
|
137
|
+
| Form | Syntax |
|
|
138
|
+
|------|--------|
|
|
139
|
+
| Drop | `drop` |
|
|
140
|
+
| Pass | `pass(reference)` |
|
|
141
|
+
| Build | `type.#variant` or `type.#variant(arg, …)` |
|
|
142
|
+
| Fold left | `fold-left(type.#variant, ref, …)` |
|
|
143
|
+
| Fold right | `fold-right(type.#variant, ref, …)` |
|
|
144
|
+
| Flatten | `flatten(type.#variant, head, tail)` |
|
|
145
|
+
|
|
146
|
+
`type.#variant` refers to an AST type and variant from the `ast` section. Arguments are binding names from the parse production.
|
|
147
|
+
|
|
148
|
+
Example (calculator):
|
|
149
|
+
|
|
150
|
+
```ebnf
|
|
151
|
+
transform
|
|
152
|
+
expr ->
|
|
153
|
+
#binary expr.#binary(left, operator, right)
|
|
154
|
+
| #literal expr.#literal(number)
|
|
155
|
+
;
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Complete example
|
|
159
|
+
|
|
160
|
+
See [`grammars/calc.grammar`](../grammars/calc.grammar) for a small working grammar with `grammar`, `ast`, and `transform` sections. [`grammars/lisp.grammar`](../grammars/lisp.grammar) and [`grammars/6502.grammar`](../grammars/6502.grammar) show larger languages.
|
|
161
|
+
|
|
162
|
+
## Building and using a grammar
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
parser-lr table generate -g mylang.grammar -o mylang.table.json
|
|
166
|
+
parser-lr parse -i source.txt -g mylang.grammar
|
|
167
|
+
parser-lr parse -i source.txt -t mylang.table.json
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
See the [project README](../README.md) for install and library usage.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "parser-lr",
|
|
3
3
|
"author": "Adam R Moss <adamrmoss@gmail.com>",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"description": "Shift-reduce parser library for EBNF grammars",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
@@ -22,28 +22,36 @@
|
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"bin",
|
|
25
|
-
"dist"
|
|
25
|
+
"dist",
|
|
26
|
+
"docs"
|
|
26
27
|
],
|
|
27
28
|
"publishConfig": {
|
|
28
29
|
"access": "public",
|
|
29
30
|
"registry": "https://registry.npmjs.org/"
|
|
30
31
|
},
|
|
31
32
|
"scripts": {
|
|
33
|
+
"publish": "npm run build && npm publish",
|
|
34
|
+
"bootstrap": "npm link && parser-lr table generate -g grammars/grammar.grammar -o src/lib/grammar/grammar.json",
|
|
32
35
|
"build": "npm run build:clean && npm run build:lib && npm run build:cli",
|
|
33
36
|
"build:clean": "rm -rf dist && rm -f bin/parser-lr.js bin/parser-lr.js.map",
|
|
34
|
-
"build:lib": "tsc -p tsconfig.lib.json",
|
|
35
|
-
"build:cli": "rollup -c rollup.cli.config.js",
|
|
37
|
+
"build:lib": "tsc -p tsconfig.lib.json && cp src/lib/grammar/grammar.json dist/lib/grammar/",
|
|
38
|
+
"build:cli": "rollup -c rollup.cli.config.js && chmod +x bin/parser-lr.js",
|
|
39
|
+
"test": "jest",
|
|
36
40
|
"prepack": "npm run build"
|
|
37
41
|
},
|
|
38
42
|
"dependencies": {},
|
|
39
43
|
"devDependencies": {
|
|
44
|
+
"@jest/globals": "29.x",
|
|
40
45
|
"@rollup/plugin-commonjs": "28.x",
|
|
41
46
|
"@rollup/plugin-json": "6.x",
|
|
42
47
|
"@rollup/plugin-node-resolve": "16.x",
|
|
43
48
|
"@rollup/plugin-typescript": "12.x",
|
|
49
|
+
"@types/jest": "29.x",
|
|
44
50
|
"@types/node": "22.x",
|
|
45
51
|
"commander": "12.x",
|
|
52
|
+
"jest": "29.x",
|
|
46
53
|
"rollup": "4.x",
|
|
54
|
+
"ts-jest": "29.x",
|
|
47
55
|
"tslib": "2.x",
|
|
48
56
|
"typescript": "5.x"
|
|
49
57
|
}
|