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