diff options
author | Pierre Muller <muller@ics.u-strasbg.fr> | 2013-11-17 20:42:16 +0100 |
---|---|---|
committer | Pierre Muller <muller@ics.u-strasbg.fr> | 2013-12-06 09:37:35 +0100 |
commit | 8662d513466e5743274a36d12f6b63a524e68c0a (patch) | |
tree | 39ad43177a31835428c89be7faaf378be872990e /gdb/p-exp.y | |
parent | da361ebd2db2ca7696fbb7b45e2661f80c069c72 (diff) | |
download | gdb-8662d513466e5743274a36d12f6b63a524e68c0a.zip gdb-8662d513466e5743274a36d12f6b63a524e68c0a.tar.gz gdb-8662d513466e5743274a36d12f6b63a524e68c0a.tar.bz2 |
Fix completion for pascal language.
* p-exp.y (exp : field_exp name): Do not call mark_struct_expression.
(exp : field_exp name COMPLETE): New rule.
(exp : SIZEOF): Set correct current_type.
(last_was_structop): Remove static variable.
(yylex): Remove saw_structop local variable.
Adapt code to removal of variables above.
Diffstat (limited to 'gdb/p-exp.y')
-rw-r--r-- | gdb/p-exp.y | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/gdb/p-exp.y b/gdb/p-exp.y index 0120e22..7b15dce 100644 --- a/gdb/p-exp.y +++ b/gdb/p-exp.y @@ -316,8 +316,7 @@ exp : field_exp FIELDNAME exp : field_exp name - { mark_struct_expression (); - write_exp_elt_opcode (STRUCTOP_STRUCT); + { write_exp_elt_opcode (STRUCTOP_STRUCT); write_exp_string ($2); write_exp_elt_opcode (STRUCTOP_STRUCT); search_field = 0; @@ -332,7 +331,12 @@ exp : field_exp name } } ; - +exp : field_exp name COMPLETE + { mark_struct_expression (); + write_exp_elt_opcode (STRUCTOP_STRUCT); + write_exp_string ($2); + write_exp_elt_opcode (STRUCTOP_STRUCT); } + ; exp : field_exp COMPLETE { struct stoken s; mark_struct_expression (); @@ -581,13 +585,15 @@ exp : VARIABLE exp : SIZEOF '(' type ')' %prec UNARY { write_exp_elt_opcode (OP_LONG); write_exp_elt_type (parse_type->builtin_int); + current_type = parse_type->builtin_int; CHECK_TYPEDEF ($3); write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3)); write_exp_elt_opcode (OP_LONG); } ; exp : SIZEOF '(' exp ')' %prec UNARY - { write_exp_elt_opcode (UNOP_SIZEOF); } + { write_exp_elt_opcode (UNOP_SIZEOF); + current_type = parse_type->builtin_int; } exp : STRING { /* C strings are converted into array constants with @@ -1120,11 +1126,6 @@ uptok (const char *tokstart, int namelen) return uptokstart; } -/* This is set if the previously-returned token was a structure - operator '.'. This is used only when parsing to - do field name completion. */ -static int last_was_structop; - /* Read one token, getting characters through lexptr. */ static int @@ -1139,9 +1140,7 @@ yylex (void) int explen, tempbufindex; static char *tempbuf; static int tempbufsize; - int saw_structop = last_was_structop; - last_was_structop = 0; retry: prev_lexptr = lexptr; @@ -1178,7 +1177,7 @@ yylex (void) switch (c = *tokstart) { case 0: - if (saw_structop && search_field) + if (search_field && parse_completion) return COMPLETE; else return 0; @@ -1243,8 +1242,6 @@ yylex (void) /* Might be a floating point number. */ if (lexptr[1] < '0' || lexptr[1] > '9') { - if (parse_completion) - last_was_structop = 1; goto symbol; /* Nope, must be a symbol. */ } @@ -1535,7 +1532,7 @@ yylex (void) if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field || parse_completion) + if (is_a_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, @@ -1550,7 +1547,7 @@ yylex (void) } if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field || parse_completion) + if (is_a_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, @@ -1572,7 +1569,7 @@ yylex (void) } if (search_field && current_type) is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL); - if (is_a_field || parse_completion) + if (is_a_field) sym = NULL; else sym = lookup_symbol (tmp, expression_context_block, |