xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/d-exp.y (revision 479d8f7d843cc1b22d497efdf1f27a50ee8418d4)
1 /* YACC parser for D expressions, for GDB.
2 
3    Copyright (C) 2014-2015 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 /* This file is derived from c-exp.y, jv-exp.y.  */
21 
22 /* Parse a D expression from text in a string,
23    and return the result as a struct expression pointer.
24    That structure contains arithmetic operations in reverse polish,
25    with constants represented by operations that are followed by special data.
26    See expression.h for the details of the format.
27    What is important here is that it can be built up sequentially
28    during the process of parsing; the lower levels of the tree always
29    come first in the result.
30 
31    Note that malloc's and realloc's in this file are transformed to
32    xmalloc and xrealloc respectively by the same sed command in the
33    makefile that remaps any other malloc/realloc inserted by the parser
34    generator.  Doing this with #defines and trying to control the interaction
35    with include files (<malloc.h> and <stdlib.h> for example) just became
36    too messy, particularly when such includes can be inserted at random
37    times by the parser generator.  */
38 
39 %{
40 
41 #include "defs.h"
42 #include <ctype.h>
43 #include "expression.h"
44 #include "value.h"
45 #include "parser-defs.h"
46 #include "language.h"
47 #include "c-lang.h"
48 #include "d-lang.h"
49 #include "bfd.h" /* Required by objfiles.h.  */
50 #include "symfile.h" /* Required by objfiles.h.  */
51 #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
52 #include "charset.h"
53 #include "block.h"
54 
55 #define parse_type(ps) builtin_type (parse_gdbarch (ps))
56 #define parse_d_type(ps) builtin_d_type (parse_gdbarch (ps))
57 
58 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
59    as well as gratuitiously global symbol names, so we can have multiple
60    yacc generated parsers in gdb.  Note that these are only the variables
61    produced by yacc.  If other parser generators (bison, byacc, etc) produce
62    additional global names that conflict at link time, then those parser
63    generators need to be fixed instead of adding those names to this list.  */
64 
65 #define	yymaxdepth d_maxdepth
66 #define	yyparse	d_parse_internal
67 #define	yylex	d_lex
68 #define	yyerror	d_error
69 #define	yylval	d_lval
70 #define	yychar	d_char
71 #define	yydebug	d_debug
72 #define	yypact	d_pact
73 #define	yyr1	d_r1
74 #define	yyr2	d_r2
75 #define	yydef	d_def
76 #define	yychk	d_chk
77 #define	yypgo	d_pgo
78 #define	yyact	d_act
79 #define	yyexca	d_exca
80 #define	yyerrflag d_errflag
81 #define	yynerrs	d_nerrs
82 #define	yyps	d_ps
83 #define	yypv	d_pv
84 #define	yys	d_s
85 #define	yy_yys	d_yys
86 #define	yystate	d_state
87 #define	yytmp	d_tmp
88 #define	yyv	d_v
89 #define	yy_yyv	d_yyv
90 #define	yyval	d_val
91 #define	yylloc	d_lloc
92 #define	yyreds	d_reds	/* With YYDEBUG defined */
93 #define	yytoks	d_toks	/* With YYDEBUG defined */
94 #define	yyname	d_name	/* With YYDEBUG defined */
95 #define	yyrule	d_rule	/* With YYDEBUG defined */
96 #define	yylhs	d_yylhs
97 #define	yylen	d_yylen
98 #define	yydefre	d_yydefred
99 #define	yydgoto	d_yydgoto
100 #define	yysindex d_yysindex
101 #define	yyrindex d_yyrindex
102 #define	yygindex d_yygindex
103 #define	yytable	d_yytable
104 #define	yycheck	d_yycheck
105 #define	yyss	d_yyss
106 #define	yysslim	d_yysslim
107 #define	yyssp	d_yyssp
108 #define	yystacksize d_yystacksize
109 #define	yyvs	d_yyvs
110 #define	yyvsp	d_yyvsp
111 
112 #ifndef YYDEBUG
113 #define YYDEBUG 1	/* Default to yydebug support */
114 #endif
115 
116 #define YYFPRINTF parser_fprintf
117 
118 /* The state of the parser, used internally when we are parsing the
119    expression.  */
120 
121 static struct parser_state *pstate = NULL;
122 
123 int yyparse (void);
124 
125 static int yylex (void);
126 
127 void yyerror (char *);
128 
129 %}
130 
131 /* Although the yacc "value" of an expression is not used,
132    since the result is stored in the structure being created,
133    other node types do have values.  */
134 
135 %union
136   {
137     struct {
138       LONGEST val;
139       struct type *type;
140     } typed_val_int;
141     struct {
142       DOUBLEST dval;
143       struct type *type;
144     } typed_val_float;
145     struct symbol *sym;
146     struct type *tval;
147     struct typed_stoken tsval;
148     struct stoken sval;
149     struct ttype tsym;
150     struct symtoken ssym;
151     int ival;
152     struct block *bval;
153     enum exp_opcode opcode;
154     struct stoken_vector svec;
155   }
156 
157 %{
158 /* YYSTYPE gets defined by %union */
159 static int parse_number (struct parser_state *, const char *,
160 			 int, int, YYSTYPE *);
161 
162 static void push_expression_name (struct parser_state *, struct stoken);
163 %}
164 
165 %token <sval> IDENTIFIER
166 %token <tsym> TYPENAME
167 %token <voidval> COMPLETE
168 
169 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
170    but which would parse as a valid number in the current input radix.
171    E.g. "c" when input_radix==16.  Depending on the parse, it will be
172    turned into a name or into a number.  */
173 
174 %token <sval> NAME_OR_INT
175 
176 %token <typed_val_int> INTEGER_LITERAL
177 %token <typed_val_float> FLOAT_LITERAL
178 %token <tsval> CHARACTER_LITERAL
179 %token <tsval> STRING_LITERAL
180 
181 %type <svec> StringExp
182 %type <tval> BasicType TypeExp
183 %type <sval> IdentifierExp
184 %type <ival> ArrayLiteral
185 
186 %token ENTRY
187 %token ERROR
188 
189 /* Keywords that have a constant value.  */
190 %token TRUE_KEYWORD FALSE_KEYWORD NULL_KEYWORD
191 /* Class 'super' accessor.  */
192 %token SUPER_KEYWORD
193 /* Properties.  */
194 %token CAST_KEYWORD SIZEOF_KEYWORD
195 %token TYPEOF_KEYWORD TYPEID_KEYWORD
196 %token INIT_KEYWORD
197 /* Comparison keywords.  */
198 /* Type storage classes.  */
199 %token IMMUTABLE_KEYWORD CONST_KEYWORD SHARED_KEYWORD
200 /* Non-scalar type keywords.  */
201 %token STRUCT_KEYWORD UNION_KEYWORD
202 %token CLASS_KEYWORD INTERFACE_KEYWORD
203 %token ENUM_KEYWORD TEMPLATE_KEYWORD
204 %token DELEGATE_KEYWORD FUNCTION_KEYWORD
205 
206 %token <sval> DOLLAR_VARIABLE
207 
208 %token <opcode> ASSIGN_MODIFY
209 
210 %left ','
211 %right '=' ASSIGN_MODIFY
212 %right '?'
213 %left OROR
214 %left ANDAND
215 %left '|'
216 %left '^'
217 %left '&'
218 %left EQUAL NOTEQUAL '<' '>' LEQ GEQ
219 %right LSH RSH
220 %left '+' '-'
221 %left '*' '/' '%'
222 %right HATHAT
223 %left IDENTITY NOTIDENTITY
224 %right INCREMENT DECREMENT
225 %right '.' '[' '('
226 %token DOTDOT
227 
228 
229 %%
230 
231 start   :
232 	Expression
233 |	TypeExp
234 ;
235 
236 /* Expressions, including the comma operator.  */
237 
238 Expression:
239 	CommaExpression
240 ;
241 
242 CommaExpression:
243 	AssignExpression
244 |	AssignExpression ',' CommaExpression
245 		{ write_exp_elt_opcode (pstate, BINOP_COMMA); }
246 ;
247 
248 AssignExpression:
249 	ConditionalExpression
250 |	ConditionalExpression '=' AssignExpression
251 		{ write_exp_elt_opcode (pstate, BINOP_ASSIGN); }
252 |	ConditionalExpression ASSIGN_MODIFY AssignExpression
253 		{ write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY);
254 		  write_exp_elt_opcode (pstate, $2);
255 		  write_exp_elt_opcode (pstate, BINOP_ASSIGN_MODIFY); }
256 ;
257 
258 ConditionalExpression:
259 	OrOrExpression
260 |	OrOrExpression '?' Expression ':' ConditionalExpression
261 		{ write_exp_elt_opcode (pstate, TERNOP_COND); }
262 ;
263 
264 OrOrExpression:
265 	AndAndExpression
266 |	OrOrExpression OROR AndAndExpression
267 		{ write_exp_elt_opcode (pstate, BINOP_LOGICAL_OR); }
268 ;
269 
270 AndAndExpression:
271 	OrExpression
272 |	AndAndExpression ANDAND OrExpression
273 		{ write_exp_elt_opcode (pstate, BINOP_LOGICAL_AND); }
274 ;
275 
276 OrExpression:
277 	XorExpression
278 |	OrExpression '|' XorExpression
279 		{ write_exp_elt_opcode (pstate, BINOP_BITWISE_IOR); }
280 ;
281 
282 XorExpression:
283 	AndExpression
284 |	XorExpression '^' AndExpression
285 		{ write_exp_elt_opcode (pstate, BINOP_BITWISE_XOR); }
286 ;
287 
288 AndExpression:
289 	CmpExpression
290 |	AndExpression '&' CmpExpression
291 		{ write_exp_elt_opcode (pstate, BINOP_BITWISE_AND); }
292 ;
293 
294 CmpExpression:
295 	ShiftExpression
296 |	EqualExpression
297 |	IdentityExpression
298 |	RelExpression
299 ;
300 
301 EqualExpression:
302 	ShiftExpression EQUAL ShiftExpression
303 		{ write_exp_elt_opcode (pstate, BINOP_EQUAL); }
304 |	ShiftExpression NOTEQUAL ShiftExpression
305 		{ write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
306 ;
307 
308 IdentityExpression:
309 	ShiftExpression IDENTITY ShiftExpression
310 		{ write_exp_elt_opcode (pstate, BINOP_EQUAL); }
311 |	ShiftExpression NOTIDENTITY ShiftExpression
312 		{ write_exp_elt_opcode (pstate, BINOP_NOTEQUAL); }
313 ;
314 
315 RelExpression:
316 	ShiftExpression '<' ShiftExpression
317 		{ write_exp_elt_opcode (pstate, BINOP_LESS); }
318 |	ShiftExpression LEQ ShiftExpression
319 		{ write_exp_elt_opcode (pstate, BINOP_LEQ); }
320 |	ShiftExpression '>' ShiftExpression
321 		{ write_exp_elt_opcode (pstate, BINOP_GTR); }
322 |	ShiftExpression GEQ ShiftExpression
323 		{ write_exp_elt_opcode (pstate, BINOP_GEQ); }
324 ;
325 
326 ShiftExpression:
327 	AddExpression
328 |	ShiftExpression LSH AddExpression
329 		{ write_exp_elt_opcode (pstate, BINOP_LSH); }
330 |	ShiftExpression RSH AddExpression
331 		{ write_exp_elt_opcode (pstate, BINOP_RSH); }
332 ;
333 
334 AddExpression:
335 	MulExpression
336 |	AddExpression '+' MulExpression
337 		{ write_exp_elt_opcode (pstate, BINOP_ADD); }
338 |	AddExpression '-' MulExpression
339 		{ write_exp_elt_opcode (pstate, BINOP_SUB); }
340 |	AddExpression '~' MulExpression
341 		{ write_exp_elt_opcode (pstate, BINOP_CONCAT); }
342 ;
343 
344 MulExpression:
345 	UnaryExpression
346 |	MulExpression '*' UnaryExpression
347 		{ write_exp_elt_opcode (pstate, BINOP_MUL); }
348 |	MulExpression '/' UnaryExpression
349 		{ write_exp_elt_opcode (pstate, BINOP_DIV); }
350 |	MulExpression '%' UnaryExpression
351 		{ write_exp_elt_opcode (pstate, BINOP_REM); }
352 
353 UnaryExpression:
354 	'&' UnaryExpression
355 		{ write_exp_elt_opcode (pstate, UNOP_ADDR); }
356 |	INCREMENT UnaryExpression
357 		{ write_exp_elt_opcode (pstate, UNOP_PREINCREMENT); }
358 |	DECREMENT UnaryExpression
359 		{ write_exp_elt_opcode (pstate, UNOP_PREDECREMENT); }
360 |	'*' UnaryExpression
361 		{ write_exp_elt_opcode (pstate, UNOP_IND); }
362 |	'-' UnaryExpression
363 		{ write_exp_elt_opcode (pstate, UNOP_NEG); }
364 |	'+' UnaryExpression
365 		{ write_exp_elt_opcode (pstate, UNOP_PLUS); }
366 |	'!' UnaryExpression
367 		{ write_exp_elt_opcode (pstate, UNOP_LOGICAL_NOT); }
368 |	'~' UnaryExpression
369 		{ write_exp_elt_opcode (pstate, UNOP_COMPLEMENT); }
370 |	CastExpression
371 |	PowExpression
372 ;
373 
374 CastExpression:
375 	CAST_KEYWORD '(' TypeExp ')' UnaryExpression
376 		{ write_exp_elt_opcode (pstate, UNOP_CAST);
377 		  write_exp_elt_type (pstate, $3);
378 		  write_exp_elt_opcode (pstate, UNOP_CAST); }
379 	/* C style cast is illegal D, but is still recognised in
380 	   the grammar, so we keep this around for convenience.  */
381 |	'(' TypeExp ')' UnaryExpression
382 		{ write_exp_elt_opcode (pstate, UNOP_CAST);
383 		  write_exp_elt_type (pstate, $2);
384 		  write_exp_elt_opcode (pstate, UNOP_CAST); }
385 ;
386 
387 PowExpression:
388 	PostfixExpression
389 |	PostfixExpression HATHAT UnaryExpression
390 		{ write_exp_elt_opcode (pstate, BINOP_EXP); }
391 ;
392 
393 PostfixExpression:
394 	PrimaryExpression
395 |	PostfixExpression INCREMENT
396 		{ write_exp_elt_opcode (pstate, UNOP_POSTINCREMENT); }
397 |	PostfixExpression DECREMENT
398 		{ write_exp_elt_opcode (pstate, UNOP_POSTDECREMENT); }
399 |	CallExpression
400 |	IndexExpression
401 |	SliceExpression
402 ;
403 
404 ArgumentList:
405 	AssignExpression
406 		{ arglist_len = 1; }
407 |	ArgumentList ',' AssignExpression
408 		{ arglist_len++; }
409 ;
410 
411 ArgumentList_opt:
412 	/* EMPTY */
413 		{ arglist_len = 0; }
414 |	ArgumentList
415 ;
416 
417 CallExpression:
418 	PostfixExpression '('
419 		{ start_arglist (); }
420 	ArgumentList_opt ')'
421 		{ write_exp_elt_opcode (pstate, OP_FUNCALL);
422 		  write_exp_elt_longcst (pstate, (LONGEST) end_arglist ());
423 		  write_exp_elt_opcode (pstate, OP_FUNCALL); }
424 ;
425 
426 IndexExpression:
427 	PostfixExpression '[' ArgumentList ']'
428 		{ if (arglist_len > 0)
429 		    {
430 		      write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
431 		      write_exp_elt_longcst (pstate, (LONGEST) arglist_len);
432 		      write_exp_elt_opcode (pstate, MULTI_SUBSCRIPT);
433 		    }
434 		  else
435 		    write_exp_elt_opcode (pstate, BINOP_SUBSCRIPT);
436 		}
437 ;
438 
439 SliceExpression:
440 	PostfixExpression '[' ']'
441 		{ /* Do nothing.  */ }
442 |	PostfixExpression '[' AssignExpression DOTDOT AssignExpression ']'
443 		{ write_exp_elt_opcode (pstate, TERNOP_SLICE); }
444 ;
445 
446 PrimaryExpression:
447 	'(' Expression ')'
448 		{ /* Do nothing.  */ }
449 |	IdentifierExp
450 		{ push_expression_name (pstate, $1); }
451 |	IdentifierExp '.' COMPLETE
452 		{ struct stoken s;
453 		  s.ptr = "";
454 		  s.length = 0;
455 		  push_expression_name (pstate, $1);
456 		  mark_struct_expression (pstate);
457 		  write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
458 		  write_exp_string (pstate, s);
459 		  write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
460 |	IdentifierExp '.' IDENTIFIER COMPLETE
461 		{ push_expression_name (pstate, $1);
462 		  mark_struct_expression (pstate);
463 		  write_exp_elt_opcode (pstate, STRUCTOP_STRUCT);
464 		  write_exp_string (pstate, $3);
465 		  write_exp_elt_opcode (pstate, STRUCTOP_STRUCT); }
466 |	DOLLAR_VARIABLE
467 		{ write_dollar_variable (pstate, $1); }
468 |	NAME_OR_INT
469 		{ YYSTYPE val;
470                   parse_number (pstate, $1.ptr, $1.length, 0, &val);
471 		  write_exp_elt_opcode (pstate, OP_LONG);
472 		  write_exp_elt_type (pstate, val.typed_val_int.type);
473 		  write_exp_elt_longcst (pstate,
474 					 (LONGEST) val.typed_val_int.val);
475 		  write_exp_elt_opcode (pstate, OP_LONG); }
476 |	NULL_KEYWORD
477 		{ struct type *type = parse_d_type (pstate)->builtin_void;
478 		  type = lookup_pointer_type (type);
479 		  write_exp_elt_opcode (pstate, OP_LONG);
480 		  write_exp_elt_type (pstate, type);
481 		  write_exp_elt_longcst (pstate, (LONGEST) 0);
482 		  write_exp_elt_opcode (pstate, OP_LONG); }
483 |	TRUE_KEYWORD
484 		{ write_exp_elt_opcode (pstate, OP_BOOL);
485 		  write_exp_elt_longcst (pstate, (LONGEST) 1);
486 		  write_exp_elt_opcode (pstate, OP_BOOL); }
487 |	FALSE_KEYWORD
488 		{ write_exp_elt_opcode (pstate, OP_BOOL);
489 		  write_exp_elt_longcst (pstate, (LONGEST) 0);
490 		  write_exp_elt_opcode (pstate, OP_BOOL); }
491 |	INTEGER_LITERAL
492 		{ write_exp_elt_opcode (pstate, OP_LONG);
493 		  write_exp_elt_type (pstate, $1.type);
494 		  write_exp_elt_longcst (pstate, (LONGEST)($1.val));
495 		  write_exp_elt_opcode (pstate, OP_LONG); }
496 |	FLOAT_LITERAL
497 		{ write_exp_elt_opcode (pstate, OP_DOUBLE);
498 		  write_exp_elt_type (pstate, $1.type);
499 		  write_exp_elt_dblcst (pstate, $1.dval);
500 		  write_exp_elt_opcode (pstate, OP_DOUBLE); }
501 |	CHARACTER_LITERAL
502 		{ struct stoken_vector vec;
503 		  vec.len = 1;
504 		  vec.tokens = &$1;
505 		  write_exp_string_vector (pstate, $1.type, &vec); }
506 |	StringExp
507 		{ int i;
508 		  write_exp_string_vector (pstate, 0, &$1);
509 		  for (i = 0; i < $1.len; ++i)
510 		    free ($1.tokens[i].ptr);
511 		  free ($1.tokens); }
512 |	ArrayLiteral
513 		{ write_exp_elt_opcode (pstate, OP_ARRAY);
514 		  write_exp_elt_longcst (pstate, (LONGEST) 0);
515 		  write_exp_elt_longcst (pstate, (LONGEST) $1 - 1);
516 		  write_exp_elt_opcode (pstate, OP_ARRAY); }
517 ;
518 
519 ArrayLiteral:
520 	'[' ArgumentList_opt ']'
521 		{ $$ = arglist_len; }
522 ;
523 
524 IdentifierExp:
525 	IDENTIFIER
526 |	IdentifierExp '.' IDENTIFIER
527 		{ $$.length = $1.length + $3.length + 1;
528 		  if ($1.ptr + $1.length + 1 == $3.ptr
529 		      && $1.ptr[$1.length] == '.')
530 		    $$.ptr = $1.ptr;  /* Optimization.  */
531 		  else
532 		    {
533 		      char *buf = malloc ($$.length + 1);
534 		      make_cleanup (free, buf);
535 		      sprintf (buf, "%.*s.%.*s",
536 		               $1.length, $1.ptr, $3.length, $3.ptr);
537 		      $$.ptr = buf;
538 		    }
539 		}
540 ;
541 
542 StringExp:
543 	STRING_LITERAL
544 		{ /* We copy the string here, and not in the
545 		     lexer, to guarantee that we do not leak a
546 		     string.  Note that we follow the
547 		     NUL-termination convention of the
548 		     lexer.  */
549 		  struct typed_stoken *vec = XNEW (struct typed_stoken);
550 		  $$.len = 1;
551 		  $$.tokens = vec;
552 
553 		  vec->type = $1.type;
554 		  vec->length = $1.length;
555 		  vec->ptr = malloc ($1.length + 1);
556 		  memcpy (vec->ptr, $1.ptr, $1.length + 1);
557 		}
558 |	StringExp STRING_LITERAL
559 		{ /* Note that we NUL-terminate here, but just
560 		     for convenience.  */
561 		  char *p;
562 		  ++$$.len;
563 		  $$.tokens = realloc ($$.tokens,
564 				       $$.len * sizeof (struct typed_stoken));
565 
566 		  p = malloc ($2.length + 1);
567 		  memcpy (p, $2.ptr, $2.length + 1);
568 
569 		  $$.tokens[$$.len - 1].type = $2.type;
570 		  $$.tokens[$$.len - 1].length = $2.length;
571 		  $$.tokens[$$.len - 1].ptr = p;
572 		}
573 ;
574 
575 TypeExp:
576 	BasicType
577 		{ write_exp_elt_opcode (pstate, OP_TYPE);
578 		  write_exp_elt_type (pstate, $1);
579 		  write_exp_elt_opcode (pstate, OP_TYPE); }
580 |	BasicType BasicType2
581 		{ $$ = follow_types ($1);
582 		  write_exp_elt_opcode (pstate, OP_TYPE);
583 		  write_exp_elt_type (pstate, $$);
584 		  write_exp_elt_opcode (pstate, OP_TYPE);
585 		}
586 ;
587 
588 BasicType2:
589 	'*'
590 		{ push_type (tp_pointer); }
591 |	'*' BasicType2
592 		{ push_type (tp_pointer); }
593 |	'[' INTEGER_LITERAL ']'
594 		{ push_type_int ($2.val);
595 		  push_type (tp_array); }
596 |	'[' INTEGER_LITERAL ']' BasicType2
597 		{ push_type_int ($2.val);
598 		  push_type (tp_array); }
599 ;
600 
601 BasicType:
602 	TYPENAME
603 		{ $$ = $1.type; }
604 |	CLASS_KEYWORD IdentifierExp
605 		{ $$ = lookup_struct (copy_name ($2),
606 				      expression_context_block); }
607 |	CLASS_KEYWORD COMPLETE
608 		{ mark_completion_tag (TYPE_CODE_STRUCT, "", 0);
609 		  $$ = NULL; }
610 |	CLASS_KEYWORD IdentifierExp COMPLETE
611 		{ mark_completion_tag (TYPE_CODE_STRUCT, $2.ptr, $2.length);
612 		  $$ = NULL; }
613 |	STRUCT_KEYWORD IdentifierExp
614 		{ $$ = lookup_struct (copy_name ($2),
615 				      expression_context_block); }
616 |	STRUCT_KEYWORD COMPLETE
617 		{ mark_completion_tag (TYPE_CODE_STRUCT, "", 0);
618 		  $$ = NULL; }
619 |	STRUCT_KEYWORD IdentifierExp COMPLETE
620 		{ mark_completion_tag (TYPE_CODE_STRUCT, $2.ptr, $2.length);
621 		  $$ = NULL; }
622 |	UNION_KEYWORD IdentifierExp
623 		{ $$ = lookup_union (copy_name ($2),
624 				     expression_context_block); }
625 |	UNION_KEYWORD COMPLETE
626 		{ mark_completion_tag (TYPE_CODE_UNION, "", 0);
627 		  $$ = NULL; }
628 |	UNION_KEYWORD IdentifierExp COMPLETE
629 		{ mark_completion_tag (TYPE_CODE_UNION, $2.ptr, $2.length);
630 		  $$ = NULL; }
631 |	ENUM_KEYWORD IdentifierExp
632 		{ $$ = lookup_enum (copy_name ($2),
633 				    expression_context_block); }
634 |	ENUM_KEYWORD COMPLETE
635 		{ mark_completion_tag (TYPE_CODE_ENUM, "", 0);
636 		  $$ = NULL; }
637 |	ENUM_KEYWORD IdentifierExp COMPLETE
638 		{ mark_completion_tag (TYPE_CODE_ENUM, $2.ptr, $2.length);
639 		  $$ = NULL; }
640 ;
641 
642 %%
643 
644 /* Take care of parsing a number (anything that starts with a digit).
645    Set yylval and return the token type; update lexptr.
646    LEN is the number of characters in it.  */
647 
648 /*** Needs some error checking for the float case ***/
649 
650 static int
651 parse_number (struct parser_state *ps, const char *p,
652 	      int len, int parsed_float, YYSTYPE *putithere)
653 {
654   ULONGEST n = 0;
655   ULONGEST prevn = 0;
656   ULONGEST un;
657 
658   int i = 0;
659   int c;
660   int base = input_radix;
661   int unsigned_p = 0;
662   int long_p = 0;
663 
664   /* We have found a "L" or "U" suffix.  */
665   int found_suffix = 0;
666 
667   ULONGEST high_bit;
668   struct type *signed_type;
669   struct type *unsigned_type;
670 
671   if (parsed_float)
672     {
673       const struct builtin_d_type *builtin_d_types;
674       const char *suffix;
675       int suffix_len;
676       char *s, *sp;
677 
678       /* Strip out all embedded '_' before passing to parse_float.  */
679       s = (char *) alloca (len + 1);
680       sp = s;
681       while (len-- > 0)
682 	{
683 	  if (*p != '_')
684 	    *sp++ = *p;
685 	  p++;
686 	}
687       *sp = '\0';
688       len = strlen (s);
689 
690       if (! parse_float (s, len, &putithere->typed_val_float.dval, &suffix))
691 	return ERROR;
692 
693       suffix_len = s + len - suffix;
694 
695       if (suffix_len == 0)
696 	{
697 	  putithere->typed_val_float.type
698 	    = parse_d_type (ps)->builtin_double;
699 	}
700       else if (suffix_len == 1)
701 	{
702 	  /* Check suffix for `f', `l', or `i' (float, real, or idouble).  */
703 	  if (tolower (*suffix) == 'f')
704 	    {
705 	      putithere->typed_val_float.type
706 		= parse_d_type (ps)->builtin_float;
707 	    }
708 	  else if (tolower (*suffix) == 'l')
709 	    {
710 	      putithere->typed_val_float.type
711 		= parse_d_type (ps)->builtin_real;
712 	    }
713 	  else if (tolower (*suffix) == 'i')
714 	    {
715 	      putithere->typed_val_float.type
716 		= parse_d_type (ps)->builtin_idouble;
717 	    }
718 	  else
719 	    return ERROR;
720 	}
721       else if (suffix_len == 2)
722 	{
723 	  /* Check suffix for `fi' or `li' (ifloat or ireal).  */
724 	  if (tolower (suffix[0]) == 'f' && tolower (suffix[1] == 'i'))
725 	    {
726 	      putithere->typed_val_float.type
727 		= parse_d_type (ps)->builtin_ifloat;
728 	    }
729 	  else if (tolower (suffix[0]) == 'l' && tolower (suffix[1] == 'i'))
730 	    {
731 	      putithere->typed_val_float.type
732 		= parse_d_type (ps)->builtin_ireal;
733 	    }
734 	  else
735 	    return ERROR;
736 	}
737       else
738 	return ERROR;
739 
740       return FLOAT_LITERAL;
741     }
742 
743   /* Handle base-switching prefixes 0x, 0b, 0 */
744   if (p[0] == '0')
745     switch (p[1])
746       {
747       case 'x':
748       case 'X':
749 	if (len >= 3)
750 	  {
751 	    p += 2;
752 	    base = 16;
753 	    len -= 2;
754 	  }
755 	break;
756 
757       case 'b':
758       case 'B':
759 	if (len >= 3)
760 	  {
761 	    p += 2;
762 	    base = 2;
763 	    len -= 2;
764 	  }
765 	break;
766 
767       default:
768 	base = 8;
769 	break;
770       }
771 
772   while (len-- > 0)
773     {
774       c = *p++;
775       if (c == '_')
776 	continue;	/* Ignore embedded '_'.  */
777       if (c >= 'A' && c <= 'Z')
778 	c += 'a' - 'A';
779       if (c != 'l' && c != 'u')
780 	n *= base;
781       if (c >= '0' && c <= '9')
782 	{
783 	  if (found_suffix)
784 	    return ERROR;
785 	  n += i = c - '0';
786 	}
787       else
788 	{
789 	  if (base > 10 && c >= 'a' && c <= 'f')
790 	    {
791 	      if (found_suffix)
792 	        return ERROR;
793 	      n += i = c - 'a' + 10;
794 	    }
795 	  else if (c == 'l' && long_p == 0)
796 	    {
797 	      long_p = 1;
798 	      found_suffix = 1;
799 	    }
800 	  else if (c == 'u' && unsigned_p == 0)
801 	    {
802 	      unsigned_p = 1;
803 	      found_suffix = 1;
804 	    }
805 	  else
806 	    return ERROR;	/* Char not a digit */
807 	}
808       if (i >= base)
809 	return ERROR;		/* Invalid digit in this base.  */
810       /* Portably test for integer overflow.  */
811       if (c != 'l' && c != 'u')
812 	{
813 	  ULONGEST n2 = prevn * base;
814 	  if ((n2 / base != prevn) || (n2 + i < prevn))
815 	    error (_("Numeric constant too large."));
816 	}
817       prevn = n;
818     }
819 
820   /* An integer constant is an int or a long.  An L suffix forces it to
821      be long, and a U suffix forces it to be unsigned.  To figure out
822      whether it fits, we shift it right and see whether anything remains.
823      Note that we can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or
824      more in one operation, because many compilers will warn about such a
825      shift (which always produces a zero result).  To deal with the case
826      where it is we just always shift the value more than once, with fewer
827      bits each time.  */
828   un = (ULONGEST) n >> 2;
829   if (long_p == 0 && (un >> 30) == 0)
830     {
831       high_bit = ((ULONGEST) 1) << 31;
832       signed_type = parse_d_type (ps)->builtin_int;
833       /* For decimal notation, keep the sign of the worked out type.  */
834       if (base == 10 && !unsigned_p)
835 	unsigned_type = parse_d_type (ps)->builtin_long;
836       else
837 	unsigned_type = parse_d_type (ps)->builtin_uint;
838     }
839   else
840     {
841       int shift;
842       if (sizeof (ULONGEST) * HOST_CHAR_BIT < 64)
843 	/* A long long does not fit in a LONGEST.  */
844 	shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
845       else
846 	shift = 63;
847       high_bit = (ULONGEST) 1 << shift;
848       signed_type = parse_d_type (ps)->builtin_long;
849       unsigned_type = parse_d_type (ps)->builtin_ulong;
850     }
851 
852   putithere->typed_val_int.val = n;
853 
854   /* If the high bit of the worked out type is set then this number
855      has to be unsigned_type.  */
856   if (unsigned_p || (n & high_bit))
857     putithere->typed_val_int.type = unsigned_type;
858   else
859     putithere->typed_val_int.type = signed_type;
860 
861   return INTEGER_LITERAL;
862 }
863 
864 /* Temporary obstack used for holding strings.  */
865 static struct obstack tempbuf;
866 static int tempbuf_init;
867 
868 /* Parse a string or character literal from TOKPTR.  The string or
869    character may be wide or unicode.  *OUTPTR is set to just after the
870    end of the literal in the input string.  The resulting token is
871    stored in VALUE.  This returns a token value, either STRING or
872    CHAR, depending on what was parsed.  *HOST_CHARS is set to the
873    number of host characters in the literal.  */
874 
875 static int
876 parse_string_or_char (const char *tokptr, const char **outptr,
877 		      struct typed_stoken *value, int *host_chars)
878 {
879   int quote;
880 
881   /* Build the gdb internal form of the input string in tempbuf.  Note
882      that the buffer is null byte terminated *only* for the
883      convenience of debugging gdb itself and printing the buffer
884      contents when the buffer contains no embedded nulls.  Gdb does
885      not depend upon the buffer being null byte terminated, it uses
886      the length string instead.  This allows gdb to handle C strings
887      (as well as strings in other languages) with embedded null
888      bytes */
889 
890   if (!tempbuf_init)
891     tempbuf_init = 1;
892   else
893     obstack_free (&tempbuf, NULL);
894   obstack_init (&tempbuf);
895 
896   /* Skip the quote.  */
897   quote = *tokptr;
898   ++tokptr;
899 
900   *host_chars = 0;
901 
902   while (*tokptr)
903     {
904       char c = *tokptr;
905       if (c == '\\')
906 	{
907 	   ++tokptr;
908 	   *host_chars += c_parse_escape (&tokptr, &tempbuf);
909 	}
910       else if (c == quote)
911 	break;
912       else
913 	{
914 	  obstack_1grow (&tempbuf, c);
915 	  ++tokptr;
916 	  /* FIXME: this does the wrong thing with multi-byte host
917 	     characters.  We could use mbrlen here, but that would
918 	     make "set host-charset" a bit less useful.  */
919 	  ++*host_chars;
920 	}
921     }
922 
923   if (*tokptr != quote)
924     {
925       if (quote == '"' || quote == '`')
926 	error (_("Unterminated string in expression."));
927       else
928 	error (_("Unmatched single quote."));
929     }
930   ++tokptr;
931 
932   /* FIXME: should instead use own language string_type enum
933      and handle D-specific string suffixes here. */
934   if (quote == '\'')
935     value->type = C_CHAR;
936   else
937     value->type = C_STRING;
938 
939   value->ptr = obstack_base (&tempbuf);
940   value->length = obstack_object_size (&tempbuf);
941 
942   *outptr = tokptr;
943 
944   return quote == '\'' ? CHARACTER_LITERAL : STRING_LITERAL;
945 }
946 
947 struct token
948 {
949   char *oper;
950   int token;
951   enum exp_opcode opcode;
952 };
953 
954 static const struct token tokentab3[] =
955   {
956     {"^^=", ASSIGN_MODIFY, BINOP_EXP},
957     {"<<=", ASSIGN_MODIFY, BINOP_LSH},
958     {">>=", ASSIGN_MODIFY, BINOP_RSH},
959   };
960 
961 static const struct token tokentab2[] =
962   {
963     {"+=", ASSIGN_MODIFY, BINOP_ADD},
964     {"-=", ASSIGN_MODIFY, BINOP_SUB},
965     {"*=", ASSIGN_MODIFY, BINOP_MUL},
966     {"/=", ASSIGN_MODIFY, BINOP_DIV},
967     {"%=", ASSIGN_MODIFY, BINOP_REM},
968     {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
969     {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
970     {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
971     {"++", INCREMENT, BINOP_END},
972     {"--", DECREMENT, BINOP_END},
973     {"&&", ANDAND, BINOP_END},
974     {"||", OROR, BINOP_END},
975     {"^^", HATHAT, BINOP_END},
976     {"<<", LSH, BINOP_END},
977     {">>", RSH, BINOP_END},
978     {"==", EQUAL, BINOP_END},
979     {"!=", NOTEQUAL, BINOP_END},
980     {"<=", LEQ, BINOP_END},
981     {">=", GEQ, BINOP_END},
982     {"..", DOTDOT, BINOP_END},
983   };
984 
985 /* Identifier-like tokens.  */
986 static const struct token ident_tokens[] =
987   {
988     {"is", IDENTITY, BINOP_END},
989     {"!is", NOTIDENTITY, BINOP_END},
990 
991     {"cast", CAST_KEYWORD, OP_NULL},
992     {"const", CONST_KEYWORD, OP_NULL},
993     {"immutable", IMMUTABLE_KEYWORD, OP_NULL},
994     {"shared", SHARED_KEYWORD, OP_NULL},
995     {"super", SUPER_KEYWORD, OP_NULL},
996 
997     {"null", NULL_KEYWORD, OP_NULL},
998     {"true", TRUE_KEYWORD, OP_NULL},
999     {"false", FALSE_KEYWORD, OP_NULL},
1000 
1001     {"init", INIT_KEYWORD, OP_NULL},
1002     {"sizeof", SIZEOF_KEYWORD, OP_NULL},
1003     {"typeof", TYPEOF_KEYWORD, OP_NULL},
1004     {"typeid", TYPEID_KEYWORD, OP_NULL},
1005 
1006     {"delegate", DELEGATE_KEYWORD, OP_NULL},
1007     {"function", FUNCTION_KEYWORD, OP_NULL},
1008     {"struct", STRUCT_KEYWORD, OP_NULL},
1009     {"union", UNION_KEYWORD, OP_NULL},
1010     {"class", CLASS_KEYWORD, OP_NULL},
1011     {"interface", INTERFACE_KEYWORD, OP_NULL},
1012     {"enum", ENUM_KEYWORD, OP_NULL},
1013     {"template", TEMPLATE_KEYWORD, OP_NULL},
1014   };
1015 
1016 /* If NAME is a type name in this scope, return it.  */
1017 
1018 static struct type *
1019 d_type_from_name (struct stoken name)
1020 {
1021   struct symbol *sym;
1022   char *copy = copy_name (name);
1023 
1024   sym = lookup_symbol (copy, expression_context_block,
1025 		       STRUCT_DOMAIN, NULL);
1026   if (sym != NULL)
1027     return SYMBOL_TYPE (sym);
1028 
1029   return NULL;
1030 }
1031 
1032 /* If NAME is a module name in this scope, return it.  */
1033 
1034 static struct type *
1035 d_module_from_name (struct stoken name)
1036 {
1037   struct symbol *sym;
1038   char *copy = copy_name (name);
1039 
1040   sym = lookup_symbol (copy, expression_context_block,
1041 		       MODULE_DOMAIN, NULL);
1042   if (sym != NULL)
1043     return SYMBOL_TYPE (sym);
1044 
1045   return NULL;
1046 }
1047 
1048 /* If NAME is a valid variable name in this scope, push it and return 1.
1049    Otherwise, return 0.  */
1050 
1051 static int
1052 push_variable (struct parser_state *ps, struct stoken name)
1053 {
1054   char *copy = copy_name (name);
1055   struct field_of_this_result is_a_field_of_this;
1056   struct symbol *sym;
1057   sym = lookup_symbol (copy, expression_context_block, VAR_DOMAIN,
1058                        &is_a_field_of_this);
1059   if (sym && SYMBOL_CLASS (sym) != LOC_TYPEDEF)
1060     {
1061       if (symbol_read_needs_frame (sym))
1062         {
1063           if (innermost_block == 0 ||
1064               contained_in (block_found, innermost_block))
1065             innermost_block = block_found;
1066         }
1067 
1068       write_exp_elt_opcode (ps, OP_VAR_VALUE);
1069       /* We want to use the selected frame, not another more inner frame
1070          which happens to be in the same block.  */
1071       write_exp_elt_block (ps, NULL);
1072       write_exp_elt_sym (ps, sym);
1073       write_exp_elt_opcode (ps, OP_VAR_VALUE);
1074       return 1;
1075     }
1076   if (is_a_field_of_this.type != NULL)
1077     {
1078       /* It hangs off of `this'.  Must not inadvertently convert from a
1079          method call to data ref.  */
1080       if (innermost_block == 0 ||
1081           contained_in (block_found, innermost_block))
1082         innermost_block = block_found;
1083       write_exp_elt_opcode (ps, OP_THIS);
1084       write_exp_elt_opcode (ps, OP_THIS);
1085       write_exp_elt_opcode (ps, STRUCTOP_PTR);
1086       write_exp_string (ps, name);
1087       write_exp_elt_opcode (ps, STRUCTOP_PTR);
1088       return 1;
1089     }
1090   return 0;
1091 }
1092 
1093 /* Assuming a reference expression has been pushed, emit the
1094    STRUCTOP_PTR ops to access the field named NAME.  If NAME is a
1095    qualified name (has '.'), generate a field access for each part.  */
1096 
1097 static void
1098 push_fieldnames (struct parser_state *ps, struct stoken name)
1099 {
1100   int i;
1101   struct stoken token;
1102   token.ptr = name.ptr;
1103   for (i = 0;  ;  i++)
1104     {
1105       if (i == name.length || name.ptr[i] == '.')
1106         {
1107           /* token.ptr is start of current field name.  */
1108           token.length = &name.ptr[i] - token.ptr;
1109           write_exp_elt_opcode (ps, STRUCTOP_PTR);
1110           write_exp_string (ps, token);
1111           write_exp_elt_opcode (ps, STRUCTOP_PTR);
1112           token.ptr += token.length + 1;
1113         }
1114       if (i >= name.length)
1115         break;
1116     }
1117 }
1118 
1119 /* Helper routine for push_expression_name.  Handle a TYPE symbol,
1120    where DOT_INDEX is the index of the first '.' if NAME is part of
1121    a qualified type.  */
1122 
1123 static void
1124 push_type_name (struct parser_state *ps, struct type *type,
1125 		struct stoken name, int dot_index)
1126 {
1127   if (dot_index == name.length)
1128     {
1129       write_exp_elt_opcode (ps, OP_TYPE);
1130       write_exp_elt_type (ps, type);
1131       write_exp_elt_opcode (ps, OP_TYPE);
1132     }
1133   else
1134     {
1135       struct stoken token;
1136 
1137       token.ptr = name.ptr;
1138       token.length = dot_index;
1139 
1140       dot_index = 0;
1141 
1142       while (dot_index < name.length && name.ptr[dot_index] != '.')
1143 	dot_index++;
1144       token.ptr = name.ptr;
1145       token.length = dot_index;
1146 
1147       write_exp_elt_opcode (ps, OP_SCOPE);
1148       write_exp_elt_type (ps, type);
1149       write_exp_string (ps, token);
1150       write_exp_elt_opcode (ps, OP_SCOPE);
1151 
1152       if (dot_index < name.length)
1153 	{
1154 	  dot_index++;
1155 	  name.ptr += dot_index;
1156 	  name.length -= dot_index;
1157 	  push_fieldnames (ps, name);
1158 	}
1159     }
1160 }
1161 
1162 /* Helper routine for push_expression_name.  Like push_type_name,
1163    but used when TYPE is a module.  Returns 1 on pushing the symbol.  */
1164 
1165 static int
1166 push_module_name (struct parser_state *ps, struct type *module,
1167 		  struct stoken name, int dot_index)
1168 {
1169   if (dot_index == name.length)
1170     {
1171       write_exp_elt_opcode (ps, OP_TYPE);
1172       write_exp_elt_type (ps, module);
1173       write_exp_elt_opcode (ps, OP_TYPE);
1174       return 1;
1175     }
1176   else
1177     {
1178       struct symbol *sym;
1179       char *copy;
1180 
1181       copy = copy_name (name);
1182       sym = lookup_symbol_in_static_block (copy, expression_context_block,
1183 					   VAR_DOMAIN);
1184       if (sym != NULL)
1185 	sym = lookup_global_symbol (copy, expression_context_block,
1186 				    VAR_DOMAIN);
1187 
1188       if (sym != NULL)
1189 	{
1190 	  if (SYMBOL_CLASS (sym) != LOC_TYPEDEF)
1191 	    {
1192 	      write_exp_elt_opcode (ps, OP_VAR_VALUE);
1193 	      write_exp_elt_block (ps, NULL);
1194 	      write_exp_elt_sym (ps, sym);
1195 	      write_exp_elt_opcode (ps, OP_VAR_VALUE);
1196 	    }
1197 	  else
1198 	    {
1199 	      write_exp_elt_opcode (ps, OP_TYPE);
1200 	      write_exp_elt_type (ps, SYMBOL_TYPE (sym));
1201 	      write_exp_elt_opcode (ps, OP_TYPE);
1202 	    }
1203 	  return 1;
1204 	}
1205     }
1206 
1207   return 0;
1208 }
1209 
1210 /* Handle NAME in an expression (or LHS), which could be a
1211    variable, type, or module.  */
1212 
1213 static void
1214 push_expression_name (struct parser_state *ps, struct stoken name)
1215 {
1216   struct stoken token;
1217   struct type *typ;
1218   struct bound_minimal_symbol msymbol;
1219   char *copy;
1220   int doti;
1221 
1222   /* Handle VAR, which could be local or global.  */
1223   if (push_variable (ps, name) != 0)
1224     return;
1225 
1226   /* Handle MODULE.  */
1227   typ = d_module_from_name (name);
1228   if (typ != NULL)
1229     {
1230       if (push_module_name (ps, typ, name, name.length) != 0)
1231 	return;
1232     }
1233 
1234   /* Handle TYPE.  */
1235   typ = d_type_from_name (name);
1236   if (typ != NULL)
1237     {
1238       push_type_name (ps, typ, name, name.length);
1239       return;
1240     }
1241 
1242   /* Handle VAR.FIELD1..FIELDN.  */
1243   for (doti = 0;  doti < name.length;  doti++)
1244     {
1245       if (name.ptr[doti] == '.')
1246 	{
1247 	  token.ptr = name.ptr;
1248 	  token.length = doti;
1249 
1250 	  if (push_variable (ps, token) != 0)
1251 	    {
1252 	      token.ptr = name.ptr + doti + 1;
1253 	      token.length = name.length - doti - 1;
1254 	      push_fieldnames (ps, token);
1255 	      return;
1256 	    }
1257 	  break;
1258 	}
1259     }
1260 
1261   /* Continue looking if we found a '.' in the name.  */
1262   if (doti < name.length)
1263     {
1264       token.ptr = name.ptr;
1265       for (;;)
1266 	{
1267 	  token.length = doti;
1268 
1269 	  /* Handle PACKAGE.MODULE.  */
1270 	  typ = d_module_from_name (token);
1271 	  if (typ != NULL)
1272 	    {
1273 	      if (push_module_name (ps, typ, name, doti) != 0)
1274 		return;
1275 	    }
1276 	  /* Handle TYPE.FIELD1..FIELDN.  */
1277 	  typ = d_type_from_name (token);
1278 	  if (typ != NULL)
1279 	    {
1280 	      push_type_name (ps, typ, name, doti);
1281 	      return;
1282 	    }
1283 
1284 	  if (doti >= name.length)
1285 	    break;
1286 	  doti++;   /* Skip '.'  */
1287 	  while (doti < name.length && name.ptr[doti] != '.')
1288 	    doti++;
1289 	}
1290     }
1291 
1292   /* Lookup foreign name in global static symbols.  */
1293   copy  = copy_name (name);
1294   msymbol = lookup_bound_minimal_symbol (copy);
1295   if (msymbol.minsym != NULL)
1296     write_exp_msymbol (ps, msymbol);
1297   else if (!have_full_symbols () && !have_partial_symbols ())
1298     error (_("No symbol table is loaded.  Use the \"file\" command"));
1299   else
1300     error (_("No symbol \"%s\" in current context."), copy);
1301 }
1302 
1303 /* This is set if a NAME token appeared at the very end of the input
1304    string, with no whitespace separating the name from the EOF.  This
1305    is used only when parsing to do field name completion.  */
1306 static int saw_name_at_eof;
1307 
1308 /* This is set if the previously-returned token was a structure operator.
1309    This is used only when parsing to do field name completion.  */
1310 static int last_was_structop;
1311 
1312 /* Read one token, getting characters through lexptr.  */
1313 
1314 static int
1315 yylex (void)
1316 {
1317   int c;
1318   int namelen;
1319   unsigned int i;
1320   const char *tokstart;
1321   int saw_structop = last_was_structop;
1322   char *copy;
1323 
1324   last_was_structop = 0;
1325 
1326  retry:
1327 
1328   prev_lexptr = lexptr;
1329 
1330   tokstart = lexptr;
1331   /* See if it is a special token of length 3.  */
1332   for (i = 0; i < sizeof tokentab3 / sizeof tokentab3[0]; i++)
1333     if (strncmp (tokstart, tokentab3[i].oper, 3) == 0)
1334       {
1335 	lexptr += 3;
1336 	yylval.opcode = tokentab3[i].opcode;
1337 	return tokentab3[i].token;
1338       }
1339 
1340   /* See if it is a special token of length 2.  */
1341   for (i = 0; i < sizeof tokentab2 / sizeof tokentab2[0]; i++)
1342     if (strncmp (tokstart, tokentab2[i].oper, 2) == 0)
1343       {
1344 	lexptr += 2;
1345 	yylval.opcode = tokentab2[i].opcode;
1346 	return tokentab2[i].token;
1347       }
1348 
1349   switch (c = *tokstart)
1350     {
1351     case 0:
1352       /* If we're parsing for field name completion, and the previous
1353 	 token allows such completion, return a COMPLETE token.
1354 	 Otherwise, we were already scanning the original text, and
1355 	 we're really done.  */
1356       if (saw_name_at_eof)
1357 	{
1358 	  saw_name_at_eof = 0;
1359 	  return COMPLETE;
1360 	}
1361       else if (saw_structop)
1362 	return COMPLETE;
1363       else
1364         return 0;
1365 
1366     case ' ':
1367     case '\t':
1368     case '\n':
1369       lexptr++;
1370       goto retry;
1371 
1372     case '[':
1373     case '(':
1374       paren_depth++;
1375       lexptr++;
1376       return c;
1377 
1378     case ']':
1379     case ')':
1380       if (paren_depth == 0)
1381 	return 0;
1382       paren_depth--;
1383       lexptr++;
1384       return c;
1385 
1386     case ',':
1387       if (comma_terminates && paren_depth == 0)
1388 	return 0;
1389       lexptr++;
1390       return c;
1391 
1392     case '.':
1393       /* Might be a floating point number.  */
1394       if (lexptr[1] < '0' || lexptr[1] > '9')
1395 	{
1396 	  if (parse_completion)
1397 	    last_was_structop = 1;
1398 	  goto symbol;		/* Nope, must be a symbol.  */
1399 	}
1400       /* FALL THRU into number case.  */
1401 
1402     case '0':
1403     case '1':
1404     case '2':
1405     case '3':
1406     case '4':
1407     case '5':
1408     case '6':
1409     case '7':
1410     case '8':
1411     case '9':
1412       {
1413 	/* It's a number.  */
1414 	int got_dot = 0, got_e = 0, toktype;
1415 	const char *p = tokstart;
1416 	int hex = input_radix > 10;
1417 
1418 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1419 	  {
1420 	    p += 2;
1421 	    hex = 1;
1422 	  }
1423 
1424 	for (;; ++p)
1425 	  {
1426 	    /* Hex exponents start with 'p', because 'e' is a valid hex
1427 	       digit and thus does not indicate a floating point number
1428 	       when the radix is hex.  */
1429 	    if ((!hex && !got_e && tolower (p[0]) == 'e')
1430 		|| (hex && !got_e && tolower (p[0] == 'p')))
1431 	      got_dot = got_e = 1;
1432 	    /* A '.' always indicates a decimal floating point number
1433 	       regardless of the radix.  If we have a '..' then its the
1434 	       end of the number and the beginning of a slice.  */
1435 	    else if (!got_dot && (p[0] == '.' && p[1] != '.'))
1436 		got_dot = 1;
1437 	    /* This is the sign of the exponent, not the end of the number.  */
1438 	    else if (got_e && (tolower (p[-1]) == 'e' || tolower (p[-1]) == 'p')
1439 		     && (*p == '-' || *p == '+'))
1440 	      continue;
1441 	    /* We will take any letters or digits, ignoring any embedded '_'.
1442 	       parse_number will complain if past the radix, or if L or U are
1443 	       not final.  */
1444 	    else if ((*p < '0' || *p > '9') && (*p != '_') &&
1445 		     ((*p < 'a' || *p > 'z') && (*p < 'A' || *p > 'Z')))
1446 	      break;
1447 	  }
1448 
1449 	toktype = parse_number (pstate, tokstart, p - tokstart,
1450 				got_dot|got_e, &yylval);
1451 	if (toktype == ERROR)
1452 	  {
1453 	    char *err_copy = (char *) alloca (p - tokstart + 1);
1454 
1455 	    memcpy (err_copy, tokstart, p - tokstart);
1456 	    err_copy[p - tokstart] = 0;
1457 	    error (_("Invalid number \"%s\"."), err_copy);
1458 	  }
1459 	lexptr = p;
1460 	return toktype;
1461       }
1462 
1463     case '@':
1464       {
1465 	const char *p = &tokstart[1];
1466 	size_t len = strlen ("entry");
1467 
1468 	while (isspace (*p))
1469 	  p++;
1470 	if (strncmp (p, "entry", len) == 0 && !isalnum (p[len])
1471 	    && p[len] != '_')
1472 	  {
1473 	    lexptr = &p[len];
1474 	    return ENTRY;
1475 	  }
1476       }
1477       /* FALLTHRU */
1478     case '+':
1479     case '-':
1480     case '*':
1481     case '/':
1482     case '%':
1483     case '|':
1484     case '&':
1485     case '^':
1486     case '~':
1487     case '!':
1488     case '<':
1489     case '>':
1490     case '?':
1491     case ':':
1492     case '=':
1493     case '{':
1494     case '}':
1495     symbol:
1496       lexptr++;
1497       return c;
1498 
1499     case '\'':
1500     case '"':
1501     case '`':
1502       {
1503 	int host_len;
1504 	int result = parse_string_or_char (tokstart, &lexptr, &yylval.tsval,
1505 					   &host_len);
1506 	if (result == CHARACTER_LITERAL)
1507 	  {
1508 	    if (host_len == 0)
1509 	      error (_("Empty character constant."));
1510 	    else if (host_len > 2 && c == '\'')
1511 	      {
1512 		++tokstart;
1513 		namelen = lexptr - tokstart - 1;
1514 		goto tryname;
1515 	      }
1516 	    else if (host_len > 1)
1517 	      error (_("Invalid character constant."));
1518 	  }
1519 	return result;
1520       }
1521     }
1522 
1523   if (!(c == '_' || c == '$'
1524 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1525     /* We must have come across a bad character (e.g. ';').  */
1526     error (_("Invalid character '%c' in expression"), c);
1527 
1528   /* It's a name.  See how long it is.  */
1529   namelen = 0;
1530   for (c = tokstart[namelen];
1531        (c == '_' || c == '$' || (c >= '0' && c <= '9')
1532 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));)
1533     c = tokstart[++namelen];
1534 
1535   /* The token "if" terminates the expression and is NOT
1536      removed from the input stream.  */
1537   if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
1538     return 0;
1539 
1540   /* For the same reason (breakpoint conditions), "thread N"
1541      terminates the expression.  "thread" could be an identifier, but
1542      an identifier is never followed by a number without intervening
1543      punctuation.  "task" is similar.  Handle abbreviations of these,
1544      similarly to breakpoint.c:find_condition_and_thread.  */
1545   if (namelen >= 1
1546       && (strncmp (tokstart, "thread", namelen) == 0
1547 	  || strncmp (tokstart, "task", namelen) == 0)
1548       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
1549     {
1550       const char *p = tokstart + namelen + 1;
1551 
1552       while (*p == ' ' || *p == '\t')
1553         p++;
1554       if (*p >= '0' && *p <= '9')
1555         return 0;
1556     }
1557 
1558   lexptr += namelen;
1559 
1560  tryname:
1561 
1562   yylval.sval.ptr = tokstart;
1563   yylval.sval.length = namelen;
1564 
1565   /* Catch specific keywords.  */
1566   copy = copy_name (yylval.sval);
1567   for (i = 0; i < sizeof ident_tokens / sizeof ident_tokens[0]; i++)
1568     if (strcmp (copy, ident_tokens[i].oper) == 0)
1569       {
1570 	/* It is ok to always set this, even though we don't always
1571 	   strictly need to.  */
1572 	yylval.opcode = ident_tokens[i].opcode;
1573 	return ident_tokens[i].token;
1574       }
1575 
1576   if (*tokstart == '$')
1577     return DOLLAR_VARIABLE;
1578 
1579   yylval.tsym.type
1580     = language_lookup_primitive_type (parse_language (pstate),
1581 				      parse_gdbarch (pstate), copy);
1582   if (yylval.tsym.type != NULL)
1583     return TYPENAME;
1584 
1585   /* Input names that aren't symbols but ARE valid hex numbers,
1586      when the input radix permits them, can be names or numbers
1587      depending on the parse.  Note we support radixes > 16 here.  */
1588   if ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
1589       || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10))
1590     {
1591       YYSTYPE newlval;	/* Its value is ignored.  */
1592       int hextype = parse_number (pstate, tokstart, namelen, 0, &newlval);
1593       if (hextype == INTEGER_LITERAL)
1594 	return NAME_OR_INT;
1595     }
1596 
1597   if (parse_completion && *lexptr == '\0')
1598     saw_name_at_eof = 1;
1599 
1600   return IDENTIFIER;
1601 }
1602 
1603 int
1604 d_parse (struct parser_state *par_state)
1605 {
1606   int result;
1607   struct cleanup *back_to;
1608 
1609   /* Setting up the parser state.  */
1610   gdb_assert (par_state != NULL);
1611   pstate = par_state;
1612 
1613   back_to = make_cleanup (null_cleanup, NULL);
1614 
1615   make_cleanup_restore_integer (&yydebug);
1616   make_cleanup_clear_parser_state (&pstate);
1617   yydebug = parser_debug;
1618 
1619   /* Initialize some state used by the lexer.  */
1620   last_was_structop = 0;
1621   saw_name_at_eof = 0;
1622 
1623   result = yyparse ();
1624   do_cleanups (back_to);
1625   return result;
1626 }
1627 
1628 void
1629 yyerror (char *msg)
1630 {
1631   if (prev_lexptr)
1632     lexptr = prev_lexptr;
1633 
1634   error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);
1635 }
1636 
1637