diff --git a/README.md b/README.md index ffd2d28..15d02f0 100644 --- a/README.md +++ b/README.md @@ -22,3 +22,4 @@ cabal run amnesia -- I highly recommend watching: - [Haskell for Imperative Programmers](https://www.youtube.com/watch?v=Vgu82wiiZ90&list=PLe7Ei6viL6jGp1Rfu0dil1JH1SHk9bgDV&index=1) +- [Megaparsec tutorial](https://markkarpov.com/tutorial/megaparsec.html) diff --git a/amnesia.cabal b/amnesia.cabal index ad95b5c..57b0c12 100644 --- a/amnesia.cabal +++ b/amnesia.cabal @@ -12,6 +12,8 @@ common warnings executable amnesia import: warnings main-is: Amnesia.hs - build-depends: base ^>=4.18.3.0 + build-depends: + base ^>=4.18.3.0, + megaparsec, hs-source-dirs: src default-language: GHC2021 diff --git a/src/Amnesia.hs b/src/Amnesia.hs index 6873781..e01d38a 100644 --- a/src/Amnesia.hs +++ b/src/Amnesia.hs @@ -2,22 +2,7 @@ module Main where import System.Environment (getArgs) import Stacks - -data Instr - = ChoA -- select stack A - | ChoB -- select stack B - | ChoC -- select stack C - | Set Int -- set selected stack to specific value - | Add -- A = A + B - | Sub -- A = A - B - | Mul -- A = A * B - | Div -- A = A / B - | Mod -- A = A % B - | Nm -- non-zero check - | Disp -- print top of stack - | Open -- ":" open bracket - | Close -- ";" close bracket - deriving(Show, Eq) +import Parser main :: IO () main = do diff --git a/src/Parser.hs b/src/Parser.hs new file mode 100644 index 0000000..b04f0f5 --- /dev/null +++ b/src/Parser.hs @@ -0,0 +1,36 @@ +module Parser + ( Instr(..) + -- , parseProgram + , cho -- fixme: for testing + ) where + +import Stacks (S(..)) +import Text.Megaparsec +import Text.Megaparsec.Char +import Data.Void + +data Instr + = Cho S -- choose stack A/B/C + | Set -- = + | Add -- + + | Sub -- - + | Mul -- * + | Div -- / + | Mod -- % + | Disp -- disp + | Nm -- conditional check + | Open -- ':' + | Close -- ';' + deriving(Show, Eq) + +type Parser = Parsec Void String + +cho :: Parser Instr +cho = do + _ <- string "cho" + s <- satisfy (`elem` "ABC") + return $ case s of + 'A' -> Cho A + 'B' -> Cho B + 'C' -> Cho C + _ -> error "?"