diff options
| Commit | add56ccba064ed1012a00319834efeee222516a7 (patch) | |
|---|---|---|
| Author | 2018-11-19 08:57:03 +0200 | |
| Committer | 2018-11-19 08:57:03 +0200 | |
| Files | 2cd6d694b04451d1d0bd9d222e366844f8c4daa9 | |
| IPL-add56ccba064ed1012a00319834efeee222516a7.tar IPL-add56ccba064ed1012a00319834efeee222516a7.tar.gz IPL-add56ccba064ed1012a00319834efeee222516a7.zip | ||
| Parent | 12232668d931b0f3593807d2096a2c2f26844b0b (diff) | |
Add homework 3 - brainfsck interpreter (#55)
* Add brainfsck interpreter
* Remove unused imports in Main
* Add .gitignore
* Fix example commands
21 files changed, 800 insertions, 0 deletions
diff --git a/homework/81333/brainfsck/.gitignore b/homework/81333/brainfsck/.gitignore new file mode 100644 index 0000000..c8db66d --- /dev/null +++ b/homework/81333/brainfsck/.gitignore @@ -0,0 +1,3 @@ +.stack-work/ +brainfsck.cabal +*~
\ No newline at end of file diff --git a/homework/81333/brainfsck/ChangeLog.md b/homework/81333/brainfsck/ChangeLog.md new file mode 100644 index 0000000..76c7fe5 --- /dev/null +++ b/homework/81333/brainfsck/ChangeLog.md @@ -0,0 +1,3 @@ +# Changelog for brainfsck + +## Unreleased changes diff --git a/homework/81333/brainfsck/LICENSE b/homework/81333/brainfsck/LICENSE new file mode 100644 index 0000000..c29d4ee --- /dev/null +++ b/homework/81333/brainfsck/LICENSE @@ -0,0 +1,232 @@ +Copyright Author name here (c) 2018 + +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following + disclaimer in the documentation and/or other materials provided + with the distribution. + + * Neither the name of Author name here nor the names of other + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +======= + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/homework/81333/brainfsck/README.md b/homework/81333/brainfsck/README.md new file mode 100644 index 0000000..f9ef70c --- /dev/null +++ b/homework/81333/brainfsck/README.md @@ -0,0 +1,28 @@ +# Brainfsck interpreter + +# How to build + +Install [stack](https://docs.haskellstack.org/en/stable/README/) build tool + +Run following commands from root of project: + +Building: + +``` +stack build +``` + +Executing: + +``` +stack exec brainfsck <file_with_code> +``` + +# Examples + +Examples are in `examples/` folder. + +Best ones are: + +* `stack exec brainfsck examples/sierpinski.bf` - outputs sierpinski triangle +* `echo 0123456789 | stack exec brainfsck examples/pretty.bf` - pretty prints numbers diff --git a/homework/81333/brainfsck/Setup.hs b/homework/81333/brainfsck/Setup.hs new file mode 100644 index 0000000..9a994af --- /dev/null +++ b/homework/81333/brainfsck/Setup.hs @@ -0,0 +1,2 @@ +import Distribution.Simple +main = defaultMain diff --git a/homework/81333/brainfsck/app/Main.hs b/homework/81333/brainfsck/app/Main.hs new file mode 100644 index 0000000..a45882e --- /dev/null +++ b/homework/81333/brainfsck/app/Main.hs @@ -0,0 +1,22 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Main where + +import System.Environment (getArgs) + +import qualified Data.ByteString.Char8 as B + +import Lib (blocks) + +import Text.Brainfsck.Parser (parseText) +import Text.Brainfsck.Types + +main :: IO () +main = do + args <- getArgs + case args of + [] -> putStrLn "Usage: stack exec brainfsck-exe <file_with_code>" + _ -> do + code <- B.readFile $ args !! 0 + result <- blocks newBlocks $ parseText code + B.putStrLn $ r result diff --git a/homework/81333/brainfsck/brainfsck.cabal b/homework/81333/brainfsck/brainfsck.cabal new file mode 100644 index 0000000..45f2ba4 --- /dev/null +++ b/homework/81333/brainfsck/brainfsck.cabal @@ -0,0 +1,74 @@ +cabal-version: 1.12 + +-- This file has been generated from package.yaml by hpack version 0.31.1. +-- +-- see: https://github.com/sol/hpack +-- +-- hash: 6e461fb9377fd9d13efd7b8e322e93ae789d4e0f77c88584498db65aa15f75ea + +name: brainfsck +version: 0.1.0.0 +description: Please see the README on GitHub at <https://github.com/githubuser/brainfsck#readme> +homepage: https://github.com/githubuser/brainfsck#readme +bug-reports: https://github.com/githubuser/brainfsck/issues +author: Author name here +maintainer: example@example.com +copyright: 2018 Author name here +license: BSD3 +license-file: LICENSE +build-type: Simple +extra-source-files: + README.md + ChangeLog.md + +source-repository head + type: git + location: https://github.com/githubuser/brainfsck + +library + exposed-modules: + Lib + Text.Brainfsck.Parser + Text.Brainfsck.Types + Text.Brainfsck.Util + other-modules: + Paths_brainfsck + hs-source-dirs: + src + build-depends: + attoparsec + , base >=4.7 && <5 + , bytestring + , haskeline + default-language: Haskell2010 + +executable brainfsck + main-is: Main.hs + other-modules: + Paths_brainfsck + hs-source-dirs: + app + ghc-options: -threaded -rtsopts -with-rtsopts=-N + build-depends: + attoparsec + , base >=4.7 && <5 + , brainfsck + , bytestring + , haskeline + default-language: Haskell2010 + +test-suite brainfsck-test + type: exitcode-stdio-1.0 + main-is: Spec.hs + other-modules: + Paths_brainfsck + hs-source-dirs: + test + ghc-options: -threaded -rtsopts -with-rtsopts=-N + build-depends: + attoparsec + , base >=4.7 && <5 + , brainfsck + , bytestring + , haskeline + default-language: Haskell2010 diff --git a/homework/81333/brainfsck/examples/fact.bf b/homework/81333/brainfsck/examples/fact.bf new file mode 100644 index 0000000..197f331 --- /dev/null +++ b/homework/81333/brainfsck/examples/fact.bf @@ -0,0 +1,42 @@ ++++++++++++++++++++++++++++++++++ c1v33 : ASCII code of ! +>++++++++++++++++++++++++++++++ ++++++++++++++++++++++++++++++++ c2v61 : ASCII code of = +>++++++++++ c3v10 : ASCII code of EOL +>+++++++ c4v7 : quantity of numbers to be calculated +> c5v0 : current number (one digit) +>+ c6v1 : current value of factorial (up to three digits) +<< c4 : loop counter +[ block : loop to print one line and calculate next +>++++++++++++++++++++++++++++++++++++++++++++++++. c5 : print current number +------------------------------------------------ c5 : back from ASCII to number +<<<<.-.>.<.+ c1 : print !_=_ + +>>>>> block : print c6 (preserve it) +> c7v0 : service zero +>++++++++++ c8v10 : divizor +<< c6 : back to dividend +[->+>-[>+>>]>[+[-<+>]>+>>]<<<<<<] c6v0 : divmod algo borrowed from esolangs; results in 0 n d_n%d n%d n/d +>[<+>-] c6 : move dividend back to c6 and clear c7 +>[-] c8v0 : clear c8 + +>> block : c10 can have two digits; divide it by ten again +>++++++++++ c11v10: divizor +< c10 : back to dividend +[->-[>+>>]>[+[-<+>]>+>>]<<<<<] c10v0 : another divmod algo borrowed from esolangs; results in 0 d_n%d n%d n/d +>[-] c11v0 : clear c11 +>>[++++++++++++++++++++++++++++++++++++++++++++++++.[-]]c13v0 : print nonzero n/d (first digit) and clear c13 +<[++++++++++++++++++++++++++++++++++++++++++++++++.[-]] c12v0 : print nonzero n%d (second digit) and clear c12 +<<<++++++++++++++++++++++++++++++++++++++++++++++++.[-] c9v0 : print any n%d (last digit) and clear c9 + +<<<<<<. c3 : EOL +>>+ c5 : increment current number + block : multiply c6 by c5 (don't preserve c6) +>[>>+<<-] c6v0 : move c6 to c8 +>> c8v0 : repeat c8 times +[ +<<<[>+>+<<-] c5v0 : move c5 to c6 and c7 +>>[<<+>>-] c7v0 : move c7 back to c5 +>- +] +<<<<- c4 : decrement loop counter +] diff --git a/homework/81333/brainfsck/examples/hello.bf b/homework/81333/brainfsck/examples/hello.bf new file mode 100644 index 0000000..273b209 --- /dev/null +++ b/homework/81333/brainfsck/examples/hello.bf @@ -0,0 +1,3 @@ +>+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-] +>++++++++[<++++>-] <.>+++++++++++[<++++++++>-]<-.--------.+++ +.------.--------.[-]>++++++++[<++++>- ]<+.[-]++++++++++. diff --git a/homework/81333/brainfsck/examples/input.bf b/homework/81333/brainfsck/examples/input.bf new file mode 100644 index 0000000..12597fc --- /dev/null +++ b/homework/81333/brainfsck/examples/input.bf @@ -0,0 +1,13 @@ +> + +[ - >,>+< + ----- ----- ; minus 10 + [ ; if enters means it is not a \n + +++++ +++++ ; restore prev value + < + ] >> ; moving forward +] + ; numbers are 0 0 49 0 50 0 51 + ; for input 123 +<<<<[<<] ; moving to the beginning +>> ; reaching first char +[.>>] ; just printing till end diff --git a/homework/81333/brainfsck/examples/pretty.bf b/homework/81333/brainfsck/examples/pretty.bf new file mode 100644 index 0000000..069aa4d --- /dev/null +++ b/homework/81333/brainfsck/examples/pretty.bf @@ -0,0 +1,31 @@ +>>>>+>+++>+++>>>>>+++[ + >,+>++++[>++++<-]>[<<[-[->]]>[<]>-]<<[ + >+>+>>+>+[<<<<]<+>>[+<]<[>]>+[[>>>]>>+[<<<<]>-]+<+>>>-[ + <<+[>]>>+<<<+<+<--------[ + <<-<<+[>]>+<<-<<-[ + <<<+<-[>>]<-<-<<<-<----[ + <<<->>>>+<-[ + <<<+[>]>+<<+<-<-[ + <<+<-<+[>>]<+<<<<+<-[ + <<-[>]>>-<<<-<-<-[ + <<<+<-[>>]<+<<<+<+<-[ + <<<<+[>]<-<<-[ + <<+[>]>>-<<<<-<-[ + >>>>>+<-<<<+<-[ + >>+<<-[ + <<-<-[>]>+<<-<-<-[ + <<+<+[>]<+<+<-[ + >>-<-<-[ + <<-[>]<+<++++[<-------->-]++<[ + <<+[>]>>-<-<<<<-[ + <<-<<->>>>-[ + <<<<+[>]>+<<<<-[ + <<+<<-[>>]<+<<<<<-[ + >>>>-<<<-<- + ]]]]]]]]]]]]]]]]]]]]]]>[>[[[<<<<]>+>>[>>>>>]<-]<]>>>+>>>>>>>+>]< +]<[-]<<<<<<<++<+++<+++[ + [>]>>>>>>++++++++[<<++++>++++++>-]<-<<[-[<+>>.<-]]<<<<[ + -[-[>+<-]>]>>>>>[.[>]]<<[<+>-]>>>[<<++[<+>--]>>-] + <<[->+<[<++>-]]<<<[<+>-]<<<< + ]>>+>>>--[<+>---]<.>>[[-]<<]< +] diff --git a/homework/81333/brainfsck/examples/sierpinski.bf b/homework/81333/brainfsck/examples/sierpinski.bf new file mode 100644 index 0000000..4c66685 --- /dev/null +++ b/homework/81333/brainfsck/examples/sierpinski.bf @@ -0,0 +1,5 @@ +++++++++[>+>++++<<-]>++>>+<[-[>>+<<-]+>>]>+[ + -<<<[ + ->[+[-]+>++>>>-<<]<[<]>>++++++[<<+++++>>-]+<<++.[-]<< + ]>.>+[>>]>+ +] diff --git a/homework/81333/brainfsck/examples/squares.bf b/homework/81333/brainfsck/examples/squares.bf new file mode 100644 index 0000000..fa0a6f8 --- /dev/null +++ b/homework/81333/brainfsck/examples/squares.bf @@ -0,0 +1,5 @@ +++++[>+++++<-]>[<+++++>-]+<+[ + >[>+>+<<-]++>>[<<+>>-]>>>[-]++>[-]+ + >>>+[[-]++++++>>>]<<<[[<++++++++<++>>-]+<.<[>----<-]<] + <<[>>>>>[>>>[-]+++++++++<[>-<-]+++++++++>[-[<->-]+[<<<]]<[>+<-]>]<<-]<<- +] diff --git a/homework/81333/brainfsck/examples/sum.bf b/homework/81333/brainfsck/examples/sum.bf new file mode 100644 index 0000000..df694ec --- /dev/null +++ b/homework/81333/brainfsck/examples/sum.bf @@ -0,0 +1,100 @@ +[ + A brainfuck program for doing a single digit addition. + + Ex. input: '13' -> output: '4' + input: '99' -> output: '18' + + Author: Florian Baierl +] + +initialize #0 with 48 (ASCII char for '0') +>++++ ++++ +[ +<++++ ++ +>- +] + +save input to #1 and #2 +,>, + +substract value from #0 from #1 and #2 +<< +[ +>- +>- +<<- +] + +move to #1 +> + +substract from #1 and add to #2; now the answer is in #2 +[ + ->+< +] + +since we need to modify the answer afterwards write it to #3 and #6 +as well +> +[>+>>>+<<<<-] + + +Is the answer bigger than 9? +to continue the memory tape should look like this: +0 1 0 (a) b 0 +with the pointer pointing to a + +<+ +>>>+++++ +++++ b is 10 +< point to a + ++>+< necessary in case a and b are zero + +loop to determine whether a or b reach 0 first +[->-[>]<<] + +<[- + a was bigger or equals b + the answer is still stored in #6 + + subtract 10 from #6 (the answer) + >>>>> ----- ----- + + write 48 to #4 + <++++ ++++ + [ + <++++ ++ + >- + ] + add 48 to #5 and #6 + < + [->+>+<<] + + print out the results + >+.>. + + leave loop (back to #2) + <<<< + ] + <[- + a was samller so we can simply print the answer out after adding 48 to it + the answer is still stored in #6 + + >> + ++++ ++++ + [ + <++++ ++ + >- + ] + + < + [ + ->>>>+<<<< + ] + + print #2 + >>>>. + + we want to leave the loop so go somewhere with the value '0' + > +] diff --git a/homework/81333/brainfsck/package.yaml b/homework/81333/brainfsck/package.yaml new file mode 100644 index 0000000..44043aa --- /dev/null +++ b/homework/81333/brainfsck/package.yaml @@ -0,0 +1,51 @@ +name: brainfsck +version: 0.1.0.0 +github: "githubuser/brainfsck" +license: BSD3 +author: "Author name here" +maintainer: "example@example.com" +copyright: "2018 Author name here" + +extra-source-files: +- README.md +- ChangeLog.md + +# Metadata used when publishing your package +# synopsis: Short description of your package +# category: Web + +# To avoid duplicated efforts in documentation and dealing with the +# complications of embedding Haddock markup inside cabal files, it is +# common to point users to the README.md file. +description: Please see the README on GitHub at <https://github.com/githubuser/brainfsck#readme> + +dependencies: +- base >= 4.7 && < 5 +- attoparsec +- bytestring +- haskeline + +library: + source-dirs: src + +executables: + brainfsck: + main: Main.hs + source-dirs: app + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - brainfsck + +tests: + brainfsck-test: + main: Spec.hs + source-dirs: test + ghc-options: + - -threaded + - -rtsopts + - -with-rtsopts=-N + dependencies: + - brainfsck diff --git a/homework/81333/brainfsck/src/Lib.hs b/homework/81333/brainfsck/src/Lib.hs new file mode 100644 index 0000000..e4cc95c --- /dev/null +++ b/homework/81333/brainfsck/src/Lib.hs @@ -0,0 +1,30 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Lib + ( blocks + ) where + +import Data.Attoparsec.ByteString.Char8 +import qualified Data.ByteString.Char8 as B + +import Data.Char +import Text.Brainfsck.Types +import Text.Brainfsck.Util + +blocks :: Blocks -> [BFExpr] -> IO Blocks +blocks b [] = pure b +blocks (Blocks h b r) (BFRight:es) = blocks (Blocks (h + 1) b r) es +blocks (Blocks h b r) (BFLeft:es) = blocks (Blocks (max (h - 1) 0) b r) es +blocks (Blocks h b r) (BFPlus:es) = blocks (Blocks h (inc b h) r) es +blocks (Blocks h b r) (BFMinus:es) = blocks (Blocks h (dec b h) r) es +blocks (Blocks h b r) (BFPut:es) = + blocks (Blocks h b (r <> B.singleton (chr $ b !! h))) es +blocks (Blocks h b r) (BFGet:es) = do + v <- getChar + blocks (Blocks h (load b h $ ord v) r) es +blocks current@(Blocks h b r) (BFLoop expr:es) = do + if b !! h == 0 + then blocks current es + else do + newBlocks <- blocks current expr + blocks newBlocks ((BFLoop expr) : es) diff --git a/homework/81333/brainfsck/src/Text/Brainfsck/Parser.hs b/homework/81333/brainfsck/src/Text/Brainfsck/Parser.hs new file mode 100644 index 0000000..28c019a --- /dev/null +++ b/homework/81333/brainfsck/src/Text/Brainfsck/Parser.hs @@ -0,0 +1,56 @@ +module Text.Brainfsck.Parser + ( parseText + ) where + +import Control.Applicative + +import Data.Attoparsec.ByteString.Char8 +import qualified Data.ByteString.Char8 as B +import Data.Either (fromRight) + +import Text.Brainfsck.Types + +goRight :: Parser BFExpr +goRight = do + char '>' + pure BFRight + +goLeft :: Parser BFExpr +goLeft = do + char '<' + pure BFLeft + +plus :: Parser BFExpr +plus = do + char '+' + pure BFPlus + +minus :: Parser BFExpr +minus = do + char '-' + pure BFMinus + +get :: Parser BFExpr +get = do + char ',' + pure BFGet + +put :: Parser BFExpr +put = do + char '.' + pure BFPut + +bfsymbol :: Parser BFExpr +bfsymbol = goRight <|> goLeft <|> plus <|> minus <|> get <|> put <|> loop + +loop :: Parser BFExpr +loop = do + char '[' + m <- many' bfsymbol + char ']' + pure $ BFLoop m + +parseText :: B.ByteString -> [BFExpr] +parseText s = + fromRight [] $ + parseOnly (many' bfsymbol) $ B.filter ((flip elem) "+-,.<>[]") s diff --git a/homework/81333/brainfsck/src/Text/Brainfsck/Types.hs b/homework/81333/brainfsck/src/Text/Brainfsck/Types.hs new file mode 100644 index 0000000..5dd26f6 --- /dev/null +++ b/homework/81333/brainfsck/src/Text/Brainfsck/Types.hs @@ -0,0 +1,24 @@ +{-# LANGUAGE OverloadedStrings #-} + +module Text.Brainfsck.Types where + +import qualified Data.ByteString.Char8 as B + +data BFExpr + = BFRight + | BFLeft + | BFPlus + | BFMinus + | BFGet + | BFPut + | BFLoop [BFExpr] + deriving (Show) + +data Blocks = Blocks + { h :: Int + , b :: [Int] + , r :: B.ByteString + } deriving (Show) + +newBlocks :: Blocks +newBlocks = Blocks {h = 0, b = [0,0 ..], r = ""} diff --git a/homework/81333/brainfsck/src/Text/Brainfsck/Util.hs b/homework/81333/brainfsck/src/Text/Brainfsck/Util.hs new file mode 100644 index 0000000..fb2d5ad --- /dev/null +++ b/homework/81333/brainfsck/src/Text/Brainfsck/Util.hs @@ -0,0 +1,10 @@ +module Text.Brainfsck.Util where + +inc :: [Int] -> Int -> [Int] +inc b h = take h b <> [b !! h + 1] <> drop (h + 1) b + +dec :: [Int] -> Int -> [Int] +dec b h = take h b <> [b !! h - 1] <> drop (h + 1) b + +load :: [Int] -> Int -> Int -> [Int] +load b h v = take h b <> [v] <> drop (h + 1) b diff --git a/homework/81333/brainfsck/stack.yaml b/homework/81333/brainfsck/stack.yaml new file mode 100644 index 0000000..6ad76a0 --- /dev/null +++ b/homework/81333/brainfsck/stack.yaml @@ -0,0 +1,64 @@ +# This file was automatically generated by 'stack init' +# +# Some commonly used options have been documented as comments in this file. +# For advanced use and comprehensive documentation of the format, please see: +# https://docs.haskellstack.org/en/stable/yaml_configuration/ + +# Resolver to choose a 'specific' stackage snapshot or a compiler version. +# A snapshot resolver dictates the compiler version and the set of packages +# to be used for project dependencies. For example: +# +# resolver: lts-3.5 +# resolver: nightly-2015-09-21 +# resolver: ghc-7.10.2 +# +# The location of a snapshot can be provided as a file or url. Stack assumes +# a snapshot provided as a file might change, whereas a url resource does not. +# +# resolver: ./custom-snapshot.yaml +# resolver: https://example.com/snapshots/2018-01-01.yaml +resolver: lts-12.18 + +# User packages to be built. +# Various formats can be used as shown in the example below. +# +# packages: +# - some-directory +# - https://example.com/foo/bar/baz-0.0.2.tar.gz +# - location: +# git: https://github.com/commercialhaskell/stack.git +# commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a +# subdirs: +# - auto-update +# - wai +packages: +- . +# Dependency packages to be pulled from upstream that are not in the resolver +# using the same syntax as the packages field. +# (e.g., acme-missiles-0.3) +# extra-deps: [] + +# Override default flag values for local packages and extra-deps +# flags: {} + +# Extra package databases containing global packages +# extra-package-dbs: [] + +# Control whether we use the GHC we find on the path +# system-ghc: true +# +# Require a specific version of stack, using version ranges +# require-stack-version: -any # Default +# require-stack-version: ">=1.9" +# +# Override the architecture used by stack, especially useful on Windows +# arch: i386 +# arch: x86_64 +# +# Extra directories used by stack for building +# extra-include-dirs: [/path/to/dir] +# extra-lib-dirs: [/path/to/dir] +# +# Allow a newer minor version of GHC than the snapshot specifies +# compiler-check: newer-minor diff --git a/homework/81333/brainfsck/test/Spec.hs b/homework/81333/brainfsck/test/Spec.hs new file mode 100644 index 0000000..cd4753f --- /dev/null +++ b/homework/81333/brainfsck/test/Spec.hs @@ -0,0 +1,2 @@ +main :: IO () +main = putStrLn "Test suite not yet implemented" |
