git @ Cat's Eye Technologies Burro / master src / Main.hs
master

Tree @master (Download .tar.gz)

Main.hs @masterraw · history · blame

-- Copyright (c) 2020-2025, Chris Pressey, Cat's Eye Technologies.
-- This file is distributed under a 2-clause BSD license, see LICENSES/ dir.
-- SPDX-License-Identifier: LicenseRef-BSD-2-Clause-X-Burro

module Main where

import System.Environment

import Language.Burro.Definition
import qualified Language.Burro.Debugger as Debugger
import qualified Language.Kondey.Compiler as KondeyCompiler


data Flags = Flags {
    tapeChunkSize :: Int,
    tapeDisplayWidth :: Int
} deriving (Show, Ord, Eq)

defaultFlags = Flags{
    tapeChunkSize = 1,
    tapeDisplayWidth = 20
}

parseFlags flags ("--tape-chunk-size":n:rest) =
    parseFlags flags{ tapeChunkSize = read n } rest
parseFlags flags ("--tape-display-width":n:rest) =
    parseFlags flags{ tapeDisplayWidth = read n } rest
parseFlags flags other = (flags, other)


main = do
    args <- getArgs
    let (flags, args') = parseFlags defaultFlags args
    case args' of
        ["parse", fileName] -> do
            burroText <- readFile fileName
            putStrLn $ show $ parse burroText
        ["run", fileName] -> do
            burroText <- readFile fileName
            putStrLn $ show $ interpret burroText
        ["debug", fileName] -> do
            burroText <- readFile fileName
            state <- Debugger.interpret (parse burroText) (tapeChunkSize flags) (tapeDisplayWidth flags)
            putStrLn $ show $ state
        ["compile-kondey", fileName] -> do
            kondeyText <- readFile fileName
            let burroProg :: Burro = KondeyCompiler.compile kondeyText
            putStrLn $ show $ burroProg
        ["run-kondey", fileName] -> do
            kondeyText <- readFile fileName
            let burroProg :: Burro = KondeyCompiler.compile kondeyText
            putStrLn $ show $ run burroProg newstate
        ["debug-kondey", fileName] -> do
            kondeyText <- readFile fileName
            let burroProg :: Burro = KondeyCompiler.compile kondeyText
            state <- Debugger.interpret burroProg (tapeChunkSize flags) (tapeDisplayWidth flags)
            putStrLn $ show $ state
        _ -> do
            putStrLn $
              "Usage:\n" ++
              "  burro run <filename.burro>\n" ++
              "  burro debug <filename.burro>\n" ++
              "  burro compile-kondey <filename.kondey>\n" ++
              "  burro run-kondey <filename.kondey>\n" ++
              "  burro debug-kondey <filename.kondey>\n"