summaryrefslogtreecommitdiff
path: root/src/thue.hs
diff options
context:
space:
mode:
authorJed Barber <jjbarber@y7mail.com>2014-05-07 02:06:41 +1000
committerJed Barber <jjbarber@y7mail.com>2014-05-07 02:06:41 +1000
commit1f9c9ee4864d90ddf6d726f99b5ea179f225d612 (patch)
treebbfbd67d2a23eefe1e2aef2ff5d4106ceedd35c2 /src/thue.hs
parent5044a550bdc0e50431f982d4f35ab3841f000252 (diff)
Exposed rule application order and version 2a parsing at command line
Diffstat (limited to 'src/thue.hs')
-rw-r--r--src/thue.hs42
1 files changed, 33 insertions, 9 deletions
diff --git a/src/thue.hs b/src/thue.hs
index 89afcc3..ac935a4 100644
--- a/src/thue.hs
+++ b/src/thue.hs
@@ -1,27 +1,51 @@
import System.Environment( getArgs )
+import System.Console.GetOpt
import Control.Exception( ErrorCall(..), Handler(..), catches )
import Thue.Parser
import Thue.Interpreter
+data Flag = LeftInterpret | RightInterpret | RandomInterpret | Version1 | Version2a
+ deriving (Eq)
+
+
+
+
+options :: [OptDescr Flag]
+options =
+ [ Option ['l'] ["left"] (NoArg LeftInterpret) "Apply rules in a list from left to right"
+ , Option ['r'] ["right"] (NoArg RightInterpret) "Apply rules in a list from right to left"
+ , Option ['a'] ["random"] (NoArg RandomInterpret) "Apply rules randomly"
+ , Option ['1'] ["ver1"] (NoArg Version1) "Use version 1 parser"
+ , Option ['2'] ["ver2a"] (NoArg Version2a) "Use version 2a parser, with quoted strings and escaped characters" ]
+
+
usageString :: String
-usageString = "Usage: thue <program file>"
+usageString = "Usage: thue [OPTION..] <program file>"
program :: IO ()
program = do
- args <- getArgs
- fileContents <- if (length args /= 1)
- then error usageString
- else readFile (head args)
-
- case (parseThue fileContents) of
- Left x -> putStrLn (show x)
- Right x -> (thue x) >>= (putStrLn . show)
+ args <- getArgs
+ let (actions, nonOptions, errors) = getOpt Permute options args
+
+ parse = if (Version2a `elem` actions) then parseThue2a else parseThue
+
+ order = if (LeftInterpret `elem` actions)
+ then Just First
+ else if (RightInterpret `elem` actions) then Just Last else Nothing
+
+ fileContents <- if (length nonOptions /= 1)
+ then error usageString
+ else readFile (head nonOptions)
+
+ case (parse fileContents) of
+ Left x -> putStrLn (show x)
+ Right x -> (thue x order) >>= (putStrLn . show)