summaryrefslogtreecommitdiff
path: root/Thue
diff options
context:
space:
mode:
authorJed Barber <jjbarber@y7mail.com>2014-02-07 03:57:38 +1100
committerJed Barber <jjbarber@y7mail.com>2014-02-07 03:57:38 +1100
commit29ec75e72f7b0c71442d9cd22d387ad0726bdd04 (patch)
treea25b30d76bdf4ae7d05248d1ea4ba01c5122768d /Thue
parentad324af3fa36961bf04361056fee6c2aff81a0a5 (diff)
Moved Thue parser into its own module
Diffstat (limited to 'Thue')
-rw-r--r--Thue/Parser.hs79
1 files changed, 79 insertions, 0 deletions
diff --git a/Thue/Parser.hs b/Thue/Parser.hs
new file mode 100644
index 0000000..dd40e23
--- /dev/null
+++ b/Thue/Parser.hs
@@ -0,0 +1,79 @@
+module Parser (
+ ThueProgram(..),
+ Rule(..),
+ State,
+
+ parseThue
+ ) where
+
+import Text.ParserCombinators.Parsec
+
+
+
+data ThueProgram = ThueProgram { thueRules :: [Rule]
+ , thueInitialState :: State }
+ deriving (Show)
+
+
+data Rule = Rule { original :: State
+ , replacement :: State }
+ deriving (Show)
+
+
+type State = String
+
+
+
+
+parseThue :: String -> Either ParseError ThueProgram
+parseThue = parse thue "error"
+
+
+
+
+thue = do
+ rs <- many rule
+ separatorLine
+ i <- initialState
+ eof
+ return (ThueProgram rs i)
+
+
+rule = do
+ o <- ruleState
+ separator
+ r <- state
+ eol
+ return (Rule o r)
+
+
+separatorLine = whiteSpace >> separator >> whiteSpace >> eol
+separator = string "::="
+
+
+initialState = do
+ s <- state `sepEndBy` eol
+ return (concat s)
+
+
+ruleState = many ruleStateChar
+
+
+ruleStateChar = noneOf "\n\r:"
+ <|> try (do { char ':'; notFollowedBy (string ":="); return ':'})
+
+
+state = many stateChar
+
+
+stateChar = noneOf "\n\r"
+
+
+whiteSpace = many (oneOf "\t ")
+
+
+eol = try (string "\r\n")
+ <|> try (string "\n\r")
+ <|> try (string "\r")
+ <|> try (string "\n")
+