1
0
mirror of https://github.com/twiglet/cs2j.git synced 2025-01-18 13:15:17 +01:00

If the enum value is a simple numeric literal, then use that as the index for the members map

This commit is contained in:
Kevin Glynn 2010-11-16 16:01:56 +01:00
parent f9e748242c
commit 84983f7a83

View File

@ -25,7 +25,7 @@ scope NSContext {
@header
{
using System.Globalization;
}
@members
@ -722,8 +722,26 @@ enum_member_declarations
e=enum_member_declaration[members,ref next] (',' enum_member_declaration[members, ref next])*
->
;
enum_member_declaration[ SortedList<int,CommonTree> members, ref int next]:
attributes? identifier { $members[next] = $identifier.tree; $next++; } (('=' expression)?)! ;
enum_member_declaration[ SortedList<int,CommonTree> members, ref int next]
@init {
int calcValue = 0;
}:
// Fill in members, a map from enum's value to AST
attributes? identifier { $members[$next] = $identifier.tree; $next++; }
((eq='=' ( ((NUMBER | Hex_number) (','|'}')) =>
{ Console.Out.WriteLine($i); $members.Remove($next-1); }
(i=NUMBER { calcValue = Int32.Parse($i.text); }
| i=Hex_number { calcValue = Int32.Parse($i.text.Substring(2), NumberStyles.AllowHexSpecifier); } )
{ if (calcValue < 0 || calcValue > Int32.MaxValue) {
Warning($eq.line, "[UNSUPPORTED] enum member's value initialization ignored, only numeric literals in the range 0..MAXINT supported for enum values");
calcValue = $next-1;
}
else if (calcValue < $next-1) {
Warning($eq.line, "[UNSUPPORTED] enum member's value initialization ignored, value has already been assigned and enum values must be unique");
calcValue = $next-1;
}
$members[calcValue] = $identifier.tree; $next = calcValue + 1; }
| expression { Warning($eq.line, "[UNSUPPORTED] enum member's value initialization ignored, only numeric literals supported for enum values"); } ))?)! ;
//enum_modifiers:
// enum_modifier+ ;
//enum_modifier: