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