package main import ( "fmt" "io" "os" ) type Mode uint const ( CheckBranches Mode = 1 << iota ) type Error struct { Pos Pos Msg string } func (err Error) Error() string { return fmt.Sprintf("%s: %s", err.Pos, err.Msg) } var _ error = Error{} type ErrorHandler func(err error) type Pragma interface{} type PragmaHandler func(pos Pos, blank bool, text string, current Pragma) Pragma func Parse(base *PosBase, src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) { defer func() { if p := recover(); p != nil { if err, ok := p.(Error); ok { first = err return } panic(p) } }() var p Parser p.init(base, src, errh, pragh, mode) p.Next() return p.fileOrNil(), p.First } func ParseFile(filename string, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error) { f, err := os.Open(filename) if err != nil { if errh != nil { errh(err) } return nil, err } defer f.Close() return Parse(NewFileBase(filename), f, errh, pragh, mode) }