parser-lr 0.4.0 → 0.5.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 +35 -1
- package/bin/parser-lr.js +369 -9068
- 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/grammar.json +1218 -4476
- package/dist/lib/grammar/index.d.ts +2 -0
- package/dist/lib/grammar/index.d.ts.map +1 -1
- package/dist/lib/grammar/index.js +1 -0
- package/dist/lib/grammar/index.js.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.d.ts.map +1 -1
- package/dist/lib/grammar/meta-grammar-table.js +4 -2
- 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 +211 -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 +19 -0
- package/dist/lib-cjs/grammar/index.js.map +1 -0
- package/dist/lib-cjs/grammar/meta-grammar-table.js +39 -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 +215 -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 +80 -0
- package/docs/parser-lr-enhancement-proposals.md +548 -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/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/grammar.grammar +428 -0
- package/grammars/lisp.grammar +95 -0
- package/package.json +10 -5
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
name "build-optional-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_cls = /CLS/i ;
|
|
5
|
+
kw_with = /WITH/i ;
|
|
6
|
+
ident = /[a-z]+/ ;
|
|
7
|
+
|
|
8
|
+
skip
|
|
9
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
10
|
+
|
|
11
|
+
start program_line ;
|
|
12
|
+
|
|
13
|
+
grammar
|
|
14
|
+
program_line =
|
|
15
|
+
#statement [stmt]:cls_stmt
|
|
16
|
+
;
|
|
17
|
+
|
|
18
|
+
cls_stmt =
|
|
19
|
+
kw_cls [ kw_with ident ]
|
|
20
|
+
;
|
|
21
|
+
|
|
22
|
+
ast
|
|
23
|
+
cls_stmt =
|
|
24
|
+
#main kw_cls [withKw]:kw_with [target]:ident
|
|
25
|
+
;
|
|
26
|
+
|
|
27
|
+
transform
|
|
28
|
+
cls_stmt ->
|
|
29
|
+
#main cls_stmt.#main(kw_cls, withKw, target) ;
|
|
30
|
+
|
|
31
|
+
program_line ->
|
|
32
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CLS
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name "comparison-op-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_case = /CASE/i ;
|
|
5
|
+
kw_is = /IS/i ;
|
|
6
|
+
less = /</ ;
|
|
7
|
+
greater = />/ ;
|
|
8
|
+
number = /[0-9]+/ ;
|
|
9
|
+
|
|
10
|
+
skip
|
|
11
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
12
|
+
|
|
13
|
+
start case_selector ;
|
|
14
|
+
|
|
15
|
+
grammar
|
|
16
|
+
case_selector =
|
|
17
|
+
#relational kw_case kw_is comparison_op postfix_expr
|
|
18
|
+
| #value postfix_expr
|
|
19
|
+
;
|
|
20
|
+
|
|
21
|
+
comparison_op =
|
|
22
|
+
#less less
|
|
23
|
+
| #greater greater
|
|
24
|
+
;
|
|
25
|
+
|
|
26
|
+
postfix_expr =
|
|
27
|
+
number
|
|
28
|
+
;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CASE IS < 0
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name "flatten-repeat-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
ident = /[a-z]+/ ;
|
|
5
|
+
comma = /,/ ;
|
|
6
|
+
|
|
7
|
+
skip
|
|
8
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
9
|
+
|
|
10
|
+
start list ;
|
|
11
|
+
|
|
12
|
+
grammar
|
|
13
|
+
list =
|
|
14
|
+
#list [first]:item { comma [rest]:item }
|
|
15
|
+
;
|
|
16
|
+
|
|
17
|
+
item =
|
|
18
|
+
ident
|
|
19
|
+
;
|
|
20
|
+
|
|
21
|
+
ast
|
|
22
|
+
list =
|
|
23
|
+
#list [first]:item { [rest]:item }
|
|
24
|
+
;
|
|
25
|
+
|
|
26
|
+
transform
|
|
27
|
+
list ->
|
|
28
|
+
#list flatten(list.#list, first, list$repeat_0) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
a,b,c
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name "help-topic-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_help = /HELP/i ;
|
|
5
|
+
kw_print = /PRINT/i ;
|
|
6
|
+
|
|
7
|
+
skip
|
|
8
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
9
|
+
|
|
10
|
+
start program_line ;
|
|
11
|
+
|
|
12
|
+
grammar
|
|
13
|
+
program_line =
|
|
14
|
+
#statement [stmt]:help_stmt
|
|
15
|
+
;
|
|
16
|
+
|
|
17
|
+
help_stmt =
|
|
18
|
+
kw_help help_topic
|
|
19
|
+
;
|
|
20
|
+
|
|
21
|
+
help_topic =
|
|
22
|
+
#keyword kw_print
|
|
23
|
+
| #punct kw_print
|
|
24
|
+
;
|
|
25
|
+
|
|
26
|
+
transform
|
|
27
|
+
program_line ->
|
|
28
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
HELP PRINT
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
LET x% = 1
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
name "let-target-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_let = /LET/i ;
|
|
5
|
+
identifier = /[a-z][a-z0-9%]*/i ;
|
|
6
|
+
equal = /=/ ;
|
|
7
|
+
number = /[0-9]+/ ;
|
|
8
|
+
|
|
9
|
+
skip
|
|
10
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
11
|
+
|
|
12
|
+
start program_line ;
|
|
13
|
+
|
|
14
|
+
grammar
|
|
15
|
+
program_line =
|
|
16
|
+
#statement [stmt]:let_stmt
|
|
17
|
+
;
|
|
18
|
+
|
|
19
|
+
let_stmt =
|
|
20
|
+
kw_let let_target equal expr
|
|
21
|
+
;
|
|
22
|
+
|
|
23
|
+
let_target =
|
|
24
|
+
identifier
|
|
25
|
+
;
|
|
26
|
+
|
|
27
|
+
expr =
|
|
28
|
+
number
|
|
29
|
+
;
|
|
30
|
+
|
|
31
|
+
transform
|
|
32
|
+
program_line ->
|
|
33
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name "pass-collapse-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_cls = /CLS/i ;
|
|
5
|
+
kw_with = /WITH/i ;
|
|
6
|
+
ident = /[a-z]+/ ;
|
|
7
|
+
|
|
8
|
+
skip
|
|
9
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
10
|
+
|
|
11
|
+
start program_line ;
|
|
12
|
+
|
|
13
|
+
grammar
|
|
14
|
+
program_line =
|
|
15
|
+
#statement [stmt]:cls_stmt
|
|
16
|
+
;
|
|
17
|
+
|
|
18
|
+
cls_stmt =
|
|
19
|
+
kw_cls [ kw_with ident ]
|
|
20
|
+
;
|
|
21
|
+
|
|
22
|
+
transform
|
|
23
|
+
program_line ->
|
|
24
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CLS
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
END IF
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
END
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name "labeled-variant-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_end = /END/i ;
|
|
5
|
+
kw_if = /IF/i ;
|
|
6
|
+
|
|
7
|
+
skip
|
|
8
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
9
|
+
|
|
10
|
+
start program_line ;
|
|
11
|
+
|
|
12
|
+
grammar
|
|
13
|
+
program_line =
|
|
14
|
+
#statement [stmt]:end_stmt
|
|
15
|
+
;
|
|
16
|
+
|
|
17
|
+
end_stmt =
|
|
18
|
+
#program kw_end
|
|
19
|
+
| #if kw_end kw_if
|
|
20
|
+
;
|
|
21
|
+
|
|
22
|
+
transform
|
|
23
|
+
program_line ->
|
|
24
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CLS
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name "optional-absent-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_cls = /CLS/i ;
|
|
5
|
+
kw_with = /WITH/i ;
|
|
6
|
+
ident = /[a-z]+/ ;
|
|
7
|
+
|
|
8
|
+
skip
|
|
9
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
10
|
+
|
|
11
|
+
start program_line ;
|
|
12
|
+
|
|
13
|
+
grammar
|
|
14
|
+
program_line =
|
|
15
|
+
#statement [stmt]:cls_stmt
|
|
16
|
+
;
|
|
17
|
+
|
|
18
|
+
cls_stmt =
|
|
19
|
+
kw_cls [ kw_with ident ]
|
|
20
|
+
;
|
|
21
|
+
|
|
22
|
+
transform
|
|
23
|
+
program_line ->
|
|
24
|
+
#statement pass(stmt) ;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
CLS WITH foo
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
name "optional-present-repro" ;
|
|
2
|
+
|
|
3
|
+
tokens
|
|
4
|
+
kw_cls = /CLS/i ;
|
|
5
|
+
kw_with = /WITH/i ;
|
|
6
|
+
ident = /[a-z]+/ ;
|
|
7
|
+
|
|
8
|
+
skip
|
|
9
|
+
whitespace = /[ \t\r\n]+/ ;
|
|
10
|
+
|
|
11
|
+
start program_line ;
|
|
12
|
+
|
|
13
|
+
grammar
|
|
14
|
+
program_line =
|
|
15
|
+
#statement [stmt]:cls_stmt
|
|
16
|
+
;
|
|
17
|
+
|
|
18
|
+
cls_stmt =
|
|
19
|
+
kw_cls [ kw_with ident ]
|
|
20
|
+
;
|
|
21
|
+
|
|
22
|
+
transform
|
|
23
|
+
program_line ->
|
|
24
|
+
#statement pass(stmt) ;
|
|
@@ -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) ;
|