Skip to content

Instantly share code, notes, and snippets.

@Kirens
Created October 29, 2018 15:54
Show Gist options
  • Select an option

  • Save Kirens/65d0d27d11eac97c1d30ac332ddc38b4 to your computer and use it in GitHub Desktop.

Select an option

Save Kirens/65d0d27d11eac97c1d30ac332ddc38b4 to your computer and use it in GitHub Desktop.
A brainfuck interpreter in TeX
\ProvidesPackage{brainfuck}[2018/10/29 v1.0 A package to provide a Brainfuck interpreter interface]
\def \IgnoreSpaceInCode{%
\endlinechar = 32\relax%
\catcode 9 = 9\relax%
\catcode 32 = 9\relax%
}
\def \AcknowledgeSpaceInCode{%
\endlinechar = 13\relax%
\catcode 9 = 10\relax%
\catcode 32 = 10\relax%
}
\IgnoreSpaceInCode
\newcount\ptr
\ptr 0\relax
\def\decptr{\advance\ptr by -1\relax}
\def\incptr{\advance\ptr by +1\relax}
\def\activecounter{ptr\number\ptr}
\def\providecountr{
\ifcsname\activecounter\endcsname
\else
\expandafter\newcount\csname \activecounter\endcsname
\csname \activecounter\endcsname 0\relax
\fi
}
\def\anynum#1{
\providecountr
\expandafter\advance\csname \activecounter\endcsname #1\relax
}
\def\deccount{
\anynum{-1}
}
\def\inccount{
\anynum{+1}
}
\def\leftbrace#1]{
\providecountr
\ifnum \activecharunsafe = 0 \else
#1\leftbrace#1]
\fi
}
\def\activecharunsafe{
\expandafter\number\csname \activecounter\endcsname
}
\def\acitvecount{
\providecountr
\activecharunsafe
}
\def\activecountchar{
\providecountr
\ifnum \activecharunsafe = 32 \space\space\else
\ifnum \activecharunsafe = 10 \par\else
\expandafter\char\activecharunsafe
\fi
\fi
}
\def\activateBrainfuck
{
\catcode`< = \active\relax
\catcode`> = \active\relax
\catcode`- = \active\relax
\catcode`+ = \active\relax
\catcode`[ = \active\relax
\catcode`. = \active\relax
\catcode`, = \active\relax
}
\begingroup
\activateBrainfuck
\newenvironment{brainfuck}
{
\begingroup
% Assign stuff
\let<\decptr
\let>\incptr
\let-\deccount
\let+\inccount
\let[\leftbrace
%\let.\acitvecount
\let.\activecountchar
% Change the input reading
\IgnoreSpaceInCode
\activateBrainfuck
}
{
\endgroup
}
%Expose globally
\global\let\brainfuck\brainfuck
\global\let\endbrainfuck\endbrainfuck
\endgroup
\AcknowledgeSpaceInCode
\documentclass{article}
\usepackage{brainfuck}
\title{Brainfuck}
\author{Kirens}
\date{October 2018}
\begin{document}
\maketitle
\section{Introduction}
\begin{brainfuck}
>>++++ ++++[<++++ ++++<++++>>-]<
++++++++.---.+++++++..+++.
<.>
++++++++.--------.+++.------.--------.
\end{brainfuck}
\end{document}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment