pike.git / src / language.yacc

version» Context lines:

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);}    ;