Skip to content

Commit 3d276ae

Browse files
committed
go[BREAKING CHANGE]: Overhaul naming of all the node types
This is in preparation for bootstrapping the go parser from the grammar. The first rename was in the `values.go` module. The `Value` prefix was stripped from {Value}String, {Value}Sequence, {Value}Node, and {Value}Error. The idea is to bolt this module into the final parser. The above rename caused a collision between the `Node` interface in the `grammar_ast.go` module. Then this interface was renamed to `AstNode`. A mostly no-op change for now is that the prelude in go was split up in its own file `prelude.go.in`.
1 parent 9100e46 commit 3d276ae

File tree

8 files changed

+224
-222
lines changed

8 files changed

+224
-222
lines changed

go/base_parser.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type BaseParser struct {
2525
predStkCnt int
2626
labelMsgs map[string]string
2727
stacktrace []TracerSpan
28-
actionFns map[string]func(*ValueNode) (Value, error)
28+
actionFns map[string]func(*Node) (Value, error)
2929
}
3030

3131
// Location returns in which line/column/cursor the parser's input is currently in
@@ -72,14 +72,14 @@ func (p *BaseParser) SetLabelMessages(m map[string]string) {
7272
p.labelMsgs = m
7373
}
7474

75-
func (p *BaseParser) SetAction(name string, fn func(*ValueNode) (Value, error)) {
75+
func (p *BaseParser) SetAction(name string, fn func(*Node) (Value, error)) {
7676
if p.actionFns == nil {
77-
p.actionFns = map[string]func(*ValueNode) (Value, error){}
77+
p.actionFns = map[string]func(*Node) (Value, error){}
7878
}
7979
p.actionFns[name] = fn
8080
}
8181

82-
func (p *BaseParser) RunAction(name string, node *ValueNode) (Value, error) {
82+
func (p *BaseParser) RunAction(name string, node *Node) (Value, error) {
8383
action, ok := p.actionFns[name]
8484
if !ok {
8585
return node, nil
@@ -193,7 +193,7 @@ func (p *BaseParser) NewError(exp, msg string, span Span) error {
193193
Expected: exp,
194194
Message: msg,
195195
// ErrSpan: errSpan,
196-
Span: span,
196+
Span: span,
197197
}
198198
return e
199199
}

go/gen_go.go

Lines changed: 10 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package langlang
22

33
import (
44
"bytes"
5+
_ "embed"
56
"fmt"
67
"strings"
78
"text/template"
@@ -22,7 +23,7 @@ type GenGoOptions struct {
2223
ParserBase string
2324
}
2425

25-
func GenGo(node Node, opt GenGoOptions) (string, error) {
26+
func GenGo(node AstNode, opt GenGoOptions) (string, error) {
2627
g := newGoCodeEmitter(opt)
2728
g.writePrelude()
2829
g.visit(node)
@@ -35,116 +36,8 @@ type tmplRenderOpts struct {
3536
ParserName string
3637
}
3738

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
14841

14942
func newGoCodeEmitter(opt GenGoOptions) *goCodeEmitter {
15043
return &goCodeEmitter{
@@ -155,7 +48,7 @@ func newGoCodeEmitter(opt GenGoOptions) *goCodeEmitter {
15548
}
15649
}
15750

158-
func (g *goCodeEmitter) visit(node Node) {
51+
func (g *goCodeEmitter) visit(node AstNode) {
15952
switch n := node.(type) {
16053
case *GrammarNode:
16154
g.visitGrammarNode(n)
@@ -240,7 +133,7 @@ func (g *goCodeEmitter) visitDefinitionNode(n *DefinitionNode) {
240133
g.parser.indent()
241134

242135
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))
244137

245138
g.parser.unindent()
246139
g.parser.writei(")\n")
@@ -515,7 +408,7 @@ func (g *goCodeEmitter) visitAnyNode() {
515408
// Utilities to write data into the output buffer
516409

517410
func (g *goCodeEmitter) writePrelude() {
518-
g.parser.write(prelude)
411+
g.parser.write(goPrelude)
519412
}
520413

521414
func (g *goCodeEmitter) writeConstructor() {
@@ -541,7 +434,7 @@ func (g *goCodeEmitter) writeConstructor() {
541434
g.parser.writei("item, err := p.(*{{.ParserName}})")
542435
fmt.Fprintf(g.parser.buffer, ".Parse%s()\n", label)
543436
g.writeIfErr()
544-
g.parser.writei("return langlang.NewValueError")
437+
g.parser.writei("return langlang.NewError")
545438
fmt.Fprintf(g.parser.buffer, "(\"%s\", item, langlang.NewSpan(start, p.Location())), nil\n", label)
546439

547440
g.parser.unindent()
@@ -568,12 +461,12 @@ func (g *goCodeEmitter) writeSeqOrNode() {
568461

569462
g.parser.writei("default:\n")
570463
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")
572465
g.parser.unindent()
573466
g.parser.writei("}\n")
574467
}
575468

576-
func (g *goCodeEmitter) writeExprFn(expr Node) {
469+
func (g *goCodeEmitter) writeExprFn(expr AstNode) {
577470
g.parser.writei("func(p langlang.Parser) (langlang.Value, error) {\n")
578471
g.parser.indent()
579472

0 commit comments

Comments
 (0)