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