Types, Identifiers and Numbers

Reflex limits types to integer types and booleans. There is no floating point type included in the language, and new types cannot be declared. There are a couple of cases where certain constructs behave like types. For instance module definitions and declarations behave in some ways like types, but are not treated as such in the grammar or in the language definition. Identifiers follow the familiar C-like rules, Identifiers must start with a character which is not a digit, terminal character or ‘+’ and identifiers cannot shadow keywords.

Legal Identifiers

__hello
value
v1234
$value
@value
aHappyVariable
a$Happy@Variable
another_happy_variable

Illegal Character

1badvar
+mybadvar
;anotherbadvar

Integer Literals

Negative integer literals can be written by prefixing the integer with a - sign. Signed values are represented by two’s complement values as in other C-like languages.

Integer literals can also be represented as hexidecimal values to wite a hex value,prefix the literal with 0x. So 127 can be represented as 0x7F and -128 can be represented as -0xF0

Signed vs Unsigned

A given type is considered a signed value unless it is prefixed with the unsigned keyword. The language does include the signed keyword and a value may be fully and explicitly declared as such, but in general use of signed is not necessary.

Type Size in Bytes Min Max unsigned Max
char (byte) 1 -128 127 255
short 2 –32768 32767 65535
int 4 –2147483648 2147483647 4294967295

Identifiers, and Type Declarations EBNF

Identifier

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' | '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' ;
nonterminal ::=  '_' | '$' | '@' ;
ID          ::=  letter | nonterminal , { letter | digit | nontermial } ;

Integer Literal

digit-not-zero ::=    '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8'
                    | '9' ;
digit          ::=  '0' | digit-not-zero ;
hex-digit      ::=  digit | 'A' | 'B' | 'C' | 'D' | 'E' | 'F' | 'a' | 'b' | 'c'
                    | 'd' | 'e' | 'f' ;
INT            ::=  '0'
                    | digit-not-zero , { digit }
                    | '-' digit-not-zero , { digit }
                    | '0x' hex-digit , { hex-digit }
                    | '-0x' hex-digit, { hex-digit } ;

Type Specifier

TYPE           ::=  'char' | 'short' | 'int' ;
type_specifier ::=  TYPE | 'unsigned' , TYPE | 'signed' , TYPE ;