pike.git/
src/
language.yacc
Branch:
Tag:
Non-build tags
All tags
No tags
2020-01-09
2020-01-09 10:18:32 by Henrik Grubbström (Grubba) <grubba@grubba.org>
1bcfb7babef20c20b96a50c47f0b3c0dbc8f03b8 (
93
lines) (+
61
/-
32
)
[
Show
|
Annotate
]
Branch:
master
Compiler: Syntax for specifying the length of array and string types.
1522:
| TOK_FUNCTION_ID opt_function_type {} | TOK_OBJECT_ID opt_program_type {} | TOK_PROGRAM_ID opt_program_type { push_type(T_PROGRAM); }
-
| TOK_ARRAY_ID opt_array_type
{ push_unlimited_array_type(T_ARRAY); }
-
| TOK_MULTISET_ID opt_
array
_type
{ push_type(T_MULTISET); }
+
| TOK_ARRAY_ID opt_array_type
{}
+
| TOK_MULTISET_ID opt_
multiset
_type { push_type(T_MULTISET); }
| TOK_ATTRIBUTE_ID '(' string_constant ',' full_type ')' { push_type_attribute($3->u.sval.u.string);
1625:
} ;
-
opt
_int_range:
/* Empty */
+
safe
_int_range
_type
:
TOK_BITS
{
-
push_int_type(
MIN_INT_TYPE
,
MAX
_
INT_TYPE
);
+
push_int_type(
0
,
(1<<$1->u.sval.u.integer)-1 );
+
free
_
node( $1
);
}
-
|
'('
TOK
_
BITS
')'
+
|
number_or_minint
expected
_
dot_dot
number_or_maxint
{
-
push_int_type( 0, (1<<$2->u.sval.u.integer)-1 );
-
free_node( $2 );
-
}
-
| '(' number_or_minint expected_dot_dot number_or_maxint ')'
-
{
+
INT_TYPE min = MIN_INT_TYPE; INT_TYPE max = MAX_INT_TYPE;
-
/* FIXME: Check that
$4
is >=
$2
. */
-
if(
$4
->token == F_CONSTANT) {
-
if (TYPEOF(
$4
->u.sval) == T_INT) {
-
max =
$4
->u.sval.u.integer;
-
} else if (is_bignum_object_in_svalue(&
$4
->u.sval)) {
+
/* FIXME: Check that
$3
is >=
$1
. */
+
if(
$3
->token == F_CONSTANT) {
+
if (TYPEOF(
$3
->u.sval) == T_INT) {
+
max =
$3
->u.sval.u.integer;
+
} else if (is_bignum_object_in_svalue(&
$3
->u.sval)) {
push_int(0);
-
if (is_lt(&
$4
->u.sval, Pike_sp-1)) {
+
if (is_lt(&
$3
->u.sval, Pike_sp-1)) {
max = MIN_INT_TYPE; } pop_stack(); } }
-
if(
$2
->token == F_CONSTANT) {
-
if (TYPEOF(
$2
->u.sval) == T_INT) {
-
min =
$2
->u.sval.u.integer;
-
} else if (is_bignum_object_in_svalue(&
$2
->u.sval)) {
+
if(
$1
->token == F_CONSTANT) {
+
if (TYPEOF(
$1
->u.sval) == T_INT) {
+
min =
$1
->u.sval.u.integer;
+
} else if (is_bignum_object_in_svalue(&
$1
->u.sval)) {
push_int(0);
-
if (is_lt(Pike_sp-1, &
$2
->u.sval)) {
+
if (is_lt(Pike_sp-1, &
$1
->u.sval)) {
min = MAX_INT_TYPE; } pop_stack();
1666:
push_int_type(min, max);
-
free_node(
$2
);
-
free_node(
$4
);
+
free_node(
$1
);
+
free_node(
$3
);
}
-
|
'('
number
')'
+
| number
{ INT_TYPE val = MAX_INT_TYPE;
-
if(
$2
->token == F_CONSTANT) {
-
if (TYPEOF(
$2
->u.sval) == T_INT) {
-
val =
$2
->u.sval.u.integer;
-
} else if (is_bignum_object_in_svalue(&
$2
->u.sval)) {
+
if(
$1
->token == F_CONSTANT) {
+
if (TYPEOF(
$1
->u.sval) == T_INT) {
+
val =
$1
->u.sval.u.integer;
+
} else if (is_bignum_object_in_svalue(&
$1
->u.sval)) {
push_int(0);
-
if (is_lt(&
$2
->u.sval, Pike_sp-1)) {
+
if (is_lt(&
$1
->u.sval, Pike_sp-1)) {
val = MIN_INT_TYPE; } pop_stack();
1687:
push_int_type(val, val);
-
free_node(
$2
);
+
free_node(
$1
);
}
-
|
'('
error
')'
+
| error
{ push_int_type(MIN_INT32, MAX_INT32); yyerror("Expected integer range."); } ;
-
+
opt_int_range: /* Empty */
+
{
+
push_int_type(MIN_INT_TYPE, MAX_INT_TYPE);
+
}
+
| '(' safe_int_range_type ')'
+
;
+
opt_string_width: opt_int_range { push_unlimited_array_type(T_STRING); }
-
+
| '(' safe_int_range_type ':' safe_int_range_type ')'
+
{
+
push_reverse_type(T_STRING);
+
}
+
| '(' safe_int_range_type ':' ')'
+
{
+
push_finished_type(int_type_string);
+
push_reverse_type(T_STRING);
+
}
+
| '(' ':' safe_int_range_type ')'
+
{
+
push_unlimited_array_type(T_STRING);
+
}
; opt_program_type: /* Empty */ { push_object_type(0, 0); }
1773:
full_type ;
-
opt_
array
_type: '(' full_type ')'
+
opt_
multiset
_type: '(' full_type ')'
| { push_type(T_MIXED); } ;
-
+
opt_array_type: '(' full_type ')'
+
{ push_unlimited_array_type(T_ARRAY); }
+
| /* Empty */
+
{ push_type(T_MIXED); push_unlimited_array_type(T_ARRAY); }
+
| '(' safe_int_range_type ':' full_type ')'
+
{ push_reverse_type(T_ARRAY); }
+
| '(' ':' full_type ')'
+
{ push_unlimited_array_type(T_ARRAY); }
+
| '(' safe_int_range_type ':' ')'
+
{ push_type(T_MIXED); push_reverse_type(T_ARRAY); }
+
;
+
opt_mapping_type: '(' { }