Grammar for the Assembly Language asm ::= [INT] [DOUBLE] [STRING] CODE CODE ::= "CODE" [inst]* inst ::= NL inst ::= op NL inst ::= op operand NL inst ::= op operand "," operand NL inst ::= op operand "," operand "," operand NL inst ::= label ":" op ::= any operation name operand ::= small operand ::= large operand ::= reg operand ::= "[" reg "]" reg ::= "r" regnum label ::= alpha [alpha | digit | "_"]* (not a keyword) small ::= expr (in range -32 .. +31) large ::= expr (in range -2^13 .. +2^13 - 1) regnum ::= decimal (in range 0 .. 63) expr ::= "(" expr ")" expr ::= integer expr ::= label expr ::= expr "+" expr expr ::= expr "-" expr expr ::= expr "*" expr expr ::= expr "/" expr expr ::= expr "%" expr expr ::= expr "<<" expr expr ::= expr ">>" expr expr ::= expr "&" expr expr ::= expr "|" expr expr ::= expr "^" expr integer ::= [ "+" | "-" ] uint uint ::= "0x" hexdigits uint ::= "0" octdigits uint ::= decimal decimal ::= decdigits INT ::= "INT" [intdef]* intdef ::= NL intdef ::= expr NL intdef ::= label ":" intdef ::= "[" positive integer "]" intseq NL intseq ::= expr [ "," expr ]* DOUBLE ::= "DOUBLE" [dbldef]* dbldef ::= NL dbldef ::= double NL dbldef ::= label ':' dbldef ::= "[" positive integer "]" dblseq NL dblseq ::= double [ "," double ]* STRING ::= "STRING" [strdef]* strdef ::= NL strdef ::= string NL strdef ::= label ':' strdef ::= "[" positive integer "]" strseq NL strseq ::= string [ "," string ]* string ::= "\"" chars "\"" NL ::= [comment] "\n" comment ::= "#" chars