mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
62 lines
1.1 KiB
Go
62 lines
1.1 KiB
Go
|
|
// Copyright 2016 The Go Authors. All rights reserved.
|
||
|
|
// Use of this source code is governed by a BSD-style
|
||
|
|
// license that can be found in the LICENSE file.
|
||
|
|
|
||
|
|
package syntax
|
||
|
|
|
||
|
|
import (
|
||
|
|
"fmt"
|
||
|
|
"io"
|
||
|
|
"os"
|
||
|
|
)
|
||
|
|
|
||
|
|
type Mode uint
|
||
|
|
|
||
|
|
type ErrorHandler func(pos, line int, msg string)
|
||
|
|
|
||
|
|
// TODO(gri) These need a lot more work.
|
||
|
|
|
||
|
|
func ReadFile(filename string, errh ErrorHandler, mode Mode) (*File, error) {
|
||
|
|
src, err := os.Open(filename)
|
||
|
|
if err != nil {
|
||
|
|
return nil, err
|
||
|
|
}
|
||
|
|
defer src.Close()
|
||
|
|
return Read(src, errh, mode)
|
||
|
|
}
|
||
|
|
|
||
|
|
type bytesReader struct {
|
||
|
|
data []byte
|
||
|
|
}
|
||
|
|
|
||
|
|
func (r *bytesReader) Read(p []byte) (int, error) {
|
||
|
|
if len(r.data) > 0 {
|
||
|
|
n := copy(p, r.data)
|
||
|
|
r.data = r.data[n:]
|
||
|
|
return n, nil
|
||
|
|
}
|
||
|
|
return 0, io.EOF
|
||
|
|
}
|
||
|
|
|
||
|
|
func ReadBytes(src []byte, errh ErrorHandler, mode Mode) (*File, error) {
|
||
|
|
return Read(&bytesReader{src}, errh, mode)
|
||
|
|
}
|
||
|
|
|
||
|
|
func Read(src io.Reader, errh ErrorHandler, mode Mode) (*File, error) {
|
||
|
|
var p parser
|
||
|
|
p.init(src, errh)
|
||
|
|
|
||
|
|
p.next()
|
||
|
|
ast := p.file()
|
||
|
|
|
||
|
|
if errh == nil && p.nerrors > 0 {
|
||
|
|
return nil, fmt.Errorf("%d syntax errors", p.nerrors)
|
||
|
|
}
|
||
|
|
|
||
|
|
return ast, nil
|
||
|
|
}
|
||
|
|
|
||
|
|
func Write(w io.Writer, n *File) error {
|
||
|
|
panic("unimplemented")
|
||
|
|
}
|