pike.git
/
src
/
language.yacc
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/language.yacc:90:
%token TOK_STRING_ID %token TOK_SUB_EQ %token TOK_TYPEDEF %token TOK_TYPEOF %token TOK_VARIANT %token TOK_VERSION %token TOK_VOID_ID %token TOK_WHILE %token TOK_XOR_EQ %token TOK_OPTIONAL
+
%token TOK_SAFE_INDEX
+
%token TOK_SAFE_START_INDEX
%right '=' %right '?'
-
+
%left TOK_LOR %left TOK_LAND %left '|' %left '^' %left '&' %left TOK_EQ TOK_NE %left '>' TOK_GE '<' TOK_LE /* nonassoc? */ %left TOK_LSH TOK_RSH %left '+' '-' %left '*' '%' '/'
pike.git/src/language.yacc:3742:
COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); } | expr4 open_bracket_with_line_info range_bound expected_dot_dot range_bound ']' { $$=mknode(F_RANGE,$1,mknode(':',$3,$5)); COPY_LINE_NUMBER_INFO($$, $2); free_node ($2); }
+
| expr4 TOK_SAFE_START_INDEX line_number_info expr0 ']'
+
{
+
/* A?[X] to ((tmp=A) && tmp[X]) */
+
if( $1->token == F_LOCAL )
+
{
+
$$=mknode(F_LAND, $1, mknode(F_INDEX, $1, $4));
+
}
+
else
+
{
+
fix_type_field( $1 );
+
if( $1->type )
+
{
+
int temporary;
+
$1->type->refs++;
+
+
temporary = add_local_name(empty_pike_string, $1->type, 0);
+
Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED;
+
$$=mknode(F_LAND,
+
mknode(F_ASSIGN, $1, mklocalnode(temporary,0)),
+
mknode(F_INDEX, mklocalnode(temporary,0), $4));
+
}
+
else
+
{
+
$$=mknode(F_INDEX, $1,$4);
+
yyerror("Indexing unexpected value.");
+
}
+
}
+
COPY_LINE_NUMBER_INFO($$, $3);
+
free_node ($3);
+
}
+
| expr4 TOK_SAFE_START_INDEX line_number_info
+
range_bound expected_dot_dot range_bound ']'
+
{
+
/* A?[X..Y] to ((tmp=A) && tmp[X..Y]) */
+
node *range = mknode(':',$4,$6);
+
if( $1->token == F_LOCAL )
+
{
+
$$ = mknode( F_LAND, $1, mknode(F_RANGE, $1, range) );
+
}
+
else
+
{
+
fix_type_field( $1 );
+
if( $1->type )
+
{
+
int temporary;
+
$1->type->refs++;
+
+
temporary = add_local_name(empty_pike_string, $1->type, 0);
+
Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED;
+
$$=mknode(F_LAND,
+
mknode(F_ASSIGN, $1, mklocalnode(temporary,0) ),
+
mknode(F_RANGE, mklocalnode(temporary,0), range) );
+
}
+
else
+
{
+
$$ = mknode( F_LAND, $1, mknode(F_RANGE,$1,range) );
+
yyerror("Indexing unexpected value.");
+
}
+
}
+
COPY_LINE_NUMBER_INFO($$, $3);
+
free_node ($3);
+
+
+
COPY_LINE_NUMBER_INFO($$, $3);
+
free_node ($3);
+
}
| expr4 open_bracket_with_line_info error ']' { $$=$1; free_node ($2); yyerrok; } | expr4 open_bracket_with_line_info error TOK_LEX_EOF { $$=$1; yyerror("Missing ']'."); yyerror("Unexpected end of file.");
pike.git/src/language.yacc:3825:
yyerror("Unexpected end of file."); } | TOK_MULTISET_START line_number_info error ';' { $$=$2; yyerror("Missing '>)'."); } | TOK_MULTISET_START line_number_info error '}' { $$=$2; yyerror("Missing '>)'."); } | expr4 TOK_ARROW line_number_info magic_identifier { $$=mknode(F_ARROW,$1,$4); COPY_LINE_NUMBER_INFO($$, $3); free_node ($3); }
+
| expr4 TOK_SAFE_INDEX line_number_info TOK_IDENTIFIER
+
{
+
/* A?->B to ((tmp=A) && tmp->B) */
+
int temporary;
+
if( $1->token == F_LOCAL )
+
{
+
$$=mknode(F_LAND, $1, mknode(F_ARROW, $1, $4));
+
}
+
else
+
{
+
fix_type_field( $1 );
+
if( $1->type )
+
{
+
$1->type->refs++;
+
+
temporary = add_local_name(empty_pike_string, $1->type, 0);
+
Pike_compiler->compiler_frame->variable[temporary].flags |= LOCAL_VAR_IS_USED;
+
$$=mknode(F_LAND,
+
mknode(F_ASSIGN, $1, mklocalnode(temporary,0)),
+
mknode(F_ARROW, mklocalnode(temporary,0), $4));
+
}
+
else
+
{
+
$$=mknode(F_ARROW, $1,$4);
+
yyerror("Indexing unexpected value.");
+
}
+
}
+
COPY_LINE_NUMBER_INFO($$, $3);
+
free_node ($3);
+
}
| expr4 '.' line_number_info TOK_IDENTIFIER { $$=index_node($1,".",$4->u.sval.u.string); COPY_LINE_NUMBER_INFO($$, $3); free_node ($1); free_node ($3); free_node ($4); } | expr4 TOK_ARROW line_number_info error {$$=$1; free_node ($3);} ;