// 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 Scanner "scanner"


func Scan1(filename, src string) {
	S := new(Scanner.Scanner);
	S.Open(filename, src);
	for {
		tok, pos, val := S.Scan();
		print pos, ": ", Scanner.TokenName(tok);
		if tok == Scanner.IDENT || tok == Scanner.INT || tok == Scanner.FLOAT || tok == Scanner.STRING {
			print " ", val;
		}
		print "\n";
		if tok == Scanner.EOF {
			return;
		}
	}
}


func Scan2(filename, src string) {
	S := new(Scanner.Scanner);
	S.Open(filename, src);
	c := new(chan *Scanner.Token, 32);
	go S.Server(c);
	for {
		var t *Scanner.Token;
		t = <- c;
		tok, pos, val := t.tok, t.pos, t.val;
		print pos, ": ", Scanner.TokenName(tok);
		if tok == Scanner.IDENT || tok == Scanner.INT || tok == Scanner.FLOAT || tok == Scanner.STRING {
			print " ", val;
		}
		print "\n";
		if tok == Scanner.EOF {
			return;
		}
	}
}


func main() {
	for i := 1; i < sys.argc(); i++ {
		var src string;
		var ok bool;
		src, ok = sys.readfile(sys.argv(i));
		if ok {
			print "scanning (standard) " + sys.argv(i) + "\n";
			Scan1(sys.argv(i), src);
			print "\n";
			print "scanning (channels) " + sys.argv(i) + "\n";
			Scan2(sys.argv(i), src);
		} else {
			print "error: cannot read " + sys.argv(i) + "\n";
		}
		print "\n";
	}
}