diff --git a/src/language.yacc b/src/language.yacc index 0b6accd09c640de3877bfe1f9c73514ccbd7138a..ab9ca298d764fc7189ae24288db987c118410ca2 100644 --- a/src/language.yacc +++ b/src/language.yacc @@ -109,7 +109,7 @@ /* This is the grammar definition of Pike. */ #include "global.h" -RCSID("$Id: language.yacc,v 1.189 2000/06/21 15:01:58 grubba Exp $"); +RCSID("$Id: language.yacc,v 1.190 2000/06/22 17:31:39 grubba Exp $"); #ifdef HAVE_MEMORY_H #include <memory.h> #endif @@ -291,6 +291,7 @@ int yylex(YYSTYPE *yylval); %type <n> gauge %type <n> idents %type <n> idents2 +%type <n> inherit_specifier %type <n> lambda %type <n> local_name_list %type <n> local_name_list2 @@ -2354,6 +2355,49 @@ idents: low_idents | idents '.' error {} ; +inherit_specifier: TOK_IDENTIFIER TOK_COLON_COLON + { + /* FIXME: The following doesn't work... + struct program *p = find_named_inherit(new_program, $1->u.sval.u.string); + + if (!p) { + my_yyerror("No such inherit \"%s\".", $1->u.sval.u.string->str); + $$ = 0; + } else { + struct svalue s; + s.type = T_PROGRAM; + s.subtype = 0; + s.u.program = p; + $$ = mkconstantsvaluenode(&s); + } + free_node($1); + */ + } + | inherit_specifier TOK_IDENTIFIER TOK_COLON_COLON + { + /* FIXME: This doesn't work either... + if ($1) { + struct program *p = find_named_inherit($1->u.sval.u.program, + $2->u.sval.u.string); + + if (!p) { + my_yyerror("No such inherit \"%s\".", $2->u.sval.u.string->str); + free_node($1); + $$ = 0; + } else { + struct svalue s; + s.type = T_PROGRAM; + s.subtype = 0; + s.u.program = p; + $$ = mkconstantsvaluenode(&s); + } + } + */ + yywarning("Multi-level ::-resolving not yet supported."); + free_node($2); + } + ; + low_idents: TOK_IDENTIFIER { int i; @@ -2404,27 +2448,27 @@ low_idents: TOK_IDENTIFIER { $$=0; } - | TOK_IDENTIFIER TOK_COLON_COLON TOK_IDENTIFIER + | inherit_specifier TOK_IDENTIFIER { if(last_identifier) free_string(last_identifier); - copy_shared_string(last_identifier, $3->u.sval.u.string); + copy_shared_string(last_identifier, $2->u.sval.u.string); - $$=reference_inherited_identifier($1->u.sval.u.string, - $3->u.sval.u.string); + $$ = reference_inherited_identifier($1->u.sval.u.string, + $2->u.sval.u.string); if (!$$) { - my_yyerror("Undefined identifier %s::%s", + my_yyerror("Undefined identifier %s::%s.", $1->u.sval.u.string->str, - $3->u.sval.u.string->str); + $2->u.sval.u.string->str); $$=0; } free_node($1); - free_node($3); + free_node($2); } - | TOK_IDENTIFIER TOK_COLON_COLON bad_identifier - | TOK_IDENTIFIER TOK_COLON_COLON error + | inherit_specifier bad_identifier + | inherit_specifier error | TOK_COLON_COLON TOK_IDENTIFIER { int e,i;