mirror of
https://github.com/zeek/zeek.git
synced 2025-10-13 20:18:20 +00:00
enum type: don't allow mixing of explicit value and auto-increment.
Updated enum type. New description: Enum's are supported in .bif and .bro scripts. An enum in a bif will become available in the event engine and the policy layer. It is possible to assign an explicit value to an enum enumerator element, or the enum type can automatically assign values. However, the styles cannot be mixed. If automatic assignement is used, the first element will have a value of 0, the next will have a value of 1, etc. Enum type variables and identifiers can be formated using the "%s" format specifier, in which case the symbolic name will be printed. If the "%d" format specifier is used, the numerical value is printed. Example automatic assignment: type foo: enum { BAR_A, # value will be 0 BAR_B, # value will be 1 BAR_C, # value will be 2 }; Example with explicit assignment: type foobar: enum { BAR_X = 10, # value will be 10 BAR_Y = 23, # value will be 23 BAR_Z = 42, # value will be 42 }; Enumerator values can only by positive integer literals. The literals can be specified in (0x....), but not in octal (bro policy layer limitation). So, do not use 0123 as value in bifs! Each enumerator value can only be used once per enum (C allows to use the same value multiple times). All these restrictions are enforced by the policy script layer and not the bif compiler! Enums can be redef'ed, i.e., extended. If the enum is automatic increment assignment, then the value will continue to increment. If the enum uses explicit assignment, then the redef need to use explicit assignments as well. Example 1:: redef enum foo += { BAR_D, # value will be 3 BAR_E, # value will be 4 BAR_F, # value will be 5 }; Example 2:: redef enum foobar += { BAR_W = 100, };
This commit is contained in:
parent
72454c230b
commit
fdaeea0ea9
3 changed files with 52 additions and 21 deletions
10
src/parse.y
10
src/parse.y
|
@ -594,8 +594,8 @@ enum_body_elem:
|
|||
assert(cur_enum_type);
|
||||
if ($3->Type()->Tag() != TYPE_COUNT)
|
||||
error("enumerator is not a count constant");
|
||||
if ( cur_enum_type->AddName(current_module, $1, $3->InternalUnsigned(), is_export) < 0 )
|
||||
error("identifier or enumerator value in enumerated type definition already exists");
|
||||
else
|
||||
cur_enum_type->AddName(current_module, $1, $3->InternalUnsigned(), is_export);
|
||||
}
|
||||
| TOK_ID '=' '-' TOK_CONSTANT
|
||||
{
|
||||
|
@ -609,8 +609,7 @@ enum_body_elem:
|
|||
{
|
||||
set_location(@1);
|
||||
assert(cur_enum_type);
|
||||
if ( cur_enum_type->AddName(current_module, $1, is_export) < 0 )
|
||||
error("identifier or enumerator value in enumerated type definition already exists");
|
||||
cur_enum_type->AddName(current_module, $1, is_export);
|
||||
}
|
||||
;
|
||||
|
||||
|
@ -716,9 +715,10 @@ type:
|
|||
$$ = 0;
|
||||
}
|
||||
|
||||
| TOK_ENUM '{' { parser_new_enum(); } enum_body '}'
|
||||
| TOK_ENUM '{' { set_location(@1); parser_new_enum(); } enum_body '}'
|
||||
{
|
||||
set_location(@1, @5);
|
||||
$4->UpdateLocationEndInfo(@5);
|
||||
$$ = $4;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue