summaryrefslogtreecommitdiff
path: root/Thue/Parser.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Thue/Parser.hs')
-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")
+