From b4301ed6502bd3dd75ee2712cfaa74770f9959c7 Mon Sep 17 00:00:00 2001
From: omicron <omicron.me@protonmail.com>
Date: Mon, 31 Mar 2025 14:47:58 +0200
Subject: [PATCH] Add a parser grammar

Currently this is a subset of the grammar, enough to get reasonable work
going.
---
 doc/parser_grammar.txt | 36 ++++++++++++++++++++++++++++++++++++
 1 file changed, 36 insertions(+)
 create mode 100644 doc/parser_grammar.txt

diff --git a/doc/parser_grammar.txt b/doc/parser_grammar.txt
new file mode 100644
index 0000000..dc8a976
--- /dev/null
+++ b/doc/parser_grammar.txt
@@ -0,0 +1,36 @@
+/* string literals are lexer identifier tokens with that particular value */
+<program>   ::= <statement>*
+<statement> ::= ( <label> | <directive> | <instruction> ) <newline>
+
+<label> ::= <identifier> <colon>
+
+<directive> ::= <dot> <section>
+
+<section>   ::= "section" <identifier>
+
+<instruction> ::= <identifier> <operands>
+
+<operands> ::= <operand> ( <comma> <operands> )*
+
+<operand>  ::= <register> | <immediate> | <memory>
+
+<register> ::= <register_base> | <register_extra>
+<register_base> ::= "rax" | "rbx" | "rcx" | "rdx" | "rsi" | "rdi" | "rbp" | "rsp"
+<register_extra> ::= "r8" | "r9" | "r10" | "r11" | "r12" | "r13" | "r14" | "r15" 
+
+<immediate> ::= <number> | <label_reference>
+<number> ::= <octal> | <binary> | <decimal> | <hexadecimal>
+
+<label_reference> ::= <identifier>
+
+<memory> ::= <lbracket> <memory_expression> <rbracket>
+
+<memory_expression> ::= <label_reference> | <register_expression>
+
+<register_expression> ::= <register> ( <plus> <register> <asterisk> <number> )? ( <plus_or_minus> <number> )?
+
+<register_displacement> ::= <plus> <register> <asterisk> <number>
+
+<register_offset> ::= <plus_or_minus> <number>
+
+<plus_or_minus> ::= <plus> | <minus>