diff options
Diffstat (limited to 'project/templates/thue2a.html')
-rw-r--r-- | project/templates/thue2a.html | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/project/templates/thue2a.html b/project/templates/thue2a.html new file mode 100644 index 0000000..c0430db --- /dev/null +++ b/project/templates/thue2a.html @@ -0,0 +1,97 @@ + +{% extends "base.html" %} + + + +{% block title %}Thue Version 2a{% endblock %} + + + +{% block content %} + +<h4>Thue Version 2a</h4> + +<p><a href="http://esolangs.org/wiki/Thue">Thue</a> is an esoteric programming language +based on unrestricted grammars. A Thue program consists of a number of rules detailing a +sequence of symbols to replace and a sequence of symbols to replace with, and an initial +state of the program. Applicable rules are then applied to the inital state in a random +order until no more are applicable, at which point the program terminates.</p> + +<p>An example Thue program that increments a binary number surrounded by '_' characters: +<code> + 1_::=1++ + 0_::=1 + 01++::=10 + 11++::=1++0 + _0::=_ + _1++::=10 + ::= + _1111111_ +</code> +</p> + +<p>The before and after symbols in each rule are separated by '::=' and the list of rules is +ended by a blank rule. Note that whitespace in rules and the inital state is NOT ignored.</p> + +<p>Output is handled by prefixing the right hand side with '~', which causes those symbols to +go to stdout and the replacement in the program to be the empty string.</p> + +<p>The traditional Hello World program: +<code> + a::=~Hello World! + ::= + a +</code> +</p> + +<p>Input is handled by having the right hand side of a rule be ':::', which causes the left +hand side symbols to be replaced with a line from the standard output. Unfortunately, this +immediately causes problems.</p> + +<p>The following is an innocent piece of code that accepts a single line of input and does nothing +more. Maybe. +<code> + a::=::: + ::= + a +</code> +</p> + +<p>If a string involving the letter 'a' is entered into the above program, the single input rule +will again become applicable and another line of input will be obtained. In other words, the +input in Thue is unescaped and allows direct code injection into a program.</p> + +<p>To solve this problem, I've constructed a slightly modified version of Thue that I'm calling +version 2a. In this version, all symbols obtained through stdin are treated as different from +ordinary symbols. Rules can refer to and manipulate symbols obtained through stdin by +surrounding them in double quotes.</p> + +<p>A rule that replaces an ordinary symbol 'a' with 'abc': +<code> + a::=abc +</code> +</p> + +<p>A rule that replaces the letter 'a' that was obtained from stdin with 'abc': +<code> + "a"::=abc +</code> +</p> + +<p>For convenience, a number of escaped characters are also available: +<pre> + \\ -> backslash + \r -> return + \n -> newline + \: -> colon + \" -> double quote + \EOT -> end of file +</pre> +</p> + +<p>While this doesn't solve all the problems Thue has (try writing a Thue program that asks +for and greets the user by name!) it should solve this one particular issue. Source code is +available <a href="https://github.com/jedb/esoteric">here</a>.</p> + +{% endblock %} + |