From 281425310c5db21f87981eeb9601a71d1974d98d Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Thu, 10 Apr 2014 05:25:03 +1000 Subject: Rearranging files --- src/Thue/Parser.hs | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/Thue/Parser.hs (limited to 'src/Thue/Parser.hs') diff --git a/src/Thue/Parser.hs b/src/Thue/Parser.hs new file mode 100644 index 0000000..2ee41ae --- /dev/null +++ b/src/Thue/Parser.hs @@ -0,0 +1,84 @@ +module Thue.Parser ( + ThueProgram(..), + ThueRule(..), + ThueState, + + parseThue + ) where + +import Control.Applicative( some ) +import Text.ParserCombinators.Parsec + + + +data ThueProgram = ThueProgram { thueRules :: [ThueRule] + , thueInitialState :: ThueState } + deriving (Show, Eq) + + +data ThueRule = ThueRule { original :: ThueState + , replacement :: ThueState } + deriving (Show, Eq) + + +type ThueState = 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 (ThueRule o r) + + +separatorLine = whiteSpace >> separator >> whiteSpace >> eol +separator = string "::=" + "rule separator" + + +initialState = do + s <- state `sepEndBy` eol + return (concat s) + + +ruleState = some ruleStateChar + + +ruleStateChar = noneOf "\n\r:" + <|> try (char ':' >> notFollowedBy (string ":=") >> return ':') + "state character" + + +state = many stateChar + + +stateChar = noneOf "\n\r" + "state character" + + +whiteSpace = many (oneOf "\t ") + + +eol = try (string "\r\n") + <|> try (string "\n\r") + <|> try (string "\r") + <|> try (string "\n") + "end of line" + -- cgit