From 580bd7e8579f1de36d151249500de6601e43f4a1 Mon Sep 17 00:00:00 2001
From: Eugen Wissner <belka@caraus.de>
Date: Sun, 15 Feb 2026 04:35:24 +0100
Subject: Add documentation

---
 doc/appendix.tex | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 179 insertions(+)
 create mode 100644 doc/appendix.tex

(limited to 'doc/appendix.tex')

diff --git a/doc/appendix.tex b/doc/appendix.tex
new file mode 100644
index 0000000..0777d55
--- /dev/null
+++ b/doc/appendix.tex
@@ -0,0 +1,179 @@
+\part{Appendix}
+\appendix
+
+\chapter{Syntax}
+
+\begin{grammar}
+<letter> = `A' | `B' | … | `Z' | `a' | `b' | … | `z' | `\_'.
+
+<counting-digit> = `1' | `2' | `3' | `4' | `5' | `6' | `7' | `8' | `9'.
+
+<decimal-digit> = `0' | <counting-digit>.
+
+<hex-digit> = <decimal-digit> | `A' | `B' | … | `F' | `a' | `b' | … | `f'.
+
+<binary-digit> = `0' | `1'.
+
+<hex-character> = `\\x' <hex-digit> <hex-digit>.
+
+<escaped-character> = `\\' \\
+	(`n' | `a' | `b' | `t' | `f' | `r' | `v' | `\\' | `\textquotesingle' | `\textquotedbl' | `?\@' | `0').
+
+<printable-character> = \enspace? a printable ASCII character\space?.
+
+<character> = <printable-character> | <escaped-character> | <hex-digit>.
+
+<identifier> = <letter> \{<letter> | <decimal-digit>\}.
+
+<identifier-definition> = <identifier> [`*'].
+
+<trait-identifier> = `#' <identifier>.
+
+<integer-literal> = `0' | <counting-digit> \{<decimal-digit>\}.
+
+<word-literal> = <integer-literal> `u'
+	\alt{} `0' (`X' | `x') <hex-digit> \{<hex-digit>\}
+	\alt{} `0' (`B' | `b') <binary-digit> \{<binary-digit>\}.
+
+<real-literal> = <integer-literal> `.\@' <decimal-digit> \{<decimal-digit>\}
+	\alt{} <integer-literal>\} `e' [`+' | `-'] <decimal-digit> \{<decimal-digit>\}.
+
+<string-literal> = `\textquotedbl' \{<character>\} `\textquotedbl'.
+
+<character-literal> = `\textquotesingle' <character> `\textquotesingle'.
+
+<literal> = <integer-literal> | <word-literal> | <real-literal>
+	\alt{} <string-literal> | <character-literal>
+	\alt{} `true' | `false' | `nil'.
+
+<trait> = <trait-identifier> `(' [<types>] `)'.
+
+<cast> = `cast' `(' <expression> `:\@' <type> `)'.
+
+<procedure-call> = <designator> `(' [<expressions>] `)'.
+
+<relation-operator> = `=' | `<>' | `<' | `>' | `<=' | `>='.
+
+<multiplication-operator> = `*' | `/' | `\%'.
+
+<addition-operator> = `+' | `-'.
+
+<shift-operator> = `<<' | `>>'.
+
+<unary-operator> = `@' | `~' | `-'.
+
+<selector> = `[' <expression> `]' | `.\@' <identifier> | `^'.
+
+<case> = <expressions> `:\@' <optional-statements>.
+
+<designator> = <reference> <selector> | <identifier>.
+
+<reference> = <literal>
+	\alt{} <designator>
+	\alt{} <trait>
+	\alt{} <cast>
+	\alt{} <procedure-call>
+	\alt{} `(' <expression> `)'.
+
+<factor> = <unary-operator> <factor> | <reference>.
+
+<term> = <factor> \{<multiplication-operator> <factor>\}.
+
+<simple-expression> = <term> \{<addition-operator> <term>\}.
+
+<comparand> = <simple-expression> \{<shift-operator> <simple-expression>\}.
+
+<relation> = <comparand> \{<relation-operator> <comparand>\}.
+
+<operand> = <relation> \{`&' <relation>\}.
+
+<expression> = <operand> \{(`or' | `xor') <operand>\}.
+
+<expressions> = <expression> \{`,' <expression>\}.
+
+<identifier-definitions> = <identifier-definition> \{`,' <identifier-definition>\}.
+
+<types> = <type> \{`,' <type>\}.
+
+<required-statements> = <statement> \{`;' <statement>\}.
+
+<optional-statements> = [<required-statements>].
+
+<return-declaration> = [`->' `!\@' | `->' type].
+
+<field> = <identifier> `:\@' <type>.
+
+<array-type> = `[' <expression> `]' <type>.
+
+<pointer-type> = `^' <type>.
+
+<record-type> = `record' [`(' <identifier> `)'] [<field> \{`;' <field>\}] `end'.
+
+<enumeration-type> = `(' <identifier> \{`,' <identifier>\} `)'.
+
+<procedure-type> = `proc' `(' [<types>] `)' <return-declaration>.
+
+<type> = <array-type>
+	\alt{} <pointer-type>
+	\alt{} <record-type>
+	\alt{} <enumeration-type>
+	\alt{} <procedure-type>
+	\alt{} <identifier>.
+
+<assignment> = <designator> `:=' <expression>.
+
+<if-statement> = `if' <expression> `then' <optional-statements> \\
+    \{`elsif' <expression> `then' <optional-statements>\} \\
+	{[`else' <optional-statements>]} `end'.
+
+<while-statement> = `while' <expression> `do' <optional-statements> \\
+    \{`elsif' <expression> `do' <optional-statements>\} `end'.
+
+<defer-statement> = `defer' <optional-statements> `end'.
+
+<case-statement> = `case' <expression> `of' <case> \{`|' case\} \\
+	{[`else' <optional-statements>]} `end'.
+
+<label-declaration> = `.\@' <identifier>.
+
+<goto-statement> = `goto' <identifier>.
+
+<statement> = <assignment> | <procedure-call> | <defer-statement>
+    | <label-declaration> | <goto-statement> |
+    | <while-statement> | <if-statement> | <case-statement>.
+
+<statement-part> = [`begin' <required-statements>
+	\alt{} `return' <expression>
+	\alt{} `begin' <required-statements> `;' `return' <expression>].
+
+<constant-declaration> = <identifier-definition> `:=' <expression>.
+
+<constant-part> = [`const' \{<constant-declaration> `;'\}].
+
+<variable-declaration> = <identifier-definitions> `:\@' <type> \\
+	{[`:=' (<expression> | `extern')]}.
+
+<variable-part> = [`var' \{<variable-declaration> `;'\}].
+
+<type-declaration> = <identifier-definition> `=' <type>.
+
+<type-part> = [`type' \{<type-declaration> `;'\}].
+
+<import-declaration> = <identifier> \{`.\@' <identifier>\}.
+
+<import-part> = [`import' \{import-declaration `;'\}].
+
+<procedure-heading> = `proc' <identifier-definition> \\
+	`(' [<field> \{`,' <field>\}] `)' <return-declaration>.
+
+<block> = <constant-part> <variable-part> <statement-part> `end'.
+
+<procedure-declaration> = <procedure-heading> `;' (block | `extern').
+
+<declaration-sequence> = <import-part> \\
+    <constant-part> <type-part> <variable-part> \\
+	\{<procedure-declaration> `;'\}.
+
+<program> = `program' `;' <declaration-sequence> <statement-part> `end' `.\@'
+	\alt{} `module' `;' <declaration-sequence> `end' `.\@'.
+\end{grammar}
-- 
cgit v1.2.3

