Skip to content

Commit 6755625

Browse files
committed
go generate grammar sample in README.md
1 parent 0b8aa26 commit 6755625

File tree

7 files changed

+48
-15
lines changed

7 files changed

+48
-15
lines changed

README.md

+5-3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
ωBNF is self describing!
88

9+
<!-- INJECT: ```text\n${examples/wbnf.txt}\n``` -->
910
```text
1011
// Non-terminals
1112
grammar -> stmt+;
@@ -26,11 +27,11 @@ COMMENT -> /{ //.*$
2627
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
2728
};
2829
IDENT -> /{@|[A-Za-z_\.]\w*};
30+
INT -> /{\d+};
2931
STR -> /{ " (?: \\. | [^\\"] )* "
3032
| ' (?: \\. | [^\\'] )* '
31-
| ` (?: `` | [^] )* `
33+
| ` (?: `` | [^`] )* `
3234
};
33-
INT -> /{\d+};
3435
RE -> /{
3536
/{
3637
((?:
@@ -41,11 +42,12 @@ RE -> /{
4142
)*)
4243
\}
4344
};
44-
REF -> `\` IDENT;
45+
REF -> "\\" IDENT;
4546
4647
// Special
4748
.wrapRE -> /{\s*()\s*};
4849
```
50+
<!-- /INJECT -->
4951

5052
## The basics
5153

examples/wbnf.txt

+5-5
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,15 @@ quant -> op=/{[?*+]}
1313
atom -> IDENT | STR | RE | REF | "(" term ")" | "(" ")";
1414

1515
// Terminals
16+
COMMENT -> /{ //.*$
17+
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
18+
};
1619
IDENT -> /{@|[A-Za-z_\.]\w*};
20+
INT -> /{\d+};
1721
STR -> /{ " (?: \\. | [^\\"] )* "
1822
| ' (?: \\. | [^\\'] )* '
1923
| ` (?: `` | [^`] )* `
2024
};
21-
INT -> /{\d+};
2225
RE -> /{
2326
/{
2427
((?:
@@ -29,10 +32,7 @@ RE -> /{
2932
)*)
3033
\}
3134
};
32-
REF -> "\\" IDENT;
33-
COMMENT -> /{ //.*$
34-
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
35-
};
35+
REF -> "\\" IDENT;
3636

3737
// Special
3838
.wrapRE -> /{\s*()\s*};

generate.go

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package main
2+
3+
//go:generate scripts/inject.py -i README.md

wbnf/copygrammar.sh renamed to scripts/copygrammar.sh

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
#!/bin/bash
1+
#!/bin/sh
22

33
out=wbnfgrammar.go
4+
45
echo Generating $out
6+
57
cat > $out <<EOF
68
package wbnf
79

scripts/inject.py

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#!/usr/bin/env python3
2+
3+
import re
4+
import sys
5+
6+
if sys.argv[1] == '-i':
7+
sys.argv[1] = sys.argv[2]
8+
9+
with sys.stdin if sys.argv[1] == '-' else open(sys.argv[1]) as input:
10+
result = re.sub(
11+
r"(?s)(<!--\s*INJECT:\s*(.*?)\s*-->\n).*?(\n<!--\s*/INJECT\s*-->)",
12+
lambda s:
13+
s[1]
14+
+
15+
re.sub(
16+
r"\$\{(.*?)}",
17+
lambda f: open(f[1]).read().rstrip(),
18+
s[2].replace(r"\n", "\n"),
19+
)
20+
+
21+
s[3],
22+
input.read(),
23+
)
24+
25+
with sys.stdout if sys.argv[2] == '-' else open(sys.argv[2], 'w') as output:
26+
output.write(result)

wbnf/generate.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
package wbnf
22

3-
//go:generate sh copygrammar.sh
3+
//go:generate ../scripts/copygrammar.sh

wbnf/wbnfgrammar.go

+5-5
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ quant -> op=/{[?*+]}
1616
atom -> IDENT | STR | RE | REF | "(" term ")" | "(" ")";
1717
1818
// Terminals
19+
COMMENT -> /{ //.*$
20+
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
21+
};
1922
IDENT -> /{@|[A-Za-z_\.]\w*};
23+
INT -> /{\d+};
2024
STR -> /{ " (?: \\. | [^\\"] )* "
2125
| ' (?: \\. | [^\\'] )* '
2226
| ‵ (?: ‵‵ | [^‵] )* ‵
2327
};
24-
INT -> /{\d+};
2528
RE -> /{
2629
/{
2730
((?:
@@ -32,10 +35,7 @@ RE -> /{
3235
)*)
3336
\}
3437
};
35-
REF -> "\\" IDENT;
36-
COMMENT -> /{ //.*$
37-
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
38-
};
38+
REF -> "\\" IDENT;
3939
4040
// Special
4141
.wrapRE -> /{\s*()\s*};

0 commit comments

Comments
 (0)