| // 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 Compilation |
| |
| import Globals "globals" |
| import Object "object" |
| import Type "type" |
| import Universe "universe" |
| import Scanner "scanner" |
| import AST "ast" |
| import Parser "parser" |
| import Export "export" |
| |
| |
| func BaseName(s string) string { |
| // TODO this is not correct for non-ASCII strings! |
| i := len(s) - 1; |
| for i >= 0 && s[i] != '/' { |
| if s[i] > 128 { |
| panic "non-ASCII string" |
| } |
| i--; |
| } |
| return s[i + 1 : len(s)]; |
| } |
| |
| |
| func FixExt(s string) string { |
| i := len(s) - 3; // 3 == len(".go"); |
| if s[i : len(s)] == ".go" { |
| s = s[0 : i]; |
| } |
| return s + ".7"; |
| } |
| |
| |
| export Compile |
| func Compile(file_name string, verbose int) { |
| src, ok := sys.readfile(file_name); |
| if !ok { |
| print "cannot open ", file_name, "\n" |
| return; |
| } |
| |
| Universe.Init(); // TODO eventually this should be only needed once |
| |
| comp := Globals.NewCompilation(); |
| pkg := Globals.NewPackage(file_name); |
| comp.Insert(pkg); |
| if comp.npkgs != 1 { |
| panic "should have exactly one package now"; |
| } |
| |
| scanner := new(Scanner.Scanner); |
| scanner.Open(file_name, src); |
| |
| parser := new(Parser.Parser); |
| parser.Open(comp, scanner, verbose); |
| |
| print "parsing ", file_name, "\n"; |
| parser.ParseProgram(); |
| if parser.S.nerrors > 0 { |
| return; |
| } |
| |
| // export |
| /* |
| exp := new(Export.Exporter); |
| exp.Export(comp, FixExt(BaseName(file_name))); |
| */ |
| } |