// 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"; } }