Mercurial > hg > octave-avbm
diff src/parse.y @ 4131:597fbc55ea40
[project @ 2002-10-29 17:12:53 by jwe]
author | jwe |
---|---|
date | Tue, 29 Oct 2002 17:12:54 +0000 (2002-10-29) |
parents | b4fa31442a78 |
children | 04694e5b4239 |
line wrap: on
line diff
--- a/src/parse.y +++ b/src/parse.y @@ -291,6 +291,10 @@ static tree_index_expression * make_indirect_ref (tree_expression *expr, const std::string&); +// Make an indirect reference expression with dynamic field name. +static tree_index_expression * +make_indirect_ref (tree_expression *expr, tree_expression *field); + // Make a declaration command. static tree_decl_command * make_decl_command (int tok, token *tok_val, tree_decl_init_list *lst); @@ -696,7 +700,7 @@ } ; -parsing_indir : // empty +indirect_ref_op : '.' { lexer_flags.looking_at_indirect_ref = true; } ; @@ -718,8 +722,10 @@ { $$ = make_postfix_op (QUOTE, $1, $2); } | postfix_expr TRANSPOSE { $$ = make_postfix_op (TRANSPOSE, $1, $2); } - | postfix_expr '.' parsing_indir STRUCT_ELT - { $$ = make_indirect_ref ($1, $4->text ()); } + | postfix_expr indirect_ref_op STRUCT_ELT + { $$ = make_indirect_ref ($1, $3->text ()); } + | postfix_expr indirect_ref_op '(' expression ')' + { $$ = make_indirect_ref ($1, $4); } ; prefix_expr : postfix_expr @@ -2656,6 +2662,32 @@ return retval; } +// Make an indirect reference expression with dynamic field name. + +static tree_index_expression * +make_indirect_ref (tree_expression *expr, tree_expression *elt) +{ + tree_index_expression *retval = 0; + + int l = expr->line (); + int c = expr->column (); + + if (expr->is_index_expression ()) + { + tree_index_expression *tmp = static_cast<tree_index_expression *> (expr); + + tmp->append (elt); + + retval = tmp; + } + else + retval = new tree_index_expression (expr, elt, l, c); + + lexer_flags.looking_at_indirect_ref = false; + + return retval; +} + // Make a declaration command. static tree_decl_command *