blip (empty) → 0.1.0
raw patch · 4 files changed
+210/−0 lines, 4 filesdep +basedep +bliplibdep +bytestringsetup-changed
Dependencies added: base, bliplib, bytestring, containers, filepath, language-python, mtl, old-time, parseargs, pretty
Files
- LICENSE +30/−0
- Setup.lhs +3/−0
- blip.cabal +37/−0
- src/Main.hs +140/−0
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright Bernard Pope 2012, 2013++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions are met:++ * Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++ * Redistributions in binary form must reproduce the above+ copyright notice, this list of conditions and the following+ disclaimer in the documentation and/or other materials provided+ with the distribution.++ * Neither the name of Bernard Pope nor the names of other+ contributors may be used to endorse or promote products derived+ from this software without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ Setup.lhs view
@@ -0,0 +1,3 @@+#!/usr/bin/env runhaskell+> import Distribution.Simple+> main = defaultMain
+ blip.cabal view
@@ -0,0 +1,37 @@+Name: blip +Version: 0.1.0+Synopsis: Python to bytecode compiler.+Homepage: https://github.com/bjpop/blip +License: BSD3+License-file: LICENSE+Author: Bernie Pope+Maintainer: Bernie Pope <florbitous@gmail.com>+Stability: Experimental+category: Language +Build-type: Simple+Cabal-version: >=1.8+Description:+ Compiles Python 3 source code to bytecode. The resulting+ bytecode is written to a '.pyc' file, compatible with the+ CPython implementation (the default Python interpreter).++source-repository head+ type: git+ location: git://github.com/bjpop/blip.git++Executable blip {+ ghc-options: -Wall -fno-warn-name-shadowing -fno-warn-orphans+ main-is: Main.hs+ hs-source-dirs: src+ build-depends: base==4.*,+ bliplib == 0.1.*,+ -- directory == 1.2.*,+ filepath == 1.3.*,+ parseargs == 0.1.* ,+ language-python==0.4.*,+ mtl==2.1.*,+ containers==0.5.*,+ bytestring==0.10.*,+ old-time==1.1.*,+ pretty==1.1.*+}
+ src/Main.hs view
@@ -0,0 +1,140 @@+-----------------------------------------------------------------------------+-- |+-- Module : Main+-- Copyright : (c) 2012, 2013 Bernie Pope+-- License : BSD-style+-- Maintainer : florbitous@gmail.com+-- Stability : experimental+-- Portability : ghc+--+-- The Main module of Blip. Contains the entry point of the compiler, and+-- handles command line argument parsing.+--+-----------------------------------------------------------------------------++module Main where++import System.Exit (exitFailure, exitSuccess)+import Control.Monad (when)+import System.Console.ParseArgs+ (Argtype (..), argDataOptional, Arg (..)+ , gotArg, getArg, parseArgsIO, ArgsComplete (..), Args(..))+import Blip.Version (versionString)+import Compile (compileFile)+import ProgName (progName)+import Data.Set as Set (Set, empty, singleton, union)+import Types (Dumpable (..), CompileConfig (..))++main :: IO ()+main = do+ let argDescriptions = [version, help, magicNumberArg, dumpScopeArg, dumpASTArg]+ args <- parseArgsIO (ArgsTrailing "PYTHON_FILES") argDescriptions+ when (gotArg args Help) $ do+ putStrLn $ argsUsage args+ exitSuccess+ when (gotArg args Version) $ do+ putStrLn $ progName ++ " version " ++ versionString+ exitSuccess+ let pythonFiles = argsRest args+ when (null pythonFiles) $ do+ putStrLn $ progName ++ ": no Python input files specified"+ putStrLn $ argsUsage args+ exitFailure + let magicNumber = getMagicNumber args+ dumps = getDumps args+ config = initCompileConfig + { compileConfig_magic = fromIntegral magicNumber+ , compileConfig_dumps = dumps }+ mapM_ (compileFile config) pythonFiles++data ArgIndex+ = Help+ | InputFile+ | Version+ | MagicNumber+ | Dump Dumpable+ deriving (Eq, Ord, Show)++help :: Arg ArgIndex+help =+ Arg+ { argIndex = Help+ , argAbbr = Just 'h'+ , argName = Just "help"+ , argData = Nothing+ , argDesc = "Display a help message."+ }++inputFile :: Arg ArgIndex+inputFile =+ Arg+ { argIndex = InputFile+ , argAbbr = Nothing+ , argName = Nothing+ , argData = argDataOptional "input file" ArgtypeString+ , argDesc = "Name of the input Python file."+ }++version :: Arg ArgIndex+version =+ Arg+ { argIndex = Version+ , argAbbr = Nothing+ , argName = Just "version"+ , argData = Nothing+ , argDesc = "Show the version number of " ++ progName ++ "."+ }++-- this works for CPython 3.3.0+defaultMagicNumber :: Int+defaultMagicNumber = 168627358++magicNumberArg :: Arg ArgIndex+magicNumberArg =+ Arg+ { argIndex = MagicNumber + , argAbbr = Nothing+ , argName = Just "magic"+ , argData = argDataOptional "magic number" ArgtypeInt+ , argDesc = "Magic number to include in pyc file header."+ }++dumpScopeArg :: Arg ArgIndex+dumpScopeArg =+ Arg+ { argIndex = Dump DumpScope+ , argAbbr = Nothing+ , argName = Just "dumpScope"+ , argData = Nothing+ , argDesc = "Dump the variable scope."+ }++dumpASTArg :: Arg ArgIndex+dumpASTArg =+ Arg+ { argIndex = Dump DumpAST+ , argAbbr = Nothing+ , argName = Just "dumpAST"+ , argData = Nothing+ , argDesc = "Dump the abstract syntax tree."+ }++getInputFile :: Args ArgIndex -> Maybe FilePath+getInputFile args = getArg args InputFile ++getMagicNumber :: Args ArgIndex -> Int+getMagicNumber args = + maybe defaultMagicNumber id $ getArg args MagicNumber++getDumps :: Args ArgIndex -> Set.Set Dumpable +getDumps args+ = getDump DumpScope args `Set.union` getDump DumpAST args+ where+ getDump :: Dumpable -> Args ArgIndex -> Set.Set Dumpable+ getDump dumpable args+ | gotArg args (Dump dumpable) = Set.singleton dumpable+ | otherwise = Set.empty++initCompileConfig :: CompileConfig+initCompileConfig =+ CompileConfig { compileConfig_magic = 0, compileConfig_dumps = Set.empty }