parser-lr 0.4.1 → 0.6.0
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 +39 -1
- package/bin/parser-lr.js +8373 -7960
- package/bin/parser-lr.js.map +1 -1
- package/dist/lib/grammar/grammar-json-path.d.ts +2 -0
- package/dist/lib/grammar/grammar-json-path.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts +5 -0
- package/dist/lib/grammar/grammar-json-path.esm.d.ts.map +1 -0
- package/dist/lib/grammar/grammar-json-path.esm.js +9 -0
- package/dist/lib/grammar/grammar-json-path.esm.js.map +1 -0
- package/dist/lib/grammar/grammar-json-path.js +2 -0
- package/dist/lib/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib/grammar/index.d.ts +3 -0
- package/dist/lib/grammar/index.d.ts.map +1 -1
- package/dist/lib/grammar/index.js +2 -0
- package/dist/lib/grammar/index.js.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.d.ts +12 -0
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.js +33 -3
- package/dist/lib/grammar/meta-grammar-table.js.map +1 -1
- package/dist/lib/grammar/table-validator.d.ts +26 -0
- package/dist/lib/grammar/table-validator.d.ts.map +1 -0
- package/dist/lib/grammar/table-validator.js +258 -0
- package/dist/lib/grammar/table-validator.js.map +1 -0
- package/dist/lib/index.d.ts +2 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +1 -0
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/transform/cst-transformer.d.ts +14 -0
- package/dist/lib/transform/cst-transformer.d.ts.map +1 -1
- package/dist/lib/transform/cst-transformer.js +82 -11
- package/dist/lib/transform/cst-transformer.js.map +1 -1
- package/dist/lib/transform/grammar-fixture.d.ts +56 -0
- package/dist/lib/transform/grammar-fixture.d.ts.map +1 -0
- package/dist/lib/transform/grammar-fixture.js +101 -0
- package/dist/lib/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/ast/ast-node.js +70 -0
- package/dist/lib-cjs/ast/ast-node.js.map +1 -0
- package/dist/lib-cjs/errors/index.js +9 -0
- package/dist/lib-cjs/errors/index.js.map +1 -0
- package/dist/lib-cjs/errors/parser-lr-error.js +52 -0
- package/dist/lib-cjs/errors/parser-lr-error.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-schema.js +43 -0
- package/dist/lib-cjs/grammar/ast-schema.js.map +1 -0
- package/dist/lib-cjs/grammar/ast-type.js +3 -0
- package/dist/lib-cjs/grammar/ast-type.js.map +1 -0
- package/dist/lib-cjs/grammar/expression.js +3 -0
- package/dist/lib-cjs/grammar/expression.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js +641 -0
- package/dist/lib-cjs/grammar/grammar-from-cst.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js +13 -0
- package/dist/lib-cjs/grammar/grammar-json-path.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar-literals.js +71 -0
- package/dist/lib-cjs/grammar/grammar-literals.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.js +64 -0
- package/dist/lib-cjs/grammar/grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/grammar.json +5760 -0
- package/dist/lib-cjs/grammar/index.js +21 -0
- package/dist/lib-cjs/grammar/index.js.map +1 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js +68 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js.map +1 -0
- package/dist/lib-cjs/grammar/production.js +3 -0
- package/dist/lib-cjs/grammar/production.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js +22 -0
- package/dist/lib-cjs/grammar/read-grammar-error.js.map +1 -0
- package/dist/lib-cjs/grammar/read-grammar.js +24 -0
- package/dist/lib-cjs/grammar/read-grammar.js.map +1 -0
- package/dist/lib-cjs/grammar/table-validator.js +262 -0
- package/dist/lib-cjs/grammar/table-validator.js.map +1 -0
- package/dist/lib-cjs/grammar/token-rule.js +3 -0
- package/dist/lib-cjs/grammar/token-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-expression.js +3 -0
- package/dist/lib-cjs/grammar/transform-expression.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-rule.js +3 -0
- package/dist/lib-cjs/grammar/transform-rule.js.map +1 -0
- package/dist/lib-cjs/grammar/transform-schema.js +43 -0
- package/dist/lib-cjs/grammar/transform-schema.js.map +1 -0
- package/dist/lib-cjs/index.js +66 -0
- package/dist/lib-cjs/index.js.map +1 -0
- package/dist/lib-cjs/lexer/index.js +32 -0
- package/dist/lib-cjs/lexer/index.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-compile-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-compile.js +201 -0
- package/dist/lib-cjs/lexer/lexer-compile.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-error.js +22 -0
- package/dist/lib-cjs/lexer/lexer-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js +17 -0
- package/dist/lib-cjs/lexer/lexer-input-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js +19 -0
- package/dist/lib-cjs/lexer/lexer-state-error.js.map +1 -0
- package/dist/lib-cjs/lexer/lexer.js +278 -0
- package/dist/lib-cjs/lexer/lexer.js.map +1 -0
- package/dist/lib-cjs/lexer/token.js +44 -0
- package/dist/lib-cjs/lexer/token.js.map +1 -0
- package/dist/lib-cjs/package.json +3 -0
- package/dist/lib-cjs/parse-context-error.js +19 -0
- package/dist/lib-cjs/parse-context-error.js.map +1 -0
- package/dist/lib-cjs/parse-context.js +137 -0
- package/dist/lib-cjs/parse-context.js.map +1 -0
- package/dist/lib-cjs/parse-output-error.js +19 -0
- package/dist/lib-cjs/parse-output-error.js.map +1 -0
- package/dist/lib-cjs/parse-output.js +18 -0
- package/dist/lib-cjs/parse-output.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js +294 -0
- package/dist/lib-cjs/parse-table/analysis/first-follow.js.map +1 -0
- package/dist/lib-cjs/parse-table/analysis/index.js +9 -0
- package/dist/lib-cjs/parse-table/analysis/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js +140 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-grammar.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js +3 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-production.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js +39 -0
- package/dist/lib-cjs/parse-table/bnf/bnf-symbol.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js +224 -0
- package/dist/lib-cjs/parse-table/bnf/desugar-ebnf.js.map +1 -0
- package/dist/lib-cjs/parse-table/bnf/index.js +13 -0
- package/dist/lib-cjs/parse-table/bnf/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js +171 -0
- package/dist/lib-cjs/parse-table/build-lr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/index.js +49 -0
- package/dist/lib-cjs/parse-table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js +19 -0
- package/dist/lib-cjs/parse-table/lr-algorithm-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js +31 -0
- package/dist/lib-cjs/parse-table/lr-algorithm.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/index.js +14 -0
- package/dist/lib-cjs/parse-table/lr0/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js +286 -0
- package/dist/lib-cjs/parse-table/lr0/lr0-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/index.js +18 -0
- package/dist/lib-cjs/parse-table/lr1/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js +432 -0
- package/dist/lib-cjs/parse-table/lr1/lr1-item-set.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js +24 -0
- package/dist/lib-cjs/parse-table/parse-table-build-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js +19 -0
- package/dist/lib-cjs/parse-table/parse-table-error.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js +12 -0
- package/dist/lib-cjs/parse-table/parse-table-json.js.map +1 -0
- package/dist/lib-cjs/parse-table/parse-table.js +345 -0
- package/dist/lib-cjs/parse-table/parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/index.js +13 -0
- package/dist/lib-cjs/parse-table/slr/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js +8 -0
- package/dist/lib-cjs/parse-table/slr/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js +18 -0
- package/dist/lib-cjs/parse-table/slr/slr-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/index.js +21 -0
- package/dist/lib-cjs/parse-table/table/index.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js +192 -0
- package/dist/lib-cjs/parse-table/table/lr-parse-table.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js +54 -0
- package/dist/lib-cjs/parse-table/table/parse-action.js.map +1 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js +153 -0
- package/dist/lib-cjs/parse-table/table/table-builder-base.js.map +1 -0
- package/dist/lib-cjs/parse-table/token-inventory.js +18 -0
- package/dist/lib-cjs/parse-table/token-inventory.js.map +1 -0
- package/dist/lib-cjs/parser-lr.js +143 -0
- package/dist/lib-cjs/parser-lr.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/index.js +11 -0
- package/dist/lib-cjs/shift-reduce/index.js.map +1 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js +224 -0
- package/dist/lib-cjs/shift-reduce/shift-reduce-engine.js.map +1 -0
- package/dist/lib-cjs/transform/binding-map.js +82 -0
- package/dist/lib-cjs/transform/binding-map.js.map +1 -0
- package/dist/lib-cjs/transform/cst-transformer.js +480 -0
- package/dist/lib-cjs/transform/cst-transformer.js.map +1 -0
- package/dist/lib-cjs/transform/grammar-fixture.js +109 -0
- package/dist/lib-cjs/transform/grammar-fixture.js.map +1 -0
- package/dist/lib-cjs/transform/index.js +12 -0
- package/dist/lib-cjs/transform/index.js.map +1 -0
- package/docs/grammar.md +113 -0
- package/docs/parser-lr-enhancement-proposals.md +337 -0
- package/grammars/6502.grammar +233 -0
- package/grammars/calc.grammar +30 -0
- package/grammars/ferrite.grammar +991 -0
- package/grammars/fixtures/build-optional/build-optional.grammar +32 -0
- package/grammars/fixtures/build-optional/input.txt +1 -0
- package/grammars/fixtures/comparison-op/comparison-op.grammar +28 -0
- package/grammars/fixtures/comparison-op/input.txt +1 -0
- package/grammars/fixtures/flatten-repeat/flatten-repeat.grammar +28 -0
- package/grammars/fixtures/flatten-repeat/input.txt +1 -0
- package/grammars/fixtures/help-topic/help-topic.grammar +28 -0
- package/grammars/fixtures/help-topic/input.txt +1 -0
- package/grammars/fixtures/let-target/input.txt +1 -0
- package/grammars/fixtures/let-target/let-target.grammar +33 -0
- package/grammars/fixtures/nested-production-repro/input.txt +1 -0
- package/grammars/fixtures/nested-production-repro/nested-production-repro.grammar +26 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/bare-terminal.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/bare-terminal/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end-if.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/input-end.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/labeled-variant/labeled-variant.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-absent/optional-absent.grammar +24 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/input.txt +1 -0
- package/grammars/fixtures/pass-preserves-production/optional-present/optional-present.grammar +24 -0
- package/grammars/fixtures/table-only-import/calc.table.json +190 -0
- package/grammars/fixtures/table-only-import/table-only-smoke.cjs +38 -0
- package/grammars/fixtures/table-only-import/table-only-smoke.mjs +18 -0
- package/grammars/grammar.grammar +428 -0
- package/grammars/lisp.grammar +95 -0
- package/package.json +10 -4
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
// Meta-grammar for parser-lr grammar files (.grammar).
|
|
2
|
+
// Dogfood target: this file should parse itself once lexer, table build, and parse are wired.
|
|
3
|
+
//
|
|
4
|
+
// Calc example (parse + ast + transform):
|
|
5
|
+
//
|
|
6
|
+
// grammar
|
|
7
|
+
// expr = term { #add plus term | #sub minus term } ;
|
|
8
|
+
// term = factor { #mul star factor | #div slash factor } ;
|
|
9
|
+
// factor = #number number | #group lpar expr rpar ;
|
|
10
|
+
//
|
|
11
|
+
// ast
|
|
12
|
+
// expr = #binary [left]:expr [operator]:operator [right]:expr
|
|
13
|
+
// | #literal number
|
|
14
|
+
// | #grouped expr ;
|
|
15
|
+
// operator = #plus plus | #minus minus | #star star | #slash slash ;
|
|
16
|
+
//
|
|
17
|
+
// transform
|
|
18
|
+
// expr ->
|
|
19
|
+
// #add fold-left(expr.#binary, left, operator, right)
|
|
20
|
+
// | #sub fold-left(expr.#binary, left, operator, right)
|
|
21
|
+
// | #term pass(term) ;
|
|
22
|
+
// term ->
|
|
23
|
+
// #mul fold-left(expr.#binary, left, operator, right)
|
|
24
|
+
// | #div fold-left(expr.#binary, left, operator, right)
|
|
25
|
+
// | #factor pass(factor) ;
|
|
26
|
+
// factor ->
|
|
27
|
+
// #number expr.#literal(number)
|
|
28
|
+
// | #group pass(expr) ;
|
|
29
|
+
|
|
30
|
+
name "grammar" ;
|
|
31
|
+
|
|
32
|
+
tokens
|
|
33
|
+
name_kw = /name/ ;
|
|
34
|
+
tokens_kw = /tokens/ ;
|
|
35
|
+
skip_kw = /skip/ ;
|
|
36
|
+
states_kw = /states/ ;
|
|
37
|
+
start_kw = /start/ ;
|
|
38
|
+
grammar_kw = /grammar/ ;
|
|
39
|
+
ast_kw = /ast/ ;
|
|
40
|
+
transform_kw = /transform/ ;
|
|
41
|
+
pass_kw = /pass/ ;
|
|
42
|
+
drop_kw = /drop/ ;
|
|
43
|
+
fold_left_kw = /fold-left/ ;
|
|
44
|
+
fold_right_kw = /fold-right/ ;
|
|
45
|
+
flatten_kw = /flatten/ ;
|
|
46
|
+
|
|
47
|
+
identifier = /[A-Za-z_][A-Za-z0-9_$]*/ ;
|
|
48
|
+
|
|
49
|
+
equal = /=/ ;
|
|
50
|
+
semicolon = /;/ ;
|
|
51
|
+
comma = /,/ ;
|
|
52
|
+
bar = /\|/ ;
|
|
53
|
+
hash = /#/ ;
|
|
54
|
+
arrow = /->/ ;
|
|
55
|
+
colon = /:/ ;
|
|
56
|
+
dot = /\./ ;
|
|
57
|
+
|
|
58
|
+
lpar = /\(/ ;
|
|
59
|
+
rpar = /\)/ ;
|
|
60
|
+
lbracket = /\[/ ;
|
|
61
|
+
rbracket = /\]/ ;
|
|
62
|
+
lbrace = /\{/ ;
|
|
63
|
+
rbrace = /\}/ ;
|
|
64
|
+
|
|
65
|
+
// Lexer: / pattern / then zero or more flag letters from g i m s u y
|
|
66
|
+
regex_literal = /\/(\\.|[^\\\/])+\/[gimsuy]*/ ;
|
|
67
|
+
string_literal = /"(?:\\.|[^"\\])*"/ ;
|
|
68
|
+
|
|
69
|
+
skip
|
|
70
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
71
|
+
comment = /\/\/[^\n\r]*/ ;
|
|
72
|
+
|
|
73
|
+
start grammar_file ;
|
|
74
|
+
|
|
75
|
+
grammar
|
|
76
|
+
grammar_file =
|
|
77
|
+
name_decl
|
|
78
|
+
{ section }
|
|
79
|
+
start_decl
|
|
80
|
+
grammar_section
|
|
81
|
+
[ ast_section ]
|
|
82
|
+
[ transform_section ]
|
|
83
|
+
;
|
|
84
|
+
|
|
85
|
+
name_decl =
|
|
86
|
+
name_kw grammar_name semicolon
|
|
87
|
+
;
|
|
88
|
+
|
|
89
|
+
grammar_name =
|
|
90
|
+
identifier
|
|
91
|
+
| string_literal
|
|
92
|
+
;
|
|
93
|
+
|
|
94
|
+
section =
|
|
95
|
+
token_section
|
|
96
|
+
| skip_section
|
|
97
|
+
| states_section
|
|
98
|
+
;
|
|
99
|
+
|
|
100
|
+
token_section =
|
|
101
|
+
tokens_kw token_def { token_def }
|
|
102
|
+
;
|
|
103
|
+
|
|
104
|
+
skip_section =
|
|
105
|
+
skip_kw token_def { token_def }
|
|
106
|
+
;
|
|
107
|
+
|
|
108
|
+
states_section =
|
|
109
|
+
states_kw state_name { comma state_name } semicolon
|
|
110
|
+
;
|
|
111
|
+
|
|
112
|
+
token_def =
|
|
113
|
+
identifier equal regex_literal semicolon
|
|
114
|
+
;
|
|
115
|
+
|
|
116
|
+
state_name =
|
|
117
|
+
identifier
|
|
118
|
+
;
|
|
119
|
+
|
|
120
|
+
start_decl =
|
|
121
|
+
start_kw identifier semicolon
|
|
122
|
+
;
|
|
123
|
+
|
|
124
|
+
grammar_section =
|
|
125
|
+
grammar_kw production { production }
|
|
126
|
+
;
|
|
127
|
+
|
|
128
|
+
ast_section =
|
|
129
|
+
ast_kw ast_type { ast_type }
|
|
130
|
+
;
|
|
131
|
+
|
|
132
|
+
transform_section =
|
|
133
|
+
transform_kw transform_rule { transform_rule }
|
|
134
|
+
;
|
|
135
|
+
|
|
136
|
+
production =
|
|
137
|
+
identifier equal expression semicolon
|
|
138
|
+
;
|
|
139
|
+
|
|
140
|
+
ast_type =
|
|
141
|
+
identifier equal expression semicolon
|
|
142
|
+
;
|
|
143
|
+
|
|
144
|
+
transform_rule =
|
|
145
|
+
identifier arrow labeled_transform { bar labeled_transform } semicolon
|
|
146
|
+
;
|
|
147
|
+
|
|
148
|
+
labeled_transform =
|
|
149
|
+
hash identifier transform_expr
|
|
150
|
+
;
|
|
151
|
+
|
|
152
|
+
transform_expr =
|
|
153
|
+
drop_kw
|
|
154
|
+
| pass_expr
|
|
155
|
+
| fold_left_expr
|
|
156
|
+
| fold_right_expr
|
|
157
|
+
| flatten_expr
|
|
158
|
+
| build_expr
|
|
159
|
+
;
|
|
160
|
+
|
|
161
|
+
pass_expr =
|
|
162
|
+
pass_kw lpar reference rpar
|
|
163
|
+
;
|
|
164
|
+
|
|
165
|
+
fold_left_expr =
|
|
166
|
+
fold_left_kw lpar build_target comma reference_list rpar
|
|
167
|
+
;
|
|
168
|
+
|
|
169
|
+
fold_right_expr =
|
|
170
|
+
fold_right_kw lpar build_target comma reference_list rpar
|
|
171
|
+
;
|
|
172
|
+
|
|
173
|
+
flatten_expr =
|
|
174
|
+
flatten_kw lpar build_target comma reference comma reference rpar
|
|
175
|
+
;
|
|
176
|
+
|
|
177
|
+
build_expr =
|
|
178
|
+
build_target [ lpar reference_list rpar ]
|
|
179
|
+
;
|
|
180
|
+
|
|
181
|
+
build_target =
|
|
182
|
+
identifier dot hash identifier
|
|
183
|
+
;
|
|
184
|
+
|
|
185
|
+
reference_list =
|
|
186
|
+
reference { comma reference }
|
|
187
|
+
;
|
|
188
|
+
|
|
189
|
+
reference =
|
|
190
|
+
identifier
|
|
191
|
+
;
|
|
192
|
+
|
|
193
|
+
expression =
|
|
194
|
+
choice
|
|
195
|
+
;
|
|
196
|
+
|
|
197
|
+
choice =
|
|
198
|
+
alternative { bar alternative }
|
|
199
|
+
;
|
|
200
|
+
|
|
201
|
+
alternative =
|
|
202
|
+
labeled_alternative
|
|
203
|
+
;
|
|
204
|
+
|
|
205
|
+
labeled_alternative =
|
|
206
|
+
[ hash identifier ] sequence
|
|
207
|
+
;
|
|
208
|
+
|
|
209
|
+
sequence =
|
|
210
|
+
factor { factor }
|
|
211
|
+
;
|
|
212
|
+
|
|
213
|
+
factor =
|
|
214
|
+
bracketed
|
|
215
|
+
| repeat
|
|
216
|
+
| group
|
|
217
|
+
| primary
|
|
218
|
+
;
|
|
219
|
+
|
|
220
|
+
bracketed =
|
|
221
|
+
lbracket expression rbracket [ colon identifier ]
|
|
222
|
+
;
|
|
223
|
+
|
|
224
|
+
repeat =
|
|
225
|
+
lbrace expression rbrace
|
|
226
|
+
;
|
|
227
|
+
|
|
228
|
+
group =
|
|
229
|
+
lpar expression rpar
|
|
230
|
+
;
|
|
231
|
+
|
|
232
|
+
primary =
|
|
233
|
+
string_literal
|
|
234
|
+
| identifier
|
|
235
|
+
;
|
|
236
|
+
|
|
237
|
+
ast
|
|
238
|
+
grammar_file =
|
|
239
|
+
name_decl
|
|
240
|
+
{ section }
|
|
241
|
+
start_decl
|
|
242
|
+
grammar_section
|
|
243
|
+
[ ast_section ]
|
|
244
|
+
[ transform_section ]
|
|
245
|
+
;
|
|
246
|
+
|
|
247
|
+
name_decl =
|
|
248
|
+
name_kw grammar_name semicolon
|
|
249
|
+
;
|
|
250
|
+
|
|
251
|
+
grammar_name =
|
|
252
|
+
identifier
|
|
253
|
+
| string_literal
|
|
254
|
+
;
|
|
255
|
+
|
|
256
|
+
section =
|
|
257
|
+
token_section
|
|
258
|
+
| skip_section
|
|
259
|
+
| states_section
|
|
260
|
+
;
|
|
261
|
+
|
|
262
|
+
token_section =
|
|
263
|
+
tokens_kw token_def { token_def }
|
|
264
|
+
;
|
|
265
|
+
|
|
266
|
+
skip_section =
|
|
267
|
+
skip_kw token_def { token_def }
|
|
268
|
+
;
|
|
269
|
+
|
|
270
|
+
states_section =
|
|
271
|
+
states_kw state_name { comma state_name } semicolon
|
|
272
|
+
;
|
|
273
|
+
|
|
274
|
+
token_def =
|
|
275
|
+
identifier equal regex_literal semicolon
|
|
276
|
+
;
|
|
277
|
+
|
|
278
|
+
state_name =
|
|
279
|
+
identifier
|
|
280
|
+
;
|
|
281
|
+
|
|
282
|
+
start_decl =
|
|
283
|
+
start_kw identifier semicolon
|
|
284
|
+
;
|
|
285
|
+
|
|
286
|
+
grammar_section =
|
|
287
|
+
grammar_kw production { production }
|
|
288
|
+
;
|
|
289
|
+
|
|
290
|
+
ast_section =
|
|
291
|
+
ast_kw ast_type { ast_type }
|
|
292
|
+
;
|
|
293
|
+
|
|
294
|
+
transform_section =
|
|
295
|
+
transform_kw transform_rule { transform_rule }
|
|
296
|
+
;
|
|
297
|
+
|
|
298
|
+
production =
|
|
299
|
+
identifier equal expression semicolon
|
|
300
|
+
;
|
|
301
|
+
|
|
302
|
+
ast_type =
|
|
303
|
+
identifier equal expression semicolon
|
|
304
|
+
;
|
|
305
|
+
|
|
306
|
+
transform_rule =
|
|
307
|
+
identifier arrow labeled_transform { bar labeled_transform } semicolon
|
|
308
|
+
;
|
|
309
|
+
|
|
310
|
+
labeled_transform =
|
|
311
|
+
hash identifier transform_expr
|
|
312
|
+
;
|
|
313
|
+
|
|
314
|
+
transform_expr =
|
|
315
|
+
drop_kw
|
|
316
|
+
| pass_expr
|
|
317
|
+
| fold_left_expr
|
|
318
|
+
| fold_right_expr
|
|
319
|
+
| flatten_expr
|
|
320
|
+
| build_expr
|
|
321
|
+
;
|
|
322
|
+
|
|
323
|
+
pass_expr =
|
|
324
|
+
pass_kw lpar reference rpar
|
|
325
|
+
;
|
|
326
|
+
|
|
327
|
+
fold_left_expr =
|
|
328
|
+
fold_left_kw lpar build_target comma reference_list rpar
|
|
329
|
+
;
|
|
330
|
+
|
|
331
|
+
fold_right_expr =
|
|
332
|
+
fold_right_kw lpar build_target comma reference_list rpar
|
|
333
|
+
;
|
|
334
|
+
|
|
335
|
+
flatten_expr =
|
|
336
|
+
flatten_kw lpar build_target comma reference comma reference rpar
|
|
337
|
+
;
|
|
338
|
+
|
|
339
|
+
build_expr =
|
|
340
|
+
build_target [ lpar reference_list rpar ]
|
|
341
|
+
;
|
|
342
|
+
|
|
343
|
+
build_target =
|
|
344
|
+
identifier dot hash identifier
|
|
345
|
+
;
|
|
346
|
+
|
|
347
|
+
reference_list =
|
|
348
|
+
reference { comma reference }
|
|
349
|
+
;
|
|
350
|
+
|
|
351
|
+
reference =
|
|
352
|
+
identifier
|
|
353
|
+
;
|
|
354
|
+
|
|
355
|
+
expression =
|
|
356
|
+
choice
|
|
357
|
+
;
|
|
358
|
+
|
|
359
|
+
choice =
|
|
360
|
+
alternative { bar alternative }
|
|
361
|
+
;
|
|
362
|
+
|
|
363
|
+
alternative =
|
|
364
|
+
labeled_alternative
|
|
365
|
+
;
|
|
366
|
+
|
|
367
|
+
labeled_alternative =
|
|
368
|
+
[ hash identifier ] sequence
|
|
369
|
+
;
|
|
370
|
+
|
|
371
|
+
sequence =
|
|
372
|
+
factor { factor }
|
|
373
|
+
;
|
|
374
|
+
|
|
375
|
+
factor =
|
|
376
|
+
bracketed
|
|
377
|
+
| repeat
|
|
378
|
+
| group
|
|
379
|
+
| primary
|
|
380
|
+
;
|
|
381
|
+
|
|
382
|
+
bracketed =
|
|
383
|
+
lbracket expression rbracket [ colon identifier ]
|
|
384
|
+
;
|
|
385
|
+
|
|
386
|
+
repeat =
|
|
387
|
+
lbrace expression rbrace
|
|
388
|
+
;
|
|
389
|
+
|
|
390
|
+
group =
|
|
391
|
+
lpar expression rpar
|
|
392
|
+
;
|
|
393
|
+
|
|
394
|
+
primary =
|
|
395
|
+
string_literal
|
|
396
|
+
| identifier
|
|
397
|
+
;
|
|
398
|
+
|
|
399
|
+
transform
|
|
400
|
+
grammar_file$repeat_0 ->
|
|
401
|
+
#main flatten(grammar_file.#sections, section, grammar_file$repeat_0) ;
|
|
402
|
+
|
|
403
|
+
token_section$repeat_1 ->
|
|
404
|
+
#main flatten(token_section.#definitions, token_def, token_section$repeat_1) ;
|
|
405
|
+
|
|
406
|
+
skip_section$repeat_2 ->
|
|
407
|
+
#main flatten(skip_section.#definitions, token_def, skip_section$repeat_2) ;
|
|
408
|
+
|
|
409
|
+
grammar_section$repeat_4 ->
|
|
410
|
+
#main flatten(grammar_section.#productions, production, grammar_section$repeat_4) ;
|
|
411
|
+
|
|
412
|
+
ast_section$repeat_5 ->
|
|
413
|
+
#main flatten(ast_section.#types, ast_type, ast_section$repeat_5) ;
|
|
414
|
+
|
|
415
|
+
transform_section$repeat_6 ->
|
|
416
|
+
#main flatten(transform_section.#rules, transform_rule, transform_section$repeat_6) ;
|
|
417
|
+
|
|
418
|
+
transform_rule$repeat_7 ->
|
|
419
|
+
#main flatten(transform_rule.#alternatives, labeled_transform, transform_rule$repeat_7) ;
|
|
420
|
+
|
|
421
|
+
reference_list$repeat_8 ->
|
|
422
|
+
#main flatten(reference_list.#references, reference, reference_list$repeat_8) ;
|
|
423
|
+
|
|
424
|
+
choice$repeat_9 ->
|
|
425
|
+
#main flatten(choice.#alternatives, alternative, choice$repeat_9) ;
|
|
426
|
+
|
|
427
|
+
sequence$repeat_10 ->
|
|
428
|
+
#main flatten(sequence.#factors, factor, sequence$repeat_10) ;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Very simple Lisp: s-expressions with numbers, symbols, and strings.
|
|
2
|
+
//
|
|
3
|
+
// Example:
|
|
4
|
+
//
|
|
5
|
+
// ; factorial sketch
|
|
6
|
+
// (def factorial (n)
|
|
7
|
+
// (if (= n 0)
|
|
8
|
+
// 1
|
|
9
|
+
// (* n (factorial (- n 1)))))
|
|
10
|
+
//
|
|
11
|
+
// (quote hello)
|
|
12
|
+
// (+ 1 2 3)
|
|
13
|
+
|
|
14
|
+
name "lisp" ;
|
|
15
|
+
|
|
16
|
+
tokens
|
|
17
|
+
lpar = /\(/ ;
|
|
18
|
+
rpar = /\)/ ;
|
|
19
|
+
|
|
20
|
+
number = /[+-]?[0-9]+/ ;
|
|
21
|
+
symbol = /[a-zA-Z+*\-\/=<>?!_][a-zA-Z0-9+*\-\/=<>?!_]*/ ;
|
|
22
|
+
string = /"(?:\\.|[^"\\])*"/ ;
|
|
23
|
+
|
|
24
|
+
skip
|
|
25
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
26
|
+
comment = /;[^\n\r]*/ ;
|
|
27
|
+
|
|
28
|
+
start program ;
|
|
29
|
+
|
|
30
|
+
grammar
|
|
31
|
+
program =
|
|
32
|
+
{ [item]:form }
|
|
33
|
+
;
|
|
34
|
+
|
|
35
|
+
form =
|
|
36
|
+
#list list
|
|
37
|
+
| #atom atom
|
|
38
|
+
;
|
|
39
|
+
|
|
40
|
+
list =
|
|
41
|
+
[open]:lpar
|
|
42
|
+
{ [element]:form }
|
|
43
|
+
[close]:rpar
|
|
44
|
+
;
|
|
45
|
+
|
|
46
|
+
atom =
|
|
47
|
+
#number [value]:number
|
|
48
|
+
| #symbol [value]:symbol
|
|
49
|
+
| #string [value]:string
|
|
50
|
+
;
|
|
51
|
+
|
|
52
|
+
ast
|
|
53
|
+
program =
|
|
54
|
+
{ form }
|
|
55
|
+
;
|
|
56
|
+
|
|
57
|
+
form =
|
|
58
|
+
#list list
|
|
59
|
+
| #atom atom
|
|
60
|
+
;
|
|
61
|
+
|
|
62
|
+
list =
|
|
63
|
+
[open]:lpar
|
|
64
|
+
{ [element]:form }
|
|
65
|
+
[close]:rpar
|
|
66
|
+
;
|
|
67
|
+
|
|
68
|
+
atom =
|
|
69
|
+
#number [value]:number
|
|
70
|
+
| #symbol [value]:symbol
|
|
71
|
+
| #string [value]:string
|
|
72
|
+
;
|
|
73
|
+
|
|
74
|
+
transform
|
|
75
|
+
program ->
|
|
76
|
+
#main pass(program$repeat_0) ;
|
|
77
|
+
|
|
78
|
+
program$repeat_0 ->
|
|
79
|
+
#main flatten(program.#program, item, program$repeat_0) ;
|
|
80
|
+
|
|
81
|
+
form ->
|
|
82
|
+
#list pass(list)
|
|
83
|
+
| #atom pass(atom) ;
|
|
84
|
+
|
|
85
|
+
list ->
|
|
86
|
+
#main list.#list(open, list$repeat_1, close) ;
|
|
87
|
+
|
|
88
|
+
list$repeat_1 ->
|
|
89
|
+
#main flatten(form.#elements, element, list$repeat_1) ;
|
|
90
|
+
|
|
91
|
+
atom ->
|
|
92
|
+
#number atom.#number(value)
|
|
93
|
+
| #symbol atom.#symbol(value)
|
|
94
|
+
| #string atom.#string(value)
|
|
95
|
+
;
|
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.6.0",
|
|
5
5
|
"description": "Shift-reduce parser library for EBNF grammars",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"repository": {
|
|
@@ -22,16 +22,21 @@
|
|
|
22
22
|
"exports": {
|
|
23
23
|
".": {
|
|
24
24
|
"types": "./dist/lib/index.d.ts",
|
|
25
|
-
"import": "./dist/lib/index.js"
|
|
25
|
+
"import": "./dist/lib/index.js",
|
|
26
|
+
"require": "./dist/lib-cjs/index.js",
|
|
27
|
+
"default": "./dist/lib/index.js"
|
|
26
28
|
}
|
|
27
29
|
},
|
|
28
30
|
"bin": {
|
|
29
31
|
"parser-lr": "bin/parser-lr.js"
|
|
30
32
|
},
|
|
31
33
|
"files": [
|
|
34
|
+
"README.md",
|
|
35
|
+
"LICENSE",
|
|
32
36
|
"bin",
|
|
33
37
|
"dist",
|
|
34
|
-
"docs"
|
|
38
|
+
"docs",
|
|
39
|
+
"grammars"
|
|
35
40
|
],
|
|
36
41
|
"publishConfig": {
|
|
37
42
|
"access": "public",
|
|
@@ -41,9 +46,10 @@
|
|
|
41
46
|
"bootstrap": "npm link && parser-lr table generate -g grammars/grammar.grammar -o src/lib/grammar/grammar.json -a lalr",
|
|
42
47
|
"build": "npm run build:clean && npm run build:lib && npm run build:cli",
|
|
43
48
|
"build:clean": "rm -rf dist && rm -f bin/parser-lr.js bin/parser-lr.js.map",
|
|
44
|
-
"build:lib": "
|
|
49
|
+
"build:lib": "node scripts/build-lib.mjs",
|
|
45
50
|
"build:cli": "rollup -c rollup.cli.config.js && chmod +x bin/parser-lr.js",
|
|
46
51
|
"cloc": "cloc src --exclude-dir=node_modules,dist",
|
|
52
|
+
"acceptance": "node scripts/acceptance-tarball.mjs",
|
|
47
53
|
"test": "jest",
|
|
48
54
|
"test:coverage": "jest --coverage",
|
|
49
55
|
"prepack": "npm run build"
|