Mercurial > octave
diff src/parse.y @ 751:c9f3cb77478d
[project @ 1994-09-30 18:46:17 by jwe]
author | jwe |
---|---|
date | Fri, 30 Sep 1994 18:46:27 +0000 |
parents | 1c072f20b522 |
children | 42731861ee09 |
line wrap: on
line diff
--- a/src/parse.y Fri Sep 30 15:30:54 1994 +0000 +++ b/src/parse.y Fri Sep 30 18:46:27 1994 +0000 @@ -111,6 +111,10 @@ // Nonzero means we're looking at the style part of a plot command. int in_plot_style = 0; +// Nonzero means we're looking at an indirect reference to a structure +// element. +int looking_at_indirect_ref = 0; + // Forward declarations for some functions defined at the bottom of // the file. @@ -132,25 +136,28 @@ static void maybe_warn_assign_as_truth_value (tree_expression *expr); // Build a binary expression. -static tree_expression *make_binary_op (int op, tree_expression *op1, - token *tok_val, - tree_expression *op2); +static tree_expression *make_binary_op + (int op, tree_expression *op1, token *tok_val, tree_expression *op2); // Build a prefix expression. -static tree_expression *make_prefix_op (int op, tree_identifier *op1, - token *tok_val); +static tree_expression *make_prefix_op + (int op, tree_identifier *op1, token *tok_val); // Build a postfix expression. -static tree_expression *make_postfix_op (int op, tree_identifier *op1, - token *tok_val); +static tree_expression *make_postfix_op + (int op, tree_identifier *op1, token *tok_val); // Build a binary expression. -static tree_expression *make_unary_op (int op, tree_expression *op1, - token *tok_val); +static tree_expression *make_unary_op + (int op, tree_expression *op1, token *tok_val); // Make an expression that handles assignment of multiple values. -static tree_expression *make_multi_val_ret (tree_expression *rhs, - int l = -1, int c = -1); +static tree_expression *make_multi_val_ret + (tree_expression *rhs, int l = -1, int c = -1); + +// Make an index expression. +static tree_index_expression *make_index_expression + (tree_indirect_ref *indir, tree_argument_list *args); #define ABORT_PARSE \ do \ @@ -180,6 +187,7 @@ tree_constant *tree_constant_type; tree_matrix *tree_matrix_type; tree_identifier *tree_identifier_type; + tree_indirect_ref *tree_indirect_ref_type; tree_function *tree_function_type; tree_index_expression *tree_index_expression_type; tree_colon_expression *tree_colon_expression_type; @@ -217,6 +225,7 @@ %token <tok_val> TEXT STYLE %token <tok_val> FOR WHILE IF ELSEIF ELSE BREAK CONTINUE FUNC_RET %token <tok_val> GLOBAL +%token <tok_val> TEXT_ID // Other tokens. %token LEXICAL_ERROR @@ -231,6 +240,7 @@ %type <tree_expression_type> ans_expression title %type <tree_matrix_type> matrix %type <tree_identifier_type> identifier +%type <tree_indirect_ref_type> indirect_ref indirect_ref1 %type <tree_function_type> func_def1 func_def2 func_def3 %type <tree_index_expression_type> variable word_list_cmd %type <tree_colon_expression_type> colon_expr @@ -999,22 +1009,28 @@ } ; -variable : identifier +indirect_ref : indirect_ref1 { - $$ = new tree_index_expression - ($1, $1->line (), $1->column ()); + looking_at_indirect_ref = 0; + $$ = $1; } - | identifier '(' arg_list ')' + +indirect_ref1 : identifier { - $$ = new tree_index_expression - ($1, $3, $1->line (), $1->column ()); + $$ = new tree_indirect_ref ($1, $1->line (), + $1->column ()); } - | identifier '(' ')' - { - $$ = new tree_index_expression ($1, 0, $1->line (), - $1->column ()); - } - | identifier '[' + | indirect_ref1 '.' { looking_at_indirect_ref = 1; } TEXT_ID + { $$ = $1->chain ($4->string ()); } + ; + +variable : indirect_ref + { $$ = make_index_expression ($1, 0); } + | indirect_ref '(' ')' + { $$ = make_index_expression ($1, 0); } + | indirect_ref '(' arg_list ')' + { $$ = make_index_expression ($1, $3); } + | indirect_ref '[' { yyerror ("parse error"); error ("use `(\' and `)\' as index operators, not\ @@ -1514,3 +1530,23 @@ return retval; } + +static tree_index_expression * +make_index_expression (tree_indirect_ref *indir, tree_argument_list *args) +{ + tree_index_expression *retval = 0; + + int l = indir->line (); + int c = indir->column (); + + if (indir->is_identifier_only ()) + { + indir->preserve_identifier (); + retval = new tree_index_expression (indir->ident (), args, l, c); + delete indir; + } + else + retval = new tree_index_expression (indir, args, l, c); + + return retval; +}