A Brainfuck based on Emoji.
Instructions:
👉 Move the pointer to the right
👈 Move the pointer to the left
👍 Increment the memory cell under the pointer
👎 Decrement the memory cell under the pointer
💻 Output the character signified by the cell at the pointer
💾 Input a character and store it in the cell at the pointer
🔃 Jump past the matching 🔙 if the cell under the pointer is 0
🔙 Jump back to the matching 🔃 if the cell under the pointer is nonzero
Add this line to your application's Gemfile:
gem 'mojikun'
And then execute:
$ bundle
Or install it yourself as:
$ gem install mojikun
A mojikun
binary is provided to let you run programs. There is an examples
directory which has some examples. Use mojikun
like any other interpreter:
mojikun examples/hello.moji
.moji
is the preferred file ending for Mojikun.
While Mojikun is a simple language that could be interpreted in a 40ish line script, I wanted to make it more like a 'real langauge' that would have all of the parts and design that a more full one has. I may use this foundation later to build more complex things.
We can see these parts in motion by examining the binary:
$ cat bin/mojikun
#!/usr/bin/env ruby
require 'mojikun'
source_code = ARGF.read.chomp
tokens = Mojikun::Lexer.new(source_code).call
ast = Mojikun::Parser.new(tokens).call
runtime = Mojikun::Runtime.new
interpreter = Mojikun::Interpreter.new(runtime)
interpreter.evaluate(ast)
We have a Lexer, Parser, Runtime, and Interpreter. The Lexer turns the stream of input into a series of tokens. The Parser takes those tokens and turns them into an AST, which is more of a list than a tree, really. We generate a new Runtime, which has all of the internal state we need to make the language work: the data array, the program counter, etc. Then, the Interpreter takes that AST and evaluates it in the context of the Runtime.
Pretty simple!
Mojikun is fully tested with MiniTest. I actually wrote it in a TDD fashion. To run the tests, simply
$ rake test
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request