Syntax notation

Wirth syntax notation (WSN) of Mya language:

PROGRAM = { DECLARATION | COMMAND } .

DECLARATION = BITFIELD_DECLARATION
            | REGISTER_DECLARATION
            | INSTRUCTION_DECLARATION .

BITFIELD_DECLARATION = "bitfield" BITFIELD_NAME SIZE_SPEC [ "{" 
BITFIELD_BODY "}" ] .
BITFIELD_NAME = UPPERCASE_LETTER { ALPHACHARACTER } .
BITFIELD_BODY = BITFIELD_FIELD_DECLARATION { 
BITFIELD_FIELD_DECLARATION } .
BITFIELD_FIELD_DECLARATION = IDENTIFIER SIZE_SPEC .
BITFIELD_SPEC = BITFIELD_NAME "{" ( EXPRESSION | 
BITFIELD_SPEC_FIELD { "," BITFIELD_SPEC_FIELD } ) "}" .
BITFIELD_SPEC_FIELD = IDENTIFIER "=" EXPRESSION [ "," ] .

REGISTER_DECLARATION = "register" IDENTIFIER SIZE_SPEC "=" 
BITFIELD_SPEC .

INSTRUCTION_DECLARATION = "inst" IDENTIFIER SIZE_SPEC "(" 
INSTRUCTION_ARGLIST ")" "{" INSTRUCTION_SPEC "}" .
INSTRUCTION_ARGLIST = INSTRUCTION_ARG { "," INSTRUCTION_ARG } .
INSTRUCTION_ARG = IDENTIFIER ":" TYPE_SPEC .
INSTRUCTION_SPEC = INSTRUCTION_SPEC_FIELD { "," 
INSTRUCTION_SPEC_FIELD } .
INSTRUCTION_SPEC_FIELD = IDENTIFIER "=" BITFIELD_SPEC [ "," ] .

TYPE_SPEC = TYPE_NAME SIZE_SPEC .
TYPE_NAME = "register" | "immediate" .

SIZE_SPEC = "[" EXPRESSION "]" .


COMMAND = COMMAND_STATEMENT ";" .
COMMAND_STATEMENT = SET_COMMAND | INCLUDE_COMMAND .

SET_COMMAND = "set" IDENTIFIER "=" EXPRESSION .
INCLUDE_COMMAND = "include" STRING .


IDENTIFIER = LETTER { ALPHACHARACTER } .
EXPRESSION = IDENTIFIER
           | NUMBER
           | "(" EXPRESSION ")"
           | EXPRESSION OPERATOR EXPRESSION .
OPERATOR = "-" | "+" | "/" | "*" | "|" | "&" | "^" | "~"  | "<<" | 
">>" .


UPPERCASE_LETTER = "A" | "B" | "C" | "D" | "E" | "F" | "G" | "H" | 
"I" | "J" | "K" | "L" | "M" | "N" | "O" | "P" | "Q" | "R" | "S" | 
"T" | "U" | "V" | "W" | "X" | "Y" | "Z" .
LOWERCASE_LETTER = "a" | "b" | "c" | "d" | "e" | "f" | "g" | "h" | 
"i" | "j" | "k" | "l" | "m" | "n" | "o" | "p" | "q" | "r" | "s" | 
"t" | "u" | "v" | "w" | "x" | "y" | "z" .
LETTER = UPPERCASE_LETTER | LOWERCASE_LETTER .
ALPHACHARACTER = LETTER | DECIMAL_DIGIT | "_" .

NUMBER = DECIMAL_NUMBER | HEXADECIMAL_NUMBER | OCTAL_NUMBER | 
BINARY_NUMBER .
DECIMAL_NUMBER = DECIMAL_DIGIT { DECIMAL_DIGIT } .
HEXADECIMAL_NUMBER = "0x" HEXADECIMAL_DIGIT { HEXADECIMAL_DIGIT } .
OCTAL_NUMBER = "0o" OCTAL_DIGIT { OCTAL_DIGIT } .
BINARY_NUMBER = "0b" BINARY_DIGIT { BINARY_DIGIT } .


DECIMAL_DIGIT = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | 
"8" | "9" .
HEXADECIMAL_DIGIT = DECIMAL_DIGIT
                  | "a" | "b" | "c" | "d" | "e" | "f"
                  | "A" | "B" | "C" | "D" | "E" | "F" .

STRING = """" { ANY_CHAR } """" .