syntax.mx raw
1 package main
2
3 import (
4 "fmt"
5 "io"
6 "os"
7 )
8
9 type Mode uint
10
11 const (
12 CheckBranches Mode = 1 << iota
13 )
14
15 type Error struct {
16 Pos Pos
17 Msg string
18 }
19
20 func (err Error) Error() string {
21 return fmt.Sprintf("%s: %s", err.Pos, err.Msg)
22 }
23 func (err Error) String() string { return err.Error() }
24
25 var compileExportMap map[string]string
26
27 type ErrorHandler func(err error)
28
29 type Pragma interface{}
30
31 type PragmaHandler func(pos Pos, blank bool, text string, current Pragma) Pragma
32
33 func Parse(base *PosBase, src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) {
34 defer func() {
35 if p := recover(); p != nil {
36 if err, ok := p.(Error); ok {
37 first = err
38 return
39 }
40 panic(p)
41 }
42 }()
43
44 var p Parser
45 p.init(base, src, errh, pragh, mode)
46 p.Next()
47 return p.fileOrNil(), p.First
48 }
49
50 func ParseBytes(base *PosBase, src []byte, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) {
51 var parseFirst error
52 defer func() {
53 if p := recover(); p != nil {
54 if err, ok := p.(Error); ok {
55 parseFirst = err
56 first = err
57 return
58 }
59 panic(p)
60 }
61 }()
62
63 var p Parser
64 p.initBytes(base, src, errh, pragh, mode)
65 p.Next()
66 f := p.fileOrNil()
67 _ = parseFirst
68 return f, p.First
69 }
70
71 func ParseFile(filename string, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error) {
72 f, err := os.Open(filename)
73 if err != nil {
74 if errh != nil {
75 errh(err)
76 }
77 return nil, err
78 }
79 defer f.Close()
80 return Parse(NewFileBase(filename), f, errh, pragh, mode)
81 }
82