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
24 type ErrorHandler func(err error)
25
26 type Pragma interface{}
27
28 type PragmaHandler func(pos Pos, blank bool, text string, current Pragma) Pragma
29
30 func Parse(base *PosBase, src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) {
31 defer func() {
32 if p := recover(); p != nil {
33 if err, ok := p.(Error); ok {
34 first = err
35 return
36 }
37 panic(p)
38 }
39 }()
40
41 var p Parser
42 p.init(base, src, errh, pragh, mode)
43 p.Next()
44 return p.fileOrNil(), p.First
45 }
46
47 func ParseFile(filename string, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error) {
48 f, err := os.Open(filename)
49 if err != nil {
50 if errh != nil {
51 errh(err)
52 }
53 return nil, err
54 }
55 defer f.Close()
56 return Parse(NewFileBase(filename), f, errh, pragh, mode)
57 }
58