#{ EnumEntry ::= Identifier [ = ConstExpr ] Enum1 ::= 'enum' Identifier '{' EnumEntry { ',' EnumEntry } '}' Enum2 ::= 'enum' Identifier '{' EnumEntry { ';' EnumEntry } '}' Enum ::= Enum1 | Enum2 EnumType1 ::= 'enum' '<' EnumEntry { ',' EnumEntry } '>' EnumType2 ::= 'enum' '<' EnumEntry { ';' EnumEntry } '>' EnumType ::= EnumType1 | EnumType2 #} @[test()] enum { } @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Invalid enum definition}} @[test()] enum Bool { False, True } @[test()] io.writeln( Bool::False ) io.writeln( Bool.True ) @[test()] @[test()] $False(0) $True(1) @[test()] @[test()] switch( Bool.False ){ case Bool::False : io.writeln( "Bool::False" ) case Bool::True : io.writeln( "Bool::True" ) } @[test()] @[test()] Bool::False @[test()] @[test()] switch( (Bool) $True ){ case Bool::False : io.writeln( "Bool::False" ) case Bool::True : io.writeln( "Bool::True" ) } @[test()] @[test()] Bool::True @[test()] @[test()] bl : Bool = $True io.writeln( bl ) @[test()] @[test()] $True(1) @[test()] @[test()] a = True; @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Symbol not defined}} @[test()] @[test()] flag = Bool.False + Bool.True @[test()] @[test()] {{not combinable enum}} @[test()] @[test()] const False : int = Bool::False const True : int = Bool::True io.writeln( False, True ) @[test()] @[test()] 0 1 @[test()] @[test()] enum EC { AA; BB = 3; CC } io.writeln( EC::AA ) io.writeln( EC::BB ) io.writeln( EC::CC ) @[test()] @[test()] $AA(1) $AA$BB(3) $CC(6) @[test()] @[test()] enum Test { ABC = 'abc' } @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Invalid enum definition}} @[test()] @[test()] enum Test { A = 1 B = 1 } @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Invalid enum definition}} @[test()] @[test()] enum Test { A = 1, A = 1 } @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Symbol was defined}} @[test()] @[test()] enum Test { A = 1, B = 2 - 1 } @[test()] @[test()] {{ERROR}} .* {{At line}} .* {{Value was used}} @[test()]