File tree 7 files changed +48
-15
lines changed
7 files changed +48
-15
lines changed Original file line number Diff line number Diff line change 6
6
7
7
ωBNF is self describing!
8
8
9
+ <!-- INJECT: ```text\n${examples/wbnf.txt}\n``` -->
9
10
``` text
10
11
// Non-terminals
11
12
grammar -> stmt+;
@@ -26,11 +27,11 @@ COMMENT -> /{ //.*$
26
27
| (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
27
28
};
28
29
IDENT -> /{@|[A-Za-z_\.]\w*};
30
+ INT -> /{\d+};
29
31
STR -> /{ " (?: \\. | [^\\"] )* "
30
32
| ' (?: \\. | [^\\'] )* '
31
- | ` (?: `` | [^‵ ] )* `
33
+ | ` (?: `` | [^` ] )* `
32
34
};
33
- INT -> /{\d+};
34
35
RE -> /{
35
36
/{
36
37
((?:
@@ -41,11 +42,12 @@ RE -> /{
41
42
)*)
42
43
\}
43
44
};
44
- REF -> `\` IDENT;
45
+ REF -> "\\" IDENT;
45
46
46
47
// Special
47
48
.wrapRE -> /{\s*()\s*};
48
49
```
50
+ <!-- /INJECT -->
49
51
50
52
## The basics
51
53
Original file line number Diff line number Diff line change @@ -13,12 +13,15 @@ quant -> op=/{[?*+]}
13
13
atom -> IDENT | STR | RE | REF | "(" term ")" | "(" ")";
14
14
15
15
// Terminals
16
+ COMMENT -> /{ //.*$
17
+ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
18
+ };
16
19
IDENT -> /{@|[A-Za-z_\.]\w*};
20
+ INT -> /{\d+};
17
21
STR -> /{ " (?: \\. | [^\\"] )* "
18
22
| ' (?: \\. | [^\\'] )* '
19
23
| ` (?: `` | [^`] )* `
20
24
};
21
- INT -> /{\d+};
22
25
RE -> /{
23
26
/{
24
27
((?:
@@ -29,10 +32,7 @@ RE -> /{
29
32
)*)
30
33
\}
31
34
};
32
- REF -> "\\" IDENT;
33
- COMMENT -> /{ //.*$
34
- | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
35
- };
35
+ REF -> "\\" IDENT;
36
36
37
37
// Special
38
38
.wrapRE -> /{\s*()\s*};
Original file line number Diff line number Diff line change
1
+ package main
2
+
3
+ //go:generate scripts/inject.py -i README.md
Original file line number Diff line number Diff line change 1
- #! /bin/bash
1
+ #! /bin/sh
2
2
3
3
out=wbnfgrammar.go
4
+
4
5
echo Generating $out
6
+
5
7
cat > $out << EOF
6
8
package wbnf
7
9
Original file line number Diff line number Diff line change
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 )
Original file line number Diff line number Diff line change 1
1
package wbnf
2
2
3
- //go:generate sh copygrammar.sh
3
+ //go:generate ../scripts/ copygrammar.sh
Original file line number Diff line number Diff line change @@ -16,12 +16,15 @@ quant -> op=/{[?*+]}
16
16
atom -> IDENT | STR | RE | REF | "(" term ")" | "(" ")";
17
17
18
18
// Terminals
19
+ COMMENT -> /{ //.*$
20
+ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
21
+ };
19
22
IDENT -> /{@|[A-Za-z_\.]\w*};
23
+ INT -> /{\d+};
20
24
STR -> /{ " (?: \\. | [^\\"] )* "
21
25
| ' (?: \\. | [^\\'] )* '
22
26
| ‵ (?: ‵‵ | [^‵] )* ‵
23
27
};
24
- INT -> /{\d+};
25
28
RE -> /{
26
29
/{
27
30
((?:
@@ -32,10 +35,7 @@ RE -> /{
32
35
)*)
33
36
\}
34
37
};
35
- REF -> "\\" IDENT;
36
- COMMENT -> /{ //.*$
37
- | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
38
- };
38
+ REF -> "\\" IDENT;
39
39
40
40
// Special
41
41
.wrapRE -> /{\s*()\s*};
You can’t perform that action at this time.
0 commit comments