tt/main.go
2025-01-30 11:09:44 +01:00

68 lines
1.5 KiB
Go

package main
import (
"flag"
"fmt"
"log"
"os"
"path/filepath"
"strings"
"robaertschi.xyz/robaertschi/tt/asm"
"robaertschi.xyz/robaertschi/tt/build"
"robaertschi.xyz/robaertschi/tt/term"
)
func main() {
err := term.EnterRawMode()
if err != nil {
fmt.Printf("could not enter raw mode %v", err)
return
}
defer term.LeaveRawMode()
flag.Usage = func() {
fmt.Fprintf(flag.CommandLine.Output(), "Usage of %s [flags] input\nPossible flags:\n", os.Args[0])
flag.PrintDefaults()
}
var output string
flag.StringVar(&output, "o", "", "Output a executable named `file`")
flag.StringVar(&output, "output", "", "Output a executable named `file`")
emitAsmOnly := flag.Bool("S", false, "Only emit the asembly file and exit")
printAst := flag.Bool("ast", false, "Print the AST out to stdout")
printTAst := flag.Bool("tast", false, "Print the typed AST out to stdout")
printIr := flag.Bool("ttir", false, "Print the TTIR out to stdout")
flag.Parse()
input := flag.Arg(0)
if input == "" {
flag.Usage()
term.Exit(1)
}
if output == "" {
output = strings.TrimSuffix(input, filepath.Ext(input))
}
var toPrint build.ToPrintFlags
if *printAst {
toPrint |= build.PrintAst
}
if *printTAst {
toPrint |= build.PrintTAst
}
if *printIr {
toPrint |= build.PrintIr
}
logger := log.New(os.Stderr, "", log.Lshortfile)
err = build.NewSourceProgram(input, output).Build(asm.Fasm, *emitAsmOnly, build.ToPrintFlags(toPrint))
if err != nil {
logger.Fatalln(err)
term.Exit(1)
}
}