From 1517d38d21ae49af3dc63d5891e07255f79afa30 Mon Sep 17 00:00:00 2001 From: Denis Tereshkin Date: Sun, 19 Dec 2021 11:22:16 +0700 Subject: [PATCH] Bugfix: vmcompiler: parse numeric offset in static segment Apparently, numeric arguments to push/pop static are valid, so I prefix them with 'STATIC_' at the parsing stage --- src/Nand2Tetris/VM.hs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Nand2Tetris/VM.hs b/src/Nand2Tetris/VM.hs index 33fa744..06b24ed 100644 --- a/src/Nand2Tetris/VM.hs +++ b/src/Nand2Tetris/VM.hs @@ -129,7 +129,7 @@ parseInstruction = parseSegmentInt "this" SThis, parseSegmentInt "that" SThat, parseSegmentInt "constant" SConstant, - (string "static" *> space1) *> (SStatic <$> parseId), + (string "static" *> space1) *> (SStatic <$> (try parseId <|> parseStaticOffset)), parseSegmentInt "pointer" SPointer, parseSegmentInt "temp" STemp ] @@ -141,6 +141,10 @@ parseInstruction = hs <- many (alphaNumChar <|> char '.' <|> char '_') return $ T.pack (h : hs) + parseStaticOffset :: Parser T.Text + parseStaticOffset = do + h <- L.decimal + return $ "STATIC_" <> (T.pack . show) h parseSegmentInt :: T.Text -> (Int -> Segment) -> Parser Segment parseSegmentInt sname f = try $ do