From 4e7fdd57cbf8f60f674ba48fd04c80ad59a20579 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sun, 1 Jan 2017 15:00:53 +1100 Subject: Base template tweaked, old Grasp/Thue articles added from previous website efforts --- project/templates/thue2a.html | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 project/templates/thue2a.html (limited to 'project/templates/thue2a.html') 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 %} + +

Thue Version 2a

+ +

Thue 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.

+ +

An example Thue program that increments a binary number surrounded by '_' characters: + + 1_::=1++ + 0_::=1 + 01++::=10 + 11++::=1++0 + _0::=_ + _1++::=10 + ::= + _1111111_ + +

+ +

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.

+ +

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.

+ +

The traditional Hello World program: + + a::=~Hello World! + ::= + a + +

+ +

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.

+ +

The following is an innocent piece of code that accepts a single line of input and does nothing +more. Maybe. + + a::=::: + ::= + a + +

+ +

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.

+ +

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.

+ +

A rule that replaces an ordinary symbol 'a' with 'abc': + + a::=abc + +

+ +

A rule that replaces the letter 'a' that was obtained from stdin with 'abc': + + "a"::=abc + +

+ +

For convenience, a number of escaped characters are also available: +

+    \\ -> backslash
+    \r -> return
+    \n -> newline
+    \: -> colon
+    \" -> double quote
+    \EOT -> end of file
+
+

+ +

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 here.

+ +{% endblock %} + -- cgit