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>