pxasme/main.go

83 lines
1.2 KiB
Go

package main
import (
"errors"
"flag"
"fmt"
"io"
"os"
)
//
func main() {
srcName := flag.String("Src", "-", "Input file (default: stdin)")
destName := flag.String("Dest", "-", "Output file (default: stdout)")
flag.Parse()
var (
err error
srch io.Reader
desth io.Writer
)
if *srcName == "-" {
srch = os.Stdin
} else {
srch, err = os.OpenFile(*srcName, os.O_RDONLY, 0644)
if err != nil {
panic(err)
}
}
if *destName == "-" {
desth = os.Stdout
} else {
desth, err = os.OpenFile(*destName, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0644)
if err != nil {
panic(err)
}
}
err = assemble(srch, desth)
if err != nil {
panic(err)
}
}
func assemble(src io.Reader, dest io.Writer) error {
lx := NewLexer(src)
cc := NewCompiler()
mainloop:
for {
tok, err := lx.Next()
if err != nil {
if errors.Is(err, io.EOF) {
// Reached EOF
// Terminate compilation
break mainloop
}
// Real error
return fmt.Errorf("lexer: %w", err)
}
fmt.Printf("[line %d] %#v\n", lx.lineno, tok)
err = cc.Compile(tok)
if err != nil {
return fmt.Errorf("compile: %w", err)
}
}
err := cc.Finalize(dest)
if err != nil {
return fmt.Errorf("finalize: %w", err)
}
// Success
return nil
}