Skip to content

Commit 1d156cb

Browse files
committed
Non-base64 go:generate grammar file
1 parent cdf0768 commit 1d156cb

File tree

6 files changed

+50
-37
lines changed

6 files changed

+50
-37
lines changed

bootstrap/copygrammar.sh

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,11 @@
11
#!/bin/bash
22

3-
cat > wbnfgrammar.go <<EOF
3+
out=wbnfgrammar.go
4+
echo Generating $out
5+
cat > $out <<EOF
46
package bootstrap
5-
import "encoding/base64"
67
7-
//go:generate sh copygrammar.sh
8-
9-
const grammarGrammarBase64 = \`
8+
var grammarGrammarSrc = unfakeBackquote(\`
9+
$(sed 's/`/‵/g' ../examples/wbnf.txt)
10+
\`)
1011
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

bootstrap/generate.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package bootstrap
2+
3+
//go:generate sh copygrammar.sh

bootstrap/grammar.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ type Grammar map[Rule]Term
8686
var core = func() Parsers {
8787
parsers := grammarGrammar.Compile()
8888

89-
r := parser.NewScanner(grammarGrammarSrc())
89+
r := parser.NewScanner(grammarGrammarSrc)
9090
v, err := parsers.Parse(grammarR, r)
9191
if err != nil {
9292
panic(err)

bootstrap/wbnfgrammar.go

Lines changed: 38 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,42 @@
11
package bootstrap
2-
import "encoding/base64"
32

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 ")" | "(" ")";
1717
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+
};
1839
40+
// Special
41+
.wrapRE -> /{\s*()\s*};
42+
`)

examples/wbnf.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,4 @@ COMMENT -> /{ //.*$
3535
};
3636

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

examples/xml.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,4 @@ attr -> NAME "=" value=/{"[^"]*"};
66
NAME -> /{[A-Za-z_:][-A-Za-z0-9._:]*};
77
COMMENT -> /{<!--.*-->};
88

9-
.wrapRE -> /{\s*()\s*};
9+
.wrapRE -> /{\s*()\s*};

0 commit comments

Comments
 (0)