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
parents b4fa31442a78
children 04694e5b4239
line wrap: on
line diff
--- a/src/parse.y	Mon Oct 28 21:05:31 2002 +0000
+++ b/src/parse.y	Tue Oct 29 17:12:54 2002 +0000
@@ -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 *