diff --git a/parse.y b/parse.y index 3ee7e1be8..1928c037d 100644 --- a/parse.y +++ b/parse.y @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) -#ident "$Id: parse.y,v 1.69 1999/09/29 21:16:32 steve Exp $" +#ident "$Id: parse.y,v 1.70 1999/09/29 22:56:31 steve Exp $" #endif # include "parse_misc.h" @@ -139,12 +139,13 @@ extern void lex_end_table(); %type task_body %type func_body %type range_or_type_opt +%type event_expression_list %type event_expression %type event_control %type statement statement_opt %type statement_list -%left '?' ':' +%right '?' ':' %left K_LOR %left K_LAND %left '|' @@ -157,6 +158,10 @@ extern void lex_end_table(); %left '*' '/' '%' %left UNARY_PREC +/* to resolve dangling else ambiguity: */ +%nonassoc less_than_K_else +%nonassoc K_else + %% source_file @@ -328,7 +333,7 @@ event_control { yyerror(@1, "sorry: event control not supported."); $$ = 0; } - | '@' '(' event_expression ')' + | '@' '(' event_expression_list ')' { PEventStatement*tmp = new PEventStatement(*$3); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); @@ -341,6 +346,17 @@ event_control } ; +event_expression_list + : event_expression + { $$ = $1; } + | event_expression_list K_or event_expression + { svector*tmp = new svector(*$1, *$3); + delete $1; + delete $3; + $$ = tmp; + } + ; + event_expression : K_posedge expression { PEEvent*tmp = new PEEvent(NetNEvent::POSEDGE, $2); @@ -366,12 +382,6 @@ event_expression (*tl)[0] = tmp; $$ = tl; } - | event_expression K_or event_expression - { svector*tmp = new svector(*$1, *$3); - delete $1; - delete $3; - $$ = tmp; - } ; expression @@ -1514,7 +1524,7 @@ statement { yyerrok; } | K_casez '(' expression ')' error K_endcase { yyerrok; } - | K_if '(' expression ')' statement_opt + | K_if '(' expression ')' statement_opt %prec less_than_K_else { PCondit*tmp = new PCondit($3, $5, 0); tmp->set_file(@1.text); tmp->set_lineno(@1.first_line); @@ -1526,7 +1536,7 @@ statement tmp->set_lineno(@1.first_line); $$ = tmp; } - | K_if '(' error ')' statement_opt + | K_if '(' error ')' statement_opt %prec less_than_K_else { yyerror(@1, "error: Malformed conditional expression."); $$ = $5; }