File tree Expand file tree Collapse file tree 6 files changed +50
-37
lines changed Expand file tree Collapse file tree 6 files changed +50
-37
lines changed Original file line number Diff line number Diff line change 1
1
#! /bin/bash
2
2
3
- cat > wbnfgrammar.go << EOF
3
+ out=wbnfgrammar.go
4
+ echo Generating $out
5
+ cat > $out << EOF
4
6
package bootstrap
5
- import "encoding/base64"
6
7
7
- //go:generate sh copygrammar.sh
8
-
9
- const grammarGrammarBase64 = \`
8
+ var grammarGrammarSrc = unfakeBackquote( \`
9
+ $( sed ' s/`/‵/g ' ../examples/wbnf.txt )
10
+ \` )
10
11
EOF
11
- base64 ../examples/wbnf.txt >> wbnfgrammar.go
12
-
13
- cat >> wbnfgrammar.go << EOF
14
- \`
15
-
16
- func grammarGrammarSrc() string {
17
- text, err := base64.StdEncoding.DecodeString(grammarGrammarBase64)
18
- if err != nil {
19
- panic(err)
20
- }
21
- return string(text)
22
- }
23
-
24
-
25
- EOF
Original file line number Diff line number Diff line change
1
+ package bootstrap
2
+
3
+ //go:generate sh copygrammar.sh
Original file line number Diff line number Diff line change @@ -86,7 +86,7 @@ type Grammar map[Rule]Term
86
86
var core = func () Parsers {
87
87
parsers := grammarGrammar .Compile ()
88
88
89
- r := parser .NewScanner (grammarGrammarSrc () )
89
+ r := parser .NewScanner (grammarGrammarSrc )
90
90
v , err := parsers .Parse (grammarR , r )
91
91
if err != nil {
92
92
panic (err )
Original file line number Diff line number Diff line change 1
1
package bootstrap
2
- import "encoding/base64"
3
2
4
- //go:generate sh copygrammar.sh
5
-
6
- const grammarGrammarBase64 = `
7
- Ly8gTm9uLXRlcm1pbmFscwpncmFtbWFyIC0+IHN0bXQrOwpzdG10ICAgIC0+IENPTU1FTlQgfCBwcm9kOwpwcm9kICAgIC0+IElERU5UICItPiIgdGVybSsgIjsiOwp0ZXJtICAgIC0+IEA6b3A9Il4iCiAgICAgICAgIF4gQDpvcD0ifCIKICAgICAgICAgXiBAKwogICAgICAgICBeIG5hbWVkIHF1YW50KjsKbmFtZWQgICAtPiAoSURFTlQgb3A9Ij0iKT8gYXRvbTsKcXVhbnQgICAtPiBvcD0ve1s/KitdfQogICAgICAgICB8ICJ7IiBtaW49SU5UPyAiLCIgbWF4PUlOVD8gIn0iCiAgICAgICAgIHwgb3A9L3s8Onw6Pj99IG9wdF9sZWFkaW5nPSIsIj8gbmFtZWQgb3B0X3RyYWlsaW5nPSIsIj87CmF0b20gICAgLT4gSURFTlQgfCBTVFIgfCBSRSB8IFJFRiB8ICIoIiB0ZXJtICIpIiB8ICIoIiAiKSI7CgovLyBUZXJtaW5hbHMKSURFTlQgICAtPiAve0B8W0EtWmEtel9cLl1cdyp9OwpTVFIgICAgIC0+IC97ICIgKD86IFxcLiB8IFteXFwiXSApKiAiCiAgICAgICAgICAgIHwgJyAoPzogXFwuIHwgW15cXCddICkqICcKICAgICAgICAgICAgfCBgICg/OiBgYCAgfCBbXmBdICAgKSogYAogICAgICAgICAgICB9OwpJTlQgICAgIC0+IC97XGQrfTsKUkUgICAgICAtPiAvewogICAgICAgICAgICAgL3sKICAgICAgICAgICAgICAgKCg/OgogICAgICAgICAgICAgICAgIFxcLgogICAgICAgICAgICAgICAgIHwgeyAoPzogKD86IFxkKyg/OixcZCopPyB8ICxcZCsgKSBcfSApPwogICAgICAgICAgICAgICAgIHwgXFsgKD86IFxcXSB8IFteXF1dICkrIF0KICAgICAgICAgICAgICAgICB8IFteXFx7XH1dCiAgICAgICAgICAgICAgICkqKQogICAgICAgICAgICAgXH0KICAgICAgICAgICB9OwpSRUYJCS0+ICJcXCIgSURFTlQ7CkNPTU1FTlQgLT4gL3sgLy8uKiQKICAgICAgICAgICAgfCAoP3M6IC9cKiAoPzogW14qXSB8IFwqK1teKi9dICkgXCovICkKICAgICAgICAgICAgfTsKCi8vIFNwZWNpYWwKLndyYXBSRSAtPiAve1xzKigpXHMqfTs=
8
- `
9
-
10
- func grammarGrammarSrc () string {
11
- text , err := base64 .StdEncoding .DecodeString (grammarGrammarBase64 )
12
- if err != nil {
13
- panic (err )
14
- }
15
- return string (text )
16
- }
3
+ var grammarGrammarSrc = unfakeBackquote (`
4
+ // Non-terminals
5
+ grammar -> stmt+;
6
+ stmt -> COMMENT | prod;
7
+ prod -> IDENT "->" term+ ";";
8
+ term -> @:op="^"
9
+ ^ @:op="|"
10
+ ^ @+
11
+ ^ named quant*;
12
+ named -> (IDENT op="=")? atom;
13
+ quant -> op=/{[?*+]}
14
+ | "{" min=INT? "," max=INT? "}"
15
+ | op=/{<:|:>?} opt_leading=","? named opt_trailing=","?;
16
+ atom -> IDENT | STR | RE | REF | "(" term ")" | "(" ")";
17
17
18
+ // Terminals
19
+ IDENT -> /{@|[A-Za-z_\.]\w*};
20
+ STR -> /{ " (?: \\. | [^\\"] )* "
21
+ | ' (?: \\. | [^\\'] )* '
22
+ | ‵ (?: ‵‵ | [^‵] )* ‵
23
+ };
24
+ INT -> /{\d+};
25
+ RE -> /{
26
+ /{
27
+ ((?:
28
+ \\.
29
+ | { (?: (?: \d+(?:,\d*)? | ,\d+ ) \} )?
30
+ | \[ (?: \\] | [^\]] )+ ]
31
+ | [^\\{\}]
32
+ )*)
33
+ \}
34
+ };
35
+ REF -> "\\" IDENT;
36
+ COMMENT -> /{ //.*$
37
+ | (?s: /\* (?: [^*] | \*+[^*/] ) \*/ )
38
+ };
18
39
40
+ // Special
41
+ .wrapRE -> /{\s*()\s*};
42
+ ` )
Original file line number Diff line number Diff line change @@ -35,4 +35,4 @@ COMMENT -> /{ //.*$
35
35
};
36
36
37
37
// Special
38
- .wrapRE -> /{\s*()\s*};
38
+ .wrapRE -> /{\s*()\s*};
Original file line number Diff line number Diff line change @@ -6,4 +6,4 @@ attr -> NAME "=" value=/{"[^"]*"};
6
6
NAME -> /{[A-Za-z_:][-A-Za-z0-9._:]*};
7
7
COMMENT -> /{<!--.*-->};
8
8
9
- .wrapRE -> /{\s*()\s*};
9
+ .wrapRE -> /{\s*()\s*};
You can’t perform that action at this time.
0 commit comments