| // This file is dual licensed under CC0 and The gonum license. |
| // |
| // Copyright ©2017 The gonum Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| // |
| // Copyright ©2017 Robin Eklind. |
| // This file is made available under a Creative Commons CC0 1.0 |
| // Universal Public Domain Dedication. |
| |
| //go:generate ./makeinternal.bash |
| |
| // Package dot implements a parser for Graphviz DOT files. |
| package dot // import "gonum.org/v1/gonum/graph/formats/dot" |
| |
| import ( |
| "fmt" |
| "io" |
| "io/ioutil" |
| |
| "gonum.org/v1/gonum/graph/formats/dot/ast" |
| "gonum.org/v1/gonum/graph/formats/dot/internal/lexer" |
| "gonum.org/v1/gonum/graph/formats/dot/internal/parser" |
| ) |
| |
| // ParseFile parses the given Graphviz DOT file into an AST. |
| func ParseFile(path string) (*ast.File, error) { |
| buf, err := ioutil.ReadFile(path) |
| if err != nil { |
| return nil, err |
| } |
| return ParseBytes(buf) |
| } |
| |
| // Parse parses the given Graphviz DOT file into an AST, reading from r. |
| func Parse(r io.Reader) (*ast.File, error) { |
| buf, err := ioutil.ReadAll(r) |
| if err != nil { |
| return nil, err |
| } |
| return ParseBytes(buf) |
| } |
| |
| // ParseBytes parses the given Graphviz DOT file into an AST, reading from b. |
| func ParseBytes(b []byte) (*ast.File, error) { |
| l := lexer.NewLexer(b) |
| p := parser.NewParser() |
| file, err := p.Parse(l) |
| if err != nil { |
| return nil, err |
| } |
| f, ok := file.(*ast.File) |
| if !ok { |
| return nil, fmt.Errorf("invalid file type; expected *ast.File, got %T", file) |
| } |
| if err := check(f); err != nil { |
| return nil, err |
| } |
| return f, nil |
| } |
| |
| // ParseString parses the given Graphviz DOT file into an AST, reading from s. |
| func ParseString(s string) (*ast.File, error) { |
| return ParseBytes([]byte(s)) |
| } |