/* string literals are lexer identifier tokens with that particular value */ <program> ::= <statement>* <statement> ::= <label> | <directive> | <instruction> <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> <register_index>? <register_offset>? <register_index> ::= <plus> <register> <asterisk> <number> <register_offset> ::= <plus_or_minus> <number> <plus_or_minus> ::= <plus> | <minus>