fspl/cmd/fsplc/main.go

80 lines
1.9 KiB
Go

package main
import "os"
import "io"
import "path/filepath"
import "git.tebibyte.media/fspl/fspl/cli"
import "git.tebibyte.media/fspl/fspl/entity"
import "git.tebibyte.media/fspl/fspl/compiler"
import ferrors "git.tebibyte.media/fspl/fspl/errors"
func main () {
// instantiate the compiler
// FIXME: perhaps we want different paths on Windows?
comp := new(compiler.Compiler)
comp.Writer = os.Stderr
comp.Resolver = compiler.NewResolver (
"/usr/local/src/fspl",
"/usr/src/fspl",
"/usr/local/incude/fspl",
"/usr/include/fspl")
homeDir, err := os.UserHomeDir()
if err != nil {
comp.Errorln(err)
os.Exit(2)
}
comp.Resolver.AddPathFront (
filepath.Join(homeDir, ".local/src/fspl"),
filepath.Join(homeDir, ".local/include/fspl"))
// take in CLI flags
debug := cli.NewFlag (
0, "debug",
"Print extra debug information while compiling")
quiet := cli.NewFlag (
'q', "quiet",
"Don't print warnings, errors, etc.")
format := cli.NewInputFlag (
'm', "format",
"Output format (.s, .o, .ll)", "",
cli.NewValSet(".s", ".o", ".ll"))
output := cli.NewInputFlag (
'o', "output",
"Output filename", "",
cli.ValString)
optimization := cli.NewInputFlag (
'O', "optimization",
"Optimization level (0-3)", "0",
cli.NewValSet("0", "1", "2", "3"))
application := cli.New (
"Compile FSPL source files",
cli.NewHelp(),
debug,
quiet,
format,
output,
optimization)
application.Syntax = "[OPTION]... ADDRESS"
application.ParseOrExit(os.Args)
if len(application.Args) != 1 {
comp.Errorln("please specify one unit address")
application.Usage()
os.Exit(2)
}
// configure the compiler based on user input
comp.Output = output.Value
comp.Optimization = optimization.Value
comp.Format = format.Value
comp.Debug = debug.Value != ""
if quiet.Value != "" { comp.Writer = io.Discard }
err = comp.CompileUnit(entity.Address(application.Args[0]))
if err != nil {
comp.Errorln(ferrors.Format(err))
os.Exit(1)
}
}