pike.git / src / language.yacc

version» Context lines:

pike.git/src/language.yacc:177:   %left F_LSH F_RSH   %left '+' '-'   %left '*' '%' '/'   %right F_NOT '~'   %nonassoc F_INC F_DEC      %{   /* This is the grammar definition of Pike. */      #include "global.h" - RCSID("$Id: language.yacc,v 1.139 1999/12/09 20:22:15 grubba Exp $"); + RCSID("$Id: language.yacc,v 1.140 1999/12/09 22:53:35 grubba Exp $");   #ifdef HAVE_MEMORY_H   #include <memory.h>   #endif      #include "interpret.h"   #include "array.h"   #include "object.h"   #include "stralloc.h"   #include "las.h"   #include "interpret.h"
pike.git/src/language.yacc:569:    yyerror("Missing ';'.");    yyerror("Unexpected end of file.");    }    | modifiers F_CONSTANT error '}' { yyerror("Missing ';'."); }    ;      block_or_semi: block    {    $$ = check_node_hash(mknode(F_COMMA_EXPR,$1,mknode(F_RETURN,mkintnode(0),0)));    } -  | ';' { $$ = NULL;} +  | ';' { $$ = NULL; } +  | F_LEX_EOF { yyerror("Expected ';'."); $$ = NULL; } +  | error { $$ = NULL; }    ;         type_or_error: simple_type    {   #ifdef PIKE_DEBUG    check_type_string(check_node_hash($1)->u.sval.u.string);   #endif /* PIKE_DEBUG */    if(compiler_frame->current_type)    free_string(compiler_frame->current_type);    copy_shared_string(compiler_frame->current_type,$1->u.sval.u.string);    free_node($1);    }    ;    -  + close_paren_or_missing: ')' +  | /* empty */ +  { +  yyerror("Missing ')'."); +  } +  ;    -  + close_brace_or_missing: '}' +  | /* empty */ +  { +  yyerror("Missing '}'."); +  } +  ; +  + close_bracket_or_missing: ']' +  | /* empty */ +  { +  yyerror("Missing ']'."); +  } +  ; +    def: modifiers type_or_error optional_stars F_IDENTIFIER    {    push_compiler_frame(0);    if(!compiler_frame->previous ||    !compiler_frame->previous->current_type)    {    yyerror("Internal compiler fault.");    copy_shared_string(compiler_frame->current_type,    mixed_type_string);    }else{    copy_shared_string(compiler_frame->current_type,    compiler_frame->previous->current_type);    }    } -  '(' arguments ')' +  '(' arguments close_paren_or_missing    {    int e;    /* construct the function type */    push_finished_type(compiler_frame->current_type);    while(--$3>=0) push_type(T_ARRAY);       if(compiler_frame->current_return_type)    free_string(compiler_frame->current_return_type);    compiler_frame->current_return_type=compiler_pop_type();   
pike.git/src/language.yacc:741:    if($3->u.sval.u.string->len &&    islocal($3->u.sval.u.string) >= 0)    my_yyerror("Variable '%s' appears twice in argument list.",    $3->u.sval.u.string->str);       add_local_name($3->u.sval.u.string, compiler_pop_type());    free_node($3);    }    ;    - func_args: '(' arguments ')' { $$=$2; } -  | '(' error ')' { $$=0; yyerrok; } -  | '(' error F_LEX_EOF -  { -  $$=0; yyerror("Missing ')'."); -  yyerror("Unexpected end of file."); -  } -  | '(' error ';' { $$=0; yyerror("Missing ')'."); } -  | '(' error '}' { $$=0; yyerror("Missing ')'."); } + func_args: '(' arguments close_paren_or_missing { $$=$2; }    | error { $$=0; yyerrok; }    ;      arguments: /* empty */ optional_comma { $$=0; }    | arguments2 optional_comma    ;      arguments2: new_arg_name { $$ = 1; }    | arguments2 ',' new_arg_name { $$ = $1 + 1; } -  | arguments2 ',' error -  | arguments2 error +  | arguments2 ':' new_arg_name +  { +  yyerror("Unexpected ':' in argument list."); +  $$ = $1 + 1; +  }    ;      modifier: F_NO_MASK { $$ = ID_NOMASK; }    | F_FINAL_ID { $$ = ID_NOMASK; }    | F_STATIC { $$ = ID_STATIC; }    | F_PRIVATE { $$ = ID_PRIVATE | ID_STATIC; }    | F_LOCAL_ID { $$ = ID_INLINE; }    | F_PUBLIC { $$ = ID_PUBLIC; }    | F_PROTECTED { $$ = ID_PROTECTED; }    | F_INLINE { $$ = ID_INLINE; }
pike.git/src/language.yacc:1523:    {    $$=mknode(F_CASE,$2,0);    }    | F_CASE safe_comma_expr F_DOT_DOT optional_comma_expr expected_colon    {    $$=mknode(F_CASE,$4?$2:0,$4?$4:$2);    }    ;      expected_colon: ':' +  | ';' +  { +  yyerror("Missing ':'."); +  } +  | '{' +  { +  yyerror("Missing ':'."); +  } +  | '}' +  { +  yyerror("Missing ':'."); +  }    | F_LEX_EOF    {    yyerror("Missing ':'.");    yyerror("Unexpected end of file.");    }    ;      return: F_RETURN    {    if(!match_types(compiler_frame->current_return_type,
pike.git/src/language.yacc:1732:    | expr4 '[' error ']' { $$=$1; yyerrok; }    | expr4 '[' error F_LEX_EOF    {    $$=$1; yyerror("Missing ']'.");    yyerror("Unexpected end of file.");    }    | expr4 '[' error ';' { $$=$1; yyerror("Missing ']'."); }    | expr4 '[' error '}' { $$=$1; yyerror("Missing ']'."); }    | expr4 '[' error ')' { $$=$1; yyerror("Missing ']'."); }    | '(' comma_expr2 ')' { $$=$2; } -  | '(' '{' expr_list '}' ')' +  | '(' '{' expr_list close_brace_or_missing ')'    { $$=mkefuncallnode("aggregate",$3); } -  | '(' '[' m_expr_list ']' ')' +  | '(' '[' m_expr_list close_bracket_or_missing ')'    { $$=mkefuncallnode("aggregate_mapping",$3); }    | F_MULTISET_START expr_list F_MULTISET_END    { $$=mkefuncallnode("aggregate_multiset",$2); } -  +  | F_MULTISET_START expr_list ')' +  { +  yyerror("Missing '>'."); +  $$=mkefuncallnode("aggregate_multiset",$2); +  }    | '(' error ')' { $$=0; yyerrok; }    | '(' error F_LEX_EOF    {    $$=0; yyerror("Missing ')'.");    yyerror("Unexpected end of file.");    }    | '(' error ';' { $$=0; yyerror("Missing ')'."); }    | '(' error '}' { $$=0; yyerror("Missing ')'."); } -  +  | F_MULTISET_START error F_MULTISET_END { $$=0; yyerrok; } +  | F_MULTISET_START error ')' { +  yyerror("Missing '>'."); +  $$=0; yyerrok; +  } +  | F_MULTISET_START error F_LEX_EOF +  { +  $$=0; yyerror("Missing '>)'."); +  yyerror("Unexpected end of file."); +  } +  | F_MULTISET_START error ';' { $$=0; yyerror("Missing '>)'."); } +  | F_MULTISET_START error '}' { $$=0; yyerror("Missing '>)'."); }    | expr4 F_ARROW F_IDENTIFIER    {    $$=mknode(F_ARROW,$1,$3);    }    | expr4 F_ARROW bad_identifier {}    | expr4 F_ARROW error {}    ;      idents: low_idents    | idents '.' F_IDENTIFIER
pike.git/src/language.yacc:1971:   catch_arg: '(' comma_expr ')' { $$=$2; }    | '(' error ')' { $$=0; yyerrok; }    | '(' error F_LEX_EOF    {    $$=0; yyerror("Missing ')'.");    yyerror("Unexpected end of file.");    }    | '(' error '}' { $$=0; yyerror("Missing ')'."); }    | '(' error ';' { $$=0; yyerror("Missing ')'."); }    | block +  | error { $$=0; yerror("Bad expression for catch."); }    ;      catch: F_CATCH    {    catch_level++;    }    catch_arg    {    $$=mknode(F_CATCH,$3,NULL);    catch_level--;