@@ -2,6 +2,7 @@ package langlang
2
2
3
3
import (
4
4
"bytes"
5
+ _ "embed"
5
6
"fmt"
6
7
"strings"
7
8
"text/template"
@@ -22,7 +23,7 @@ type GenGoOptions struct {
22
23
ParserBase string
23
24
}
24
25
25
- func GenGo (node Node , opt GenGoOptions ) (string , error ) {
26
+ func GenGo (node AstNode , opt GenGoOptions ) (string , error ) {
26
27
g := newGoCodeEmitter (opt )
27
28
g .writePrelude ()
28
29
g .visit (node )
@@ -35,116 +36,8 @@ type tmplRenderOpts struct {
35
36
ParserName string
36
37
}
37
38
38
- var prelude string = `package {{.PackageName}}
39
-
40
- // This is an autogenerated file. Check your build system and find the
41
- // grammar to edit instead of editing this file directly, unless
42
- // you're fine with changes getting erased.
43
-
44
- import (
45
- "fmt"
46
-
47
- "github.com/clarete/langlang/go"
48
- )
49
-
50
- type {{.ParserName}} struct {
51
- langlang.BaseParser
52
- captureSpaces bool
53
- predicateLevel int
54
- printTraceback bool
55
- recoveryTable map[string]langlang.ParserFn[langlang.Value]
56
- }
57
-
58
- func (p *{{.ParserName}}) SetCaptureSpaces(v bool) {
59
- p.captureSpaces = v
60
- }
61
-
62
- func (p *{{.ParserName}}) SetPrintTraceback(v bool) {
63
- p.printTraceback = v
64
- }
65
-
66
- func (p *{{.ParserName}}) parseAny() (langlang.Value, error) {
67
- start := p.Location()
68
- r, err := p.Any()
69
- if err != nil {
70
- var zero langlang.Value
71
- return zero, err
72
- }
73
- return langlang.NewValueString(string(r), langlang.NewSpan(start, p.Location())), nil
74
- }
75
-
76
- func (p *{{.ParserName}}) parseRange(left, right rune) (langlang.Value, error) {
77
- start := p.Location()
78
- r, err := p.ExpectRange(left, right)
79
- if err != nil {
80
- var zero langlang.Value
81
- return zero, err
82
- }
83
- return langlang.NewValueString(string(r), langlang.NewSpan(start, p.Location())), nil
84
- }
85
-
86
- func (p *{{.ParserName}}) parseLiteral(literal string) (langlang.Value, error) {
87
- start := p.Location()
88
- r, err := p.ExpectLiteral(literal)
89
- if err != nil {
90
- var zero langlang.Value
91
- return zero, err
92
- }
93
- return langlang.NewValueString(r, langlang.NewSpan(start, p.Location())), nil
94
- }
95
-
96
- func (p *{{.ParserName}}) parseSpacing() (langlang.Value, error) {
97
- start := p.Location()
98
- v, err := langlang.ZeroOrMore(p, func(p langlang.Parser) (rune, error) {
99
- return langlang.ChoiceRune(p, []rune{' ', '\t', '\r', '\n'})
100
- })
101
- if err != nil {
102
- return nil, err
103
- }
104
- if !p.captureSpaces {
105
- return nil, nil
106
- }
107
- r := string(v)
108
- if len(r) == 0 {
109
- return nil, nil
110
- }
111
- s := langlang.NewValueString(r, langlang.NewSpan(start, p.Location()))
112
- return langlang.NewValueNode("Spacing", s, langlang.NewSpan(start, p.Location())), nil
113
- }
114
-
115
- func (p *{{.ParserName}}) ParseEOF() (langlang.Value, error) {
116
- return (func(p langlang.Parser) (langlang.Value, error) {
117
- var (
118
- start = p.Location()
119
- items []langlang.Value
120
- item langlang.Value
121
- err error
122
- )
123
- item, err = langlang.Not(p, func(p langlang.Parser) (langlang.Value, error) {
124
- return p.(*{{.ParserName}}).parseAny()
125
- })
126
- if err != nil {
127
- return nil, err
128
- }
129
- if item != nil {
130
- items = append(items, item)
131
- }
132
- return p.(*{{.ParserName}}).wrapSeq(items, langlang.NewSpan(start, p.Location())), nil
133
- }(p))
134
- }
135
-
136
- func (p *{{.ParserName}}) wrapSeq(items []langlang.Value, span langlang.Span) langlang.Value {
137
- switch len(items) {
138
- case 0:
139
- return nil
140
- case 1:
141
- return items[0]
142
- default:
143
- return langlang.NewValueSequence(items, span)
144
- }
145
- }
146
-
147
- `
39
+ //go:embed prelude.go.in
40
+ var goPrelude string
148
41
149
42
func newGoCodeEmitter (opt GenGoOptions ) * goCodeEmitter {
150
43
return & goCodeEmitter {
@@ -155,7 +48,7 @@ func newGoCodeEmitter(opt GenGoOptions) *goCodeEmitter {
155
48
}
156
49
}
157
50
158
- func (g * goCodeEmitter ) visit (node Node ) {
51
+ func (g * goCodeEmitter ) visit (node AstNode ) {
159
52
switch n := node .(type ) {
160
53
case * GrammarNode :
161
54
g .visitGrammarNode (n )
@@ -240,7 +133,7 @@ func (g *goCodeEmitter) visitDefinitionNode(n *DefinitionNode) {
240
133
g .parser .indent ()
241
134
242
135
g .parser .writei (fmt .Sprintf ("\" %s\" ,\n " , n .Name ))
243
- g .parser .writei (fmt .Sprintf ("langlang.NewValueNode (\" %s\" , item, langlang.NewSpan(start, p.Location())),\n " , n .Name ))
136
+ g .parser .writei (fmt .Sprintf ("langlang.NewNode (\" %s\" , item, langlang.NewSpan(start, p.Location())),\n " , n .Name ))
244
137
245
138
g .parser .unindent ()
246
139
g .parser .writei (")\n " )
@@ -515,7 +408,7 @@ func (g *goCodeEmitter) visitAnyNode() {
515
408
// Utilities to write data into the output buffer
516
409
517
410
func (g * goCodeEmitter ) writePrelude () {
518
- g .parser .write (prelude )
411
+ g .parser .write (goPrelude )
519
412
}
520
413
521
414
func (g * goCodeEmitter ) writeConstructor () {
@@ -541,7 +434,7 @@ func (g *goCodeEmitter) writeConstructor() {
541
434
g .parser .writei ("item, err := p.(*{{.ParserName}})" )
542
435
fmt .Fprintf (g .parser .buffer , ".Parse%s()\n " , label )
543
436
g .writeIfErr ()
544
- g .parser .writei ("return langlang.NewValueError " )
437
+ g .parser .writei ("return langlang.NewError " )
545
438
fmt .Fprintf (g .parser .buffer , "(\" %s\" , item, langlang.NewSpan(start, p.Location())), nil\n " , label )
546
439
547
440
g .parser .unindent ()
@@ -568,12 +461,12 @@ func (g *goCodeEmitter) writeSeqOrNode() {
568
461
569
462
g .parser .writei ("default:\n " )
570
463
g .parser .indent ()
571
- g .parser .writei ("return langlang.NewValueSequence (items, langlang.NewSpan(start, p.Location())), nil\n " )
464
+ g .parser .writei ("return langlang.NewSequence (items, langlang.NewSpan(start, p.Location())), nil\n " )
572
465
g .parser .unindent ()
573
466
g .parser .writei ("}\n " )
574
467
}
575
468
576
- func (g * goCodeEmitter ) writeExprFn (expr Node ) {
469
+ func (g * goCodeEmitter ) writeExprFn (expr AstNode ) {
577
470
g .parser .writei ("func(p langlang.Parser) (langlang.Value, error) {\n " )
578
471
g .parser .indent ()
579
472
0 commit comments