// Copyright 2009 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 main

import (
	"bytes";
	"ebnf";
	"flag";
	"fmt";
	"go/scanner";
	"io";
	"os";
	"path";
	"strings";
)


var start = flag.String("start", "Start", "name of start production");


func usage() {
	fmt.Fprintf(os.Stderr, "usage: ebnflint [flags] [filename]\n");
	flag.PrintDefaults();
	os.Exit(1);
}


// Markers around EBNF sections in .html files
var (
	open = strings.Bytes(`<pre class="ebnf">`);
	close = strings.Bytes(`</pre>`);
)


func extractEBNF(src []byte) []byte {
	var buf bytes.Buffer;

	for {
		// i = beginning of EBNF text
		i := bytes.Index(src, open);
		if i < 0 {
			break;  // no EBNF found - we are done
		}
		i += len(open);

		// write as many newlines as found in the excluded text
		// to maintain correct line numbers in error messages
		for _, ch := range src[0 : i] {
			if ch == '\n' {
				buf.WriteByte('\n');
			}
		}

		// j = end of EBNF text (or end of source)
		j := bytes.Index(src[i : len(src)], close);  // close marker
		if j < 0 {
			j = len(src)-i;
		}
		j += i;

		// copy EBNF text
		buf.Write(src[i : j]);

		// advance
		src = src[j : len(src)];
	}

	return buf.Bytes();
}


func main() {
	flag.Parse();

	var filename string;
	switch flag.NArg() {
	case 0:
		filename = "/dev/stdin";
	case 1:
		filename = flag.Arg(0);
	default:
		usage();
	}

	src, err := io.ReadFile(filename);
	if err != nil {
		scanner.PrintError(os.Stderr, err);
	}

	if path.Ext(filename) == ".html" {
		src = extractEBNF(src);
	}

	grammar, err := ebnf.Parse(filename, src);
	if err != nil {
		scanner.PrintError(os.Stderr, err);
	}

	if err = ebnf.Verify(grammar, *start); err != nil {
		scanner.PrintError(os.Stderr, err);
	}
}
