Asm
program: { directive | statement }
directive: "." directive_name [ space [ directive_args ] ] newline
directive_name: WORD
directive_args: directive_arg { space [ directive_arg ] }
directive_arg: WORD | NUMBER
newline: [ space ] NEWLINE
space: SPACE { SPACE }
statement: ( function | space [ instruction ] ) newline
function: function_name [ space ] ":"
function_name: WORD
instruction: [ prefix space ] instruction_name [ space [ operand_list ] ]
prefix: WORD
instruction_name: WORD
operand_list: operand [ space ] { "," [ space ] operand [ space ] }
operand: value | address
value: symbol | register | immediate
symbol: WORD
register: "%" WORD
immediate: [ sign ] "$" NUMBER
address: "[" [ space ] [ sign [ space ] ] value [ space ] [ offset [ space ] ] "]"
sign: ( "+" | "-" )
offset: sign [ space ] value