From ae80ac87298597e93a912887109ee16cd9bdb718 Mon Sep 17 00:00:00 2001 From: Ramon Asuncion Date: Sun, 19 Oct 2025 00:42:16 -0400 Subject: [PATCH 1/4] Implement instruction --- src/Parser.hs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/Parser.hs 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 "?" From c20c38350476b53d01e6ff58a1ec9a81bb6bf591 Mon Sep 17 00:00:00 2001 From: Ramon Asuncion Date: Sun, 19 Oct 2025 00:42:30 -0400 Subject: [PATCH 2/4] Update depends --- amnesia.cabal | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 From 71d160f536eebbe445250f4094a14cc19eb7e8f5 Mon Sep 17 00:00:00 2001 From: Ramon Asuncion Date: Sun, 19 Oct 2025 00:42:44 -0400 Subject: [PATCH 3/4] Remove Instr from Amnesia.hs --- src/Amnesia.hs | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) 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 From 7fe497d7f12f0c8a23f216959db63c37dd55dfb7 Mon Sep 17 00:00:00 2001 From: Ramon Asuncion Date: Sun, 19 Oct 2025 00:42:58 -0400 Subject: [PATCH 4/4] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) 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)