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  func (err Error) String() string { return err.Error() }
  24  
  25  var compileExportMap map[string]string
  26  
  27  type ErrorHandler func(err error)
  28  
  29  type Pragma interface{}
  30  
  31  type PragmaHandler func(pos Pos, blank bool, text string, current Pragma) Pragma
  32  
  33  func Parse(base *PosBase, src io.Reader, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) {
  34  	defer func() {
  35  		if p := recover(); p != nil {
  36  			if err, ok := p.(Error); ok {
  37  				first = err
  38  				return
  39  			}
  40  			panic(p)
  41  		}
  42  	}()
  43  
  44  	var p Parser
  45  	p.init(base, src, errh, pragh, mode)
  46  	p.Next()
  47  	return p.fileOrNil(), p.First
  48  }
  49  
  50  func ParseBytes(base *PosBase, src []byte, errh ErrorHandler, pragh PragmaHandler, mode Mode) (_ *File, first error) {
  51  	var parseFirst error
  52  	defer func() {
  53  		if p := recover(); p != nil {
  54  			if err, ok := p.(Error); ok {
  55  				parseFirst = err
  56  				first = err
  57  				return
  58  			}
  59  			panic(p)
  60  		}
  61  	}()
  62  
  63  	var p Parser
  64  	p.initBytes(base, src, errh, pragh, mode)
  65  	p.Next()
  66  	f := p.fileOrNil()
  67  	_ = parseFirst
  68  	return f, p.First
  69  }
  70  
  71  func ParseFile(filename string, errh ErrorHandler, pragh PragmaHandler, mode Mode) (*File, error) {
  72  	f, err := os.Open(filename)
  73  	if err != nil {
  74  		if errh != nil {
  75  			errh(err)
  76  		}
  77  		return nil, err
  78  	}
  79  	defer f.Close()
  80  	return Parse(NewFileBase(filename), f, errh, pragh, mode)
  81  }
  82