3. Micro Code LanguageΒΆ

Name: [a-zA-Z_][a-zA-Z_0-9]*

Number:

  • binary: 0b(0|1)+
  • decimal: 0o[0-7]+
  • hexdecimal: 0x[0-9a-fA-F]+
  • decimal: d+

BNF Grammar:

empty :

program : statement
        | program statement
        | empty

statement : expression_statement
          | compound_statement
          | if_statement

expression_statement : assignation ;
                     | function ;
                     | ;

statement_list : statement
               | statement_list statement

compound_statement : { statement_list }
                   | { }

if_statement : IF ( expression ) statement
             | IF ( expression ) statement ELSE statement

expression_list : expression
                | expression_list , expression

function : NAME ( expression_list )
         | NAME ( )

assignation : destination = expression

destination : register
            | register_concatenation
            | register_bit
            | register_bit_range
            | addressing

constant : DECIMAL_NUMBER
         | BINARY_NUMBER
         | OCTAL_NUMBER
         | HEX_NUMBER

register : NAME

register(_operand) : @ NAME

constant(_operand) : $ NAME

register_concatenation : register : register

register_bit : register [ expression ]

register_bit_range : register [ constant .. constant ]

addressing : [ expression ]

expression : register
           | register_concatenation
           | register_bit
           | register_bit_range
           | addressing
           | constant

expression : expression + expression
           | expression - expression
           | expression * expression
           | expression / expression
           | expression & expression
           | expression | expression
           | expression > expression
           | expression << expression
           | expression >> expression
           | expression == expression
           | expression != expression
           | expression < expression
           | expression > expression
           | expression <= expression
           | expression >= expression

Examples:

# increment register Y
Y = Y + 1

# add register operand d with constant operand k (d and k are relative to the instruction)
@d = @d + $k