-
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
65ed758
commit d99e5d3
Showing
9 changed files
with
147 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,6 @@ | |
|
||
**New features.** | ||
|
||
*We do not have **news** now.* | ||
* Add BrainFuck Lexer | ||
|
||
For more see [CHANGELOG](CHANGELOG.md). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
module HelVM.HelCam.BrainFuck.Token where | ||
|
||
data Token = MoveR | ||
| MoveL | ||
| Inc | ||
| Dec | ||
| Output | ||
| Input | ||
| JmpPast | ||
| JmpBack | ||
deriving (Eq, Ord, Enum) | ||
|
||
type TokenList = [Token] | ||
|
||
instance Show Token where | ||
show MoveR = ">" | ||
show MoveL = "<" | ||
show Inc = "+" | ||
show Dec = "-" | ||
show Output = "." | ||
show Input = "," | ||
show JmpPast = "[" | ||
show JmpBack = "]" | ||
|
||
instance Read Token where | ||
readsPrec _ ">" = [( MoveR , "")] | ||
readsPrec _ "<" = [( MoveL , "")] | ||
readsPrec _ "+" = [( Inc , "")] | ||
readsPrec _ "-" = [( Dec , "")] | ||
readsPrec _ "." = [( Output , "")] | ||
readsPrec _ "," = [( Input , "")] | ||
readsPrec _ "[" = [( JmpPast, "")] | ||
readsPrec _ "]" = [( JmpBack, "")] | ||
readsPrec _ _ = [] | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
module HelVM.HelCam.BrainFuck.Tokens where | ||
|
||
import HelVM.HelCam.BrainFuck.Token | ||
|
||
import Data.Maybe | ||
import Text.Read | ||
|
||
newtype Tokens = Tokens TokenList | ||
|
||
-- | ||
|
||
instance Show Tokens where | ||
show (Tokens tokens) = tokens >>= show | ||
|
||
charToString :: Char -> String | ||
charToString = (:[]) | ||
|
||
instance Read Tokens where | ||
readsPrec _ text = [( Tokens $ text >>= maybeToList . readMaybe . charToString, "")] | ||
|
||
-- | ||
|
||
tokenList :: Tokens -> TokenList | ||
tokenList (Tokens tokens) = tokens | ||
|
||
readTokens :: String -> Tokens | ||
readTokens text = read text :: Tokens | ||
|
||
tokenize :: String -> TokenList | ||
tokenize = tokenList . readTokens |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
module HelVM.HelCam.BrainFuck.TokensTest where | ||
|
||
import HelVM.HelCam.BrainFuck.Tokens | ||
|
||
import Test.HUnit | ||
|
||
helloWorldWithComments :: String | ||
helloWorldWithComments = " \ | ||
\ 1 +++++ +++ Set Cell #0 to 8 \ | ||
\ 2 [ \ | ||
\ 3 >++++ Add 4 to Cell #1; this will always set Cell #1 to 4 \ | ||
\ 4 [ as the cell will be cleared by the loop \ | ||
\ 5 >++ Add 4*2 to Cell #2 \ | ||
\ 6 >+++ Add 4*3 to Cell #3 \ | ||
\ 7 >+++ Add 4*3 to Cell #4 \ | ||
\ 8 >+ Add 4 to Cell #5 \ | ||
\ 9 <<<<- Decrement the loop counter in Cell #1 \ | ||
\10 ] Loop till Cell #1 is zero \ | ||
\11 >+ Add 1 to Cell #2 \ | ||
\12 >+ Add 1 to Cell #3 \ | ||
\13 >- Subtract 1 from Cell #4 \ | ||
\14 >>+ Add 1 to Cell #6 \ | ||
\15 [<] Move back to the first zero cell you find; this will \ | ||
\16 be Cell #1 which was cleared by the previous loop \ | ||
\17 <- Decrement the loop Counter in Cell #0 \ | ||
\18 ] Loop till Cell #0 is zero \ | ||
\19 \ | ||
\20 The result of this is: \ | ||
\21 Cell No : 0 1 2 3 4 5 6 \ | ||
\22 Contents: 0 0 72 104 88 32 8 \ | ||
\23 Pointer : ^ \ | ||
\24 \ | ||
\25 >>. Cell #2 has value 72 which is 'H' \ | ||
\26 >---. Subtract 3 from Cell #3 to get 101 which is 'e' \ | ||
\27 +++++ ++..+++. Likewise for 'llo' from Cell #3 \ | ||
\28 >>. Cell #5 is 32 for the space \ | ||
\29 <-. Subtract 1 from Cell #4 for 87 to give a 'W' \ | ||
\30 <. Cell #3 was set to 'o' from the end of 'Hello' \ | ||
\31 +++.----- -.----- ---. Cell #3 for 'rl' and 'd' \ | ||
\32 >>+. Add 1 to Cell #5 gives us an exclamation point \ | ||
\33 >++. And finally a newline from Cell #6 \ | ||
\" | ||
|
||
helloWorld :: String | ||
helloWorld = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++." | ||
|
||
helloWorldAsList :: String | ||
helloWorldAsList = "[+,+,+,+,+,+,+,+,[,>,+,+,+,+,[,>,+,+,>,+,+,+,>,+,+,+,>,+,<,<,<,<,-,],>,+,>,+,>,-,>,>,+,[,<,],<,-,],>,>,.,>,-,-,-,.,+,+,+,+,+,+,+,.,.,+,+,+,.,>,>,.,<,-,.,<,.,+,+,+,.,-,-,-,-,-,-,.,-,-,-,-,-,-,-,-,.,>,>,+,.,>,+,+,.]" | ||
|
||
-------------------------------------------------------------------------------- | ||
|
||
testHelloWorld :: Test | ||
testHelloWorld = TestCase (assertEqual "testHelloWorld" helloWorld (show $ readTokens helloWorld)) | ||
|
||
testHelloWorldWithComments :: Test | ||
testHelloWorldWithComments = TestCase (assertEqual "testHelloWorldWithComments" helloWorld (show $ readTokens helloWorldWithComments)) | ||
|
||
testTokenAsList :: Test | ||
testTokenAsList = TestCase (assertEqual "testTokenAsList" helloWorldAsList (show $ tokenList $ readTokens helloWorldWithComments)) | ||
|
||
testsOfTokens :: Test | ||
testsOfTokens = TestList [ TestLabel "testHelloWorld" testHelloWorld | ||
, TestLabel "testHelloWorldWithComments" testHelloWorldWithComments | ||
, TestLabel "testTokenAsList" testTokenAsList | ||
] |