xref: /dragonfly/contrib/gdb-7/gdb/go-exp.y (revision a4da4a90)
1 /* YACC parser for Go expressions, for GDB.
2 
3    Copyright (C) 2012-2013 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, p-exp.y.  */
21 
22 /* Parse a Go 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 /* Known bugs or limitations:
40 
41    - Unicode
42    - &^
43    - '_' (blank identifier)
44    - automatic deref of pointers
45    - method expressions
46    - interfaces, channels, etc.
47 
48    And lots of other things.
49    I'm sure there's some cleanup to do.
50 */
51 
52 %{
53 
54 #include "defs.h"
55 #include "gdb_string.h"
56 #include <ctype.h>
57 #include "expression.h"
58 #include "value.h"
59 #include "parser-defs.h"
60 #include "language.h"
61 #include "c-lang.h"
62 #include "go-lang.h"
63 #include "bfd.h" /* Required by objfiles.h.  */
64 #include "symfile.h" /* Required by objfiles.h.  */
65 #include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
66 #include "charset.h"
67 #include "block.h"
68 
69 #define parse_type builtin_type (parse_gdbarch)
70 
71 /* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
72    as well as gratuitiously global symbol names, so we can have multiple
73    yacc generated parsers in gdb.  Note that these are only the variables
74    produced by yacc.  If other parser generators (bison, byacc, etc) produce
75    additional global names that conflict at link time, then those parser
76    generators need to be fixed instead of adding those names to this list.  */
77 
78 #define	yymaxdepth go_maxdepth
79 #define	yyparse	go_parse_internal
80 #define	yylex	go_lex
81 #define	yyerror	go_error
82 #define	yylval	go_lval
83 #define	yychar	go_char
84 #define	yydebug	go_debug
85 #define	yypact	go_pact
86 #define	yyr1	go_r1
87 #define	yyr2	go_r2
88 #define	yydef	go_def
89 #define	yychk	go_chk
90 #define	yypgo	go_pgo
91 #define	yyact	go_act
92 #define	yyexca	go_exca
93 #define yyerrflag go_errflag
94 #define yynerrs	go_nerrs
95 #define	yyps	go_ps
96 #define	yypv	go_pv
97 #define	yys	go_s
98 #define	yy_yys	go_yys
99 #define	yystate	go_state
100 #define	yytmp	go_tmp
101 #define	yyv	go_v
102 #define	yy_yyv	go_yyv
103 #define	yyval	go_val
104 #define	yylloc	go_lloc
105 #define yyreds	go_reds		/* With YYDEBUG defined */
106 #define yytoks	go_toks		/* With YYDEBUG defined */
107 #define yyname	go_name		/* With YYDEBUG defined */
108 #define yyrule	go_rule		/* With YYDEBUG defined */
109 #define yylhs	go_yylhs
110 #define yylen	go_yylen
111 #define yydefred go_yydefred
112 #define yydgoto	go_yydgoto
113 #define yysindex go_yysindex
114 #define yyrindex go_yyrindex
115 #define yygindex go_yygindex
116 #define yytable	 go_yytable
117 #define yycheck	 go_yycheck
118 
119 #ifndef YYDEBUG
120 #define	YYDEBUG 1		/* Default to yydebug support */
121 #endif
122 
123 #define YYFPRINTF parser_fprintf
124 
125 int yyparse (void);
126 
127 static int yylex (void);
128 
129 void yyerror (char *);
130 
131 %}
132 
133 /* Although the yacc "value" of an expression is not used,
134    since the result is stored in the structure being created,
135    other node types do have values.  */
136 
137 %union
138   {
139     LONGEST lval;
140     struct {
141       LONGEST val;
142       struct type *type;
143     } typed_val_int;
144     struct {
145       DOUBLEST dval;
146       struct type *type;
147     } typed_val_float;
148     struct stoken sval;
149     struct symtoken ssym;
150     struct type *tval;
151     struct typed_stoken tsval;
152     struct ttype tsym;
153     int voidval;
154     enum exp_opcode opcode;
155     struct internalvar *ivar;
156     struct stoken_vector svec;
157   }
158 
159 %{
160 /* YYSTYPE gets defined by %union.  */
161 static int parse_number (char *, int, int, YYSTYPE *);
162 static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
163 			   DOUBLEST *d, struct type **t);
164 %}
165 
166 %type <voidval> exp exp1 type_exp start variable lcurly
167 %type <lval> rcurly
168 %type <tval> type
169 
170 %token <typed_val_int> INT
171 %token <typed_val_float> FLOAT
172 
173 /* Both NAME and TYPENAME tokens represent symbols in the input,
174    and both convey their data as strings.
175    But a TYPENAME is a string that happens to be defined as a type
176    or builtin type name (such as int or char)
177    and a NAME is any other symbol.
178    Contexts where this distinction is not important can use the
179    nonterminal "name", which matches either NAME or TYPENAME.  */
180 
181 %token <tsval> RAW_STRING
182 %token <tsval> STRING
183 %token <tsval> CHAR
184 %token <ssym> NAME
185 %token <tsym> TYPENAME /* Not TYPE_NAME cus already taken.  */
186 %token <voidval> COMPLETE
187 /*%type <sval> name*/
188 %type <svec> string_exp
189 %type <ssym> name_not_typename
190 
191 /* A NAME_OR_INT is a symbol which is not known in the symbol table,
192    but which would parse as a valid number in the current input radix.
193    E.g. "c" when input_radix==16.  Depending on the parse, it will be
194    turned into a name or into a number.  */
195 %token <ssym> NAME_OR_INT
196 
197 %token <lval> TRUE_KEYWORD FALSE_KEYWORD
198 %token STRUCT_KEYWORD INTERFACE_KEYWORD TYPE_KEYWORD CHAN_KEYWORD
199 %token SIZEOF_KEYWORD
200 %token LEN_KEYWORD CAP_KEYWORD
201 %token NEW_KEYWORD
202 %token IOTA_KEYWORD NIL_KEYWORD
203 %token CONST_KEYWORD
204 %token DOTDOTDOT
205 %token ENTRY
206 %token ERROR
207 
208 /* Special type cases.  */
209 %token BYTE_KEYWORD /* An alias of uint8.  */
210 
211 %token <sval> DOLLAR_VARIABLE
212 
213 %token <opcode> ASSIGN_MODIFY
214 
215 %left ','
216 %left ABOVE_COMMA
217 %right '=' ASSIGN_MODIFY
218 %right '?'
219 %left OROR
220 %left ANDAND
221 %left '|'
222 %left '^'
223 %left '&'
224 %left ANDNOT
225 %left EQUAL NOTEQUAL
226 %left '<' '>' LEQ GEQ
227 %left LSH RSH
228 %left '@'
229 %left '+' '-'
230 %left '*' '/' '%'
231 %right UNARY INCREMENT DECREMENT
232 %right LEFT_ARROW '.' '[' '('
233 
234 
235 %%
236 
237 start   :	exp1
238 	|	type_exp
239 	;
240 
241 type_exp:	type
242 			{ write_exp_elt_opcode(OP_TYPE);
243 			  write_exp_elt_type($1);
244 			  write_exp_elt_opcode(OP_TYPE); }
245 	;
246 
247 /* Expressions, including the comma operator.  */
248 exp1	:	exp
249 	|	exp1 ',' exp
250 			{ write_exp_elt_opcode (BINOP_COMMA); }
251 	;
252 
253 /* Expressions, not including the comma operator.  */
254 exp	:	'*' exp    %prec UNARY
255 			{ write_exp_elt_opcode (UNOP_IND); }
256 	;
257 
258 exp	:	'&' exp    %prec UNARY
259 			{ write_exp_elt_opcode (UNOP_ADDR); }
260 	;
261 
262 exp	:	'-' exp    %prec UNARY
263 			{ write_exp_elt_opcode (UNOP_NEG); }
264 	;
265 
266 exp	:	'+' exp    %prec UNARY
267 			{ write_exp_elt_opcode (UNOP_PLUS); }
268 	;
269 
270 exp	:	'!' exp    %prec UNARY
271 			{ write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
272 	;
273 
274 exp	:	'^' exp    %prec UNARY
275 			{ write_exp_elt_opcode (UNOP_COMPLEMENT); }
276 	;
277 
278 exp	:	exp INCREMENT    %prec UNARY
279 			{ write_exp_elt_opcode (UNOP_POSTINCREMENT); }
280 	;
281 
282 exp	:	exp DECREMENT    %prec UNARY
283 			{ write_exp_elt_opcode (UNOP_POSTDECREMENT); }
284 	;
285 
286 /* foo->bar is not in Go.  May want as a gdb extension.  Later.  */
287 
288 exp	:	exp '.' name_not_typename
289 			{ write_exp_elt_opcode (STRUCTOP_STRUCT);
290 			  write_exp_string ($3.stoken);
291 			  write_exp_elt_opcode (STRUCTOP_STRUCT); }
292 	;
293 
294 exp	:	exp '.' name_not_typename COMPLETE
295 			{ mark_struct_expression ();
296 			  write_exp_elt_opcode (STRUCTOP_STRUCT);
297 			  write_exp_string ($3.stoken);
298 			  write_exp_elt_opcode (STRUCTOP_STRUCT); }
299 	;
300 
301 exp	:	exp '.' COMPLETE
302 			{ struct stoken s;
303 			  mark_struct_expression ();
304 			  write_exp_elt_opcode (STRUCTOP_STRUCT);
305 			  s.ptr = "";
306 			  s.length = 0;
307 			  write_exp_string (s);
308 			  write_exp_elt_opcode (STRUCTOP_STRUCT); }
309 	;
310 
311 exp	:	exp '[' exp1 ']'
312 			{ write_exp_elt_opcode (BINOP_SUBSCRIPT); }
313 	;
314 
315 exp	:	exp '('
316 			/* This is to save the value of arglist_len
317 			   being accumulated by an outer function call.  */
318 			{ start_arglist (); }
319 		arglist ')'	%prec LEFT_ARROW
320 			{ write_exp_elt_opcode (OP_FUNCALL);
321 			  write_exp_elt_longcst ((LONGEST) end_arglist ());
322 			  write_exp_elt_opcode (OP_FUNCALL); }
323 	;
324 
325 lcurly	:	'{'
326 			{ start_arglist (); }
327 	;
328 
329 arglist	:
330 	;
331 
332 arglist	:	exp
333 			{ arglist_len = 1; }
334 	;
335 
336 arglist	:	arglist ',' exp   %prec ABOVE_COMMA
337 			{ arglist_len++; }
338 	;
339 
340 rcurly	:	'}'
341 			{ $$ = end_arglist () - 1; }
342 	;
343 
344 exp	:	lcurly type rcurly exp  %prec UNARY
345 			{ write_exp_elt_opcode (UNOP_MEMVAL);
346 			  write_exp_elt_type ($2);
347 			  write_exp_elt_opcode (UNOP_MEMVAL); }
348 	;
349 
350 exp	:	type '(' exp ')'  %prec UNARY
351 			{ write_exp_elt_opcode (UNOP_CAST);
352 			  write_exp_elt_type ($1);
353 			  write_exp_elt_opcode (UNOP_CAST); }
354 	;
355 
356 exp	:	'(' exp1 ')'
357 			{ }
358 	;
359 
360 /* Binary operators in order of decreasing precedence.  */
361 
362 exp	:	exp '@' exp
363 			{ write_exp_elt_opcode (BINOP_REPEAT); }
364 	;
365 
366 exp	:	exp '*' exp
367 			{ write_exp_elt_opcode (BINOP_MUL); }
368 	;
369 
370 exp	:	exp '/' exp
371 			{ write_exp_elt_opcode (BINOP_DIV); }
372 	;
373 
374 exp	:	exp '%' exp
375 			{ write_exp_elt_opcode (BINOP_REM); }
376 	;
377 
378 exp	:	exp '+' exp
379 			{ write_exp_elt_opcode (BINOP_ADD); }
380 	;
381 
382 exp	:	exp '-' exp
383 			{ write_exp_elt_opcode (BINOP_SUB); }
384 	;
385 
386 exp	:	exp LSH exp
387 			{ write_exp_elt_opcode (BINOP_LSH); }
388 	;
389 
390 exp	:	exp RSH exp
391 			{ write_exp_elt_opcode (BINOP_RSH); }
392 	;
393 
394 exp	:	exp EQUAL exp
395 			{ write_exp_elt_opcode (BINOP_EQUAL); }
396 	;
397 
398 exp	:	exp NOTEQUAL exp
399 			{ write_exp_elt_opcode (BINOP_NOTEQUAL); }
400 	;
401 
402 exp	:	exp LEQ exp
403 			{ write_exp_elt_opcode (BINOP_LEQ); }
404 	;
405 
406 exp	:	exp GEQ exp
407 			{ write_exp_elt_opcode (BINOP_GEQ); }
408 	;
409 
410 exp	:	exp '<' exp
411 			{ write_exp_elt_opcode (BINOP_LESS); }
412 	;
413 
414 exp	:	exp '>' exp
415 			{ write_exp_elt_opcode (BINOP_GTR); }
416 	;
417 
418 exp	:	exp '&' exp
419 			{ write_exp_elt_opcode (BINOP_BITWISE_AND); }
420 	;
421 
422 exp	:	exp '^' exp
423 			{ write_exp_elt_opcode (BINOP_BITWISE_XOR); }
424 	;
425 
426 exp	:	exp '|' exp
427 			{ write_exp_elt_opcode (BINOP_BITWISE_IOR); }
428 	;
429 
430 exp	:	exp ANDAND exp
431 			{ write_exp_elt_opcode (BINOP_LOGICAL_AND); }
432 	;
433 
434 exp	:	exp OROR exp
435 			{ write_exp_elt_opcode (BINOP_LOGICAL_OR); }
436 	;
437 
438 exp	:	exp '?' exp ':' exp	%prec '?'
439 			{ write_exp_elt_opcode (TERNOP_COND); }
440 	;
441 
442 exp	:	exp '=' exp
443 			{ write_exp_elt_opcode (BINOP_ASSIGN); }
444 	;
445 
446 exp	:	exp ASSIGN_MODIFY exp
447 			{ write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
448 			  write_exp_elt_opcode ($2);
449 			  write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
450 	;
451 
452 exp	:	INT
453 			{ write_exp_elt_opcode (OP_LONG);
454 			  write_exp_elt_type ($1.type);
455 			  write_exp_elt_longcst ((LONGEST)($1.val));
456 			  write_exp_elt_opcode (OP_LONG); }
457 	;
458 
459 exp	:	CHAR
460 			{
461 			  struct stoken_vector vec;
462 			  vec.len = 1;
463 			  vec.tokens = &$1;
464 			  write_exp_string_vector ($1.type, &vec);
465 			}
466 	;
467 
468 exp	:	NAME_OR_INT
469 			{ YYSTYPE val;
470 			  parse_number ($1.stoken.ptr, $1.stoken.length,
471 					0, &val);
472 			  write_exp_elt_opcode (OP_LONG);
473 			  write_exp_elt_type (val.typed_val_int.type);
474 			  write_exp_elt_longcst ((LONGEST)
475 						 val.typed_val_int.val);
476 			  write_exp_elt_opcode (OP_LONG);
477 			}
478 	;
479 
480 
481 exp	:	FLOAT
482 			{ write_exp_elt_opcode (OP_DOUBLE);
483 			  write_exp_elt_type ($1.type);
484 			  write_exp_elt_dblcst ($1.dval);
485 			  write_exp_elt_opcode (OP_DOUBLE); }
486 	;
487 
488 exp	:	variable
489 	;
490 
491 exp	:	DOLLAR_VARIABLE
492 			{
493 			  write_dollar_variable ($1);
494 			}
495 	;
496 
497 exp	:	SIZEOF_KEYWORD '(' type ')'  %prec UNARY
498 			{
499 			  /* TODO(dje): Go objects in structs.  */
500 			  write_exp_elt_opcode (OP_LONG);
501 			  /* TODO(dje): What's the right type here?  */
502 			  write_exp_elt_type (parse_type->builtin_unsigned_int);
503 			  CHECK_TYPEDEF ($3);
504 			  write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
505 			  write_exp_elt_opcode (OP_LONG);
506 			}
507 	;
508 
509 exp	:	SIZEOF_KEYWORD  '(' exp ')'  %prec UNARY
510 			{
511 			  /* TODO(dje): Go objects in structs.  */
512 			  write_exp_elt_opcode (UNOP_SIZEOF);
513 			}
514 
515 string_exp:
516 		STRING
517 			{
518 			  /* We copy the string here, and not in the
519 			     lexer, to guarantee that we do not leak a
520 			     string.  */
521 			  /* Note that we NUL-terminate here, but just
522 			     for convenience.  */
523 			  struct typed_stoken *vec = XNEW (struct typed_stoken);
524 			  $$.len = 1;
525 			  $$.tokens = vec;
526 
527 			  vec->type = $1.type;
528 			  vec->length = $1.length;
529 			  vec->ptr = malloc ($1.length + 1);
530 			  memcpy (vec->ptr, $1.ptr, $1.length + 1);
531 			}
532 
533 	|	string_exp '+' STRING
534 			{
535 			  /* Note that we NUL-terminate here, but just
536 			     for convenience.  */
537 			  char *p;
538 			  ++$$.len;
539 			  $$.tokens = realloc ($$.tokens,
540 					       $$.len * sizeof (struct typed_stoken));
541 
542 			  p = malloc ($3.length + 1);
543 			  memcpy (p, $3.ptr, $3.length + 1);
544 
545 			  $$.tokens[$$.len - 1].type = $3.type;
546 			  $$.tokens[$$.len - 1].length = $3.length;
547 			  $$.tokens[$$.len - 1].ptr = p;
548 			}
549 	;
550 
551 exp	:	string_exp  %prec ABOVE_COMMA
552 			{
553 			  int i;
554 
555 			  write_exp_string_vector (0 /*always utf8*/, &$1);
556 			  for (i = 0; i < $1.len; ++i)
557 			    free ($1.tokens[i].ptr);
558 			  free ($1.tokens);
559 			}
560 	;
561 
562 exp	:	TRUE_KEYWORD
563 			{ write_exp_elt_opcode (OP_BOOL);
564 			  write_exp_elt_longcst ((LONGEST) $1);
565 			  write_exp_elt_opcode (OP_BOOL); }
566 	;
567 
568 exp	:	FALSE_KEYWORD
569 			{ write_exp_elt_opcode (OP_BOOL);
570 			  write_exp_elt_longcst ((LONGEST) $1);
571 			  write_exp_elt_opcode (OP_BOOL); }
572 	;
573 
574 variable:	name_not_typename ENTRY
575 			{ struct symbol *sym = $1.sym;
576 
577 			  if (sym == NULL
578 			      || !SYMBOL_IS_ARGUMENT (sym)
579 			      || !symbol_read_needs_frame (sym))
580 			    error (_("@entry can be used only for function "
581 				     "parameters, not for \"%s\""),
582 				   copy_name ($1.stoken));
583 
584 			  write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
585 			  write_exp_elt_sym (sym);
586 			  write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
587 			}
588 	;
589 
590 variable:	name_not_typename
591 			{ struct symbol *sym = $1.sym;
592 
593 			  if (sym)
594 			    {
595 			      if (symbol_read_needs_frame (sym))
596 				{
597 				  if (innermost_block == 0
598 				      || contained_in (block_found,
599 						       innermost_block))
600 				    innermost_block = block_found;
601 				}
602 
603 			      write_exp_elt_opcode (OP_VAR_VALUE);
604 			      /* We want to use the selected frame, not
605 				 another more inner frame which happens to
606 				 be in the same block.  */
607 			      write_exp_elt_block (NULL);
608 			      write_exp_elt_sym (sym);
609 			      write_exp_elt_opcode (OP_VAR_VALUE);
610 			    }
611 			  else if ($1.is_a_field_of_this)
612 			    {
613 			      /* TODO(dje): Can we get here?
614 				 E.g., via a mix of c++ and go?  */
615 			      gdb_assert_not_reached ("go with `this' field");
616 			    }
617 			  else
618 			    {
619 			      struct minimal_symbol *msymbol;
620 			      char *arg = copy_name ($1.stoken);
621 
622 			      msymbol =
623 				lookup_minimal_symbol (arg, NULL, NULL);
624 			      if (msymbol != NULL)
625 				write_exp_msymbol (msymbol);
626 			      else if (!have_full_symbols ()
627 				       && !have_partial_symbols ())
628 				error (_("No symbol table is loaded.  "
629 				       "Use the \"file\" command."));
630 			      else
631 				error (_("No symbol \"%s\" in current context."),
632 				       copy_name ($1.stoken));
633 			    }
634 			}
635 	;
636 
637 /* TODO
638 method_exp: PACKAGENAME '.' name '.' name
639 			{
640 			}
641 	;
642 */
643 
644 type  /* Implements (approximately): [*] type-specifier */
645 	:	'*' type
646 			{ $$ = lookup_pointer_type ($2); }
647 	|	TYPENAME
648 			{ $$ = $1.type; }
649 /*
650 	|	STRUCT_KEYWORD name
651 			{ $$ = lookup_struct (copy_name ($2),
652 					      expression_context_block); }
653 */
654 	|	BYTE_KEYWORD
655 			{ $$ = builtin_go_type (parse_gdbarch)
656 			    ->builtin_uint8; }
657 	;
658 
659 /* TODO
660 name	:	NAME { $$ = $1.stoken; }
661 	|	TYPENAME { $$ = $1.stoken; }
662 	|	NAME_OR_INT  { $$ = $1.stoken; }
663 	;
664 */
665 
666 name_not_typename
667 	:	NAME
668 /* These would be useful if name_not_typename was useful, but it is just
669    a fake for "variable", so these cause reduce/reduce conflicts because
670    the parser can't tell whether NAME_OR_INT is a name_not_typename (=variable,
671    =exp) or just an exp.  If name_not_typename was ever used in an lvalue
672    context where only a name could occur, this might be useful.
673 	|	NAME_OR_INT
674 */
675 	;
676 
677 %%
678 
679 /* Wrapper on parse_c_float to get the type right for Go.  */
680 
681 static int
682 parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
683 		DOUBLEST *d, struct type **t)
684 {
685   int result = parse_c_float (gdbarch, p, len, d, t);
686   const struct builtin_type *builtin_types = builtin_type (gdbarch);
687   const struct builtin_go_type *builtin_go_types = builtin_go_type (gdbarch);
688 
689   if (*t == builtin_types->builtin_float)
690     *t = builtin_go_types->builtin_float32;
691   else if (*t == builtin_types->builtin_double)
692     *t = builtin_go_types->builtin_float64;
693 
694   return result;
695 }
696 
697 /* Take care of parsing a number (anything that starts with a digit).
698    Set yylval and return the token type; update lexptr.
699    LEN is the number of characters in it.  */
700 
701 /* FIXME: Needs some error checking for the float case.  */
702 /* FIXME(dje): IWBN to use c-exp.y's parse_number if we could.
703    That will require moving the guts into a function that we both call
704    as our YYSTYPE is different than c-exp.y's  */
705 
706 static int
707 parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
708 {
709   /* FIXME: Shouldn't these be unsigned?  We don't deal with negative values
710      here, and we do kind of silly things like cast to unsigned.  */
711   LONGEST n = 0;
712   LONGEST prevn = 0;
713   ULONGEST un;
714 
715   int i = 0;
716   int c;
717   int base = input_radix;
718   int unsigned_p = 0;
719 
720   /* Number of "L" suffixes encountered.  */
721   int long_p = 0;
722 
723   /* We have found a "L" or "U" suffix.  */
724   int found_suffix = 0;
725 
726   ULONGEST high_bit;
727   struct type *signed_type;
728   struct type *unsigned_type;
729 
730   if (parsed_float)
731     {
732       if (! parse_go_float (parse_gdbarch, p, len,
733 			    &putithere->typed_val_float.dval,
734 			    &putithere->typed_val_float.type))
735 	return ERROR;
736       return FLOAT;
737     }
738 
739   /* Handle base-switching prefixes 0x, 0t, 0d, 0.  */
740   if (p[0] == '0')
741     switch (p[1])
742       {
743       case 'x':
744       case 'X':
745 	if (len >= 3)
746 	  {
747 	    p += 2;
748 	    base = 16;
749 	    len -= 2;
750 	  }
751 	break;
752 
753       case 'b':
754       case 'B':
755 	if (len >= 3)
756 	  {
757 	    p += 2;
758 	    base = 2;
759 	    len -= 2;
760 	  }
761 	break;
762 
763       case 't':
764       case 'T':
765       case 'd':
766       case 'D':
767 	if (len >= 3)
768 	  {
769 	    p += 2;
770 	    base = 10;
771 	    len -= 2;
772 	  }
773 	break;
774 
775       default:
776 	base = 8;
777 	break;
778       }
779 
780   while (len-- > 0)
781     {
782       c = *p++;
783       if (c >= 'A' && c <= 'Z')
784 	c += 'a' - 'A';
785       if (c != 'l' && c != 'u')
786 	n *= base;
787       if (c >= '0' && c <= '9')
788 	{
789 	  if (found_suffix)
790 	    return ERROR;
791 	  n += i = c - '0';
792 	}
793       else
794 	{
795 	  if (base > 10 && c >= 'a' && c <= 'f')
796 	    {
797 	      if (found_suffix)
798 		return ERROR;
799 	      n += i = c - 'a' + 10;
800 	    }
801 	  else if (c == 'l')
802 	    {
803 	      ++long_p;
804 	      found_suffix = 1;
805 	    }
806 	  else if (c == 'u')
807 	    {
808 	      unsigned_p = 1;
809 	      found_suffix = 1;
810 	    }
811 	  else
812 	    return ERROR;	/* Char not a digit */
813 	}
814       if (i >= base)
815 	return ERROR;		/* Invalid digit in this base.  */
816 
817       /* Portably test for overflow (only works for nonzero values, so make
818 	 a second check for zero).  FIXME: Can't we just make n and prevn
819 	 unsigned and avoid this?  */
820       if (c != 'l' && c != 'u' && (prevn >= n) && n != 0)
821 	unsigned_p = 1;		/* Try something unsigned.  */
822 
823       /* Portably test for unsigned overflow.
824 	 FIXME: This check is wrong; for example it doesn't find overflow
825 	 on 0x123456789 when LONGEST is 32 bits.  */
826       if (c != 'l' && c != 'u' && n != 0)
827 	{
828 	  if ((unsigned_p && (ULONGEST) prevn >= (ULONGEST) n))
829 	    error (_("Numeric constant too large."));
830 	}
831       prevn = n;
832     }
833 
834   /* An integer constant is an int, a long, or a long long.  An L
835      suffix forces it to be long; an LL suffix forces it to be long
836      long.  If not forced to a larger size, it gets the first type of
837      the above that it fits in.  To figure out whether it fits, we
838      shift it right and see whether anything remains.  Note that we
839      can't shift sizeof (LONGEST) * HOST_CHAR_BIT bits or more in one
840      operation, because many compilers will warn about such a shift
841      (which always produces a zero result).  Sometimes gdbarch_int_bit
842      or gdbarch_long_bit will be that big, sometimes not.  To deal with
843      the case where it is we just always shift the value more than
844      once, with fewer bits each time.  */
845 
846   un = (ULONGEST)n >> 2;
847   if (long_p == 0
848       && (un >> (gdbarch_int_bit (parse_gdbarch) - 2)) == 0)
849     {
850       high_bit = ((ULONGEST)1) << (gdbarch_int_bit (parse_gdbarch) - 1);
851 
852       /* A large decimal (not hex or octal) constant (between INT_MAX
853 	 and UINT_MAX) is a long or unsigned long, according to ANSI,
854 	 never an unsigned int, but this code treats it as unsigned
855 	 int.  This probably should be fixed.  GCC gives a warning on
856 	 such constants.  */
857 
858       unsigned_type = parse_type->builtin_unsigned_int;
859       signed_type = parse_type->builtin_int;
860     }
861   else if (long_p <= 1
862 	   && (un >> (gdbarch_long_bit (parse_gdbarch) - 2)) == 0)
863     {
864       high_bit = ((ULONGEST)1) << (gdbarch_long_bit (parse_gdbarch) - 1);
865       unsigned_type = parse_type->builtin_unsigned_long;
866       signed_type = parse_type->builtin_long;
867     }
868   else
869     {
870       int shift;
871       if (sizeof (ULONGEST) * HOST_CHAR_BIT
872 	  < gdbarch_long_long_bit (parse_gdbarch))
873 	/* A long long does not fit in a LONGEST.  */
874 	shift = (sizeof (ULONGEST) * HOST_CHAR_BIT - 1);
875       else
876 	shift = (gdbarch_long_long_bit (parse_gdbarch) - 1);
877       high_bit = (ULONGEST) 1 << shift;
878       unsigned_type = parse_type->builtin_unsigned_long_long;
879       signed_type = parse_type->builtin_long_long;
880     }
881 
882    putithere->typed_val_int.val = n;
883 
884    /* If the high bit of the worked out type is set then this number
885       has to be unsigned.  */
886 
887    if (unsigned_p || (n & high_bit))
888      {
889        putithere->typed_val_int.type = unsigned_type;
890      }
891    else
892      {
893        putithere->typed_val_int.type = signed_type;
894      }
895 
896    return INT;
897 }
898 
899 /* Temporary obstack used for holding strings.  */
900 static struct obstack tempbuf;
901 static int tempbuf_init;
902 
903 /* Parse a string or character literal from TOKPTR.  The string or
904    character may be wide or unicode.  *OUTPTR is set to just after the
905    end of the literal in the input string.  The resulting token is
906    stored in VALUE.  This returns a token value, either STRING or
907    CHAR, depending on what was parsed.  *HOST_CHARS is set to the
908    number of host characters in the literal.  */
909 
910 static int
911 parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
912 		      int *host_chars)
913 {
914   int quote;
915 
916   /* Build the gdb internal form of the input string in tempbuf.  Note
917      that the buffer is null byte terminated *only* for the
918      convenience of debugging gdb itself and printing the buffer
919      contents when the buffer contains no embedded nulls.  Gdb does
920      not depend upon the buffer being null byte terminated, it uses
921      the length string instead.  This allows gdb to handle C strings
922      (as well as strings in other languages) with embedded null
923      bytes */
924 
925   if (!tempbuf_init)
926     tempbuf_init = 1;
927   else
928     obstack_free (&tempbuf, NULL);
929   obstack_init (&tempbuf);
930 
931   /* Skip the quote.  */
932   quote = *tokptr;
933   ++tokptr;
934 
935   *host_chars = 0;
936 
937   while (*tokptr)
938     {
939       char c = *tokptr;
940       if (c == '\\')
941 	{
942 	  ++tokptr;
943 	  *host_chars += c_parse_escape (&tokptr, &tempbuf);
944 	}
945       else if (c == quote)
946 	break;
947       else
948 	{
949 	  obstack_1grow (&tempbuf, c);
950 	  ++tokptr;
951 	  /* FIXME: this does the wrong thing with multi-byte host
952 	     characters.  We could use mbrlen here, but that would
953 	     make "set host-charset" a bit less useful.  */
954 	  ++*host_chars;
955 	}
956     }
957 
958   if (*tokptr != quote)
959     {
960       if (quote == '"')
961 	error (_("Unterminated string in expression."));
962       else
963 	error (_("Unmatched single quote."));
964     }
965   ++tokptr;
966 
967   value->type = C_STRING | (quote == '\'' ? C_CHAR : 0); /*FIXME*/
968   value->ptr = obstack_base (&tempbuf);
969   value->length = obstack_object_size (&tempbuf);
970 
971   *outptr = tokptr;
972 
973   return quote == '\'' ? CHAR : STRING;
974 }
975 
976 struct token
977 {
978   char *operator;
979   int token;
980   enum exp_opcode opcode;
981 };
982 
983 static const struct token tokentab3[] =
984   {
985     {">>=", ASSIGN_MODIFY, BINOP_RSH},
986     {"<<=", ASSIGN_MODIFY, BINOP_LSH},
987     /*{"&^=", ASSIGN_MODIFY, BINOP_BITWISE_ANDNOT}, TODO */
988     {"...", DOTDOTDOT, OP_NULL},
989   };
990 
991 static const struct token tokentab2[] =
992   {
993     {"+=", ASSIGN_MODIFY, BINOP_ADD},
994     {"-=", ASSIGN_MODIFY, BINOP_SUB},
995     {"*=", ASSIGN_MODIFY, BINOP_MUL},
996     {"/=", ASSIGN_MODIFY, BINOP_DIV},
997     {"%=", ASSIGN_MODIFY, BINOP_REM},
998     {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
999     {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
1000     {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
1001     {"++", INCREMENT, BINOP_END},
1002     {"--", DECREMENT, BINOP_END},
1003     /*{"->", RIGHT_ARROW, BINOP_END}, Doesn't exist in Go.  */
1004     {"<-", LEFT_ARROW, BINOP_END},
1005     {"&&", ANDAND, BINOP_END},
1006     {"||", OROR, BINOP_END},
1007     {"<<", LSH, BINOP_END},
1008     {">>", RSH, BINOP_END},
1009     {"==", EQUAL, BINOP_END},
1010     {"!=", NOTEQUAL, BINOP_END},
1011     {"<=", LEQ, BINOP_END},
1012     {">=", GEQ, BINOP_END},
1013     /*{"&^", ANDNOT, BINOP_END}, TODO */
1014   };
1015 
1016 /* Identifier-like tokens.  */
1017 static const struct token ident_tokens[] =
1018   {
1019     {"true", TRUE_KEYWORD, OP_NULL},
1020     {"false", FALSE_KEYWORD, OP_NULL},
1021     {"nil", NIL_KEYWORD, OP_NULL},
1022     {"const", CONST_KEYWORD, OP_NULL},
1023     {"struct", STRUCT_KEYWORD, OP_NULL},
1024     {"type", TYPE_KEYWORD, OP_NULL},
1025     {"interface", INTERFACE_KEYWORD, OP_NULL},
1026     {"chan", CHAN_KEYWORD, OP_NULL},
1027     {"byte", BYTE_KEYWORD, OP_NULL}, /* An alias of uint8.  */
1028     {"len", LEN_KEYWORD, OP_NULL},
1029     {"cap", CAP_KEYWORD, OP_NULL},
1030     {"new", NEW_KEYWORD, OP_NULL},
1031     {"iota", IOTA_KEYWORD, OP_NULL},
1032   };
1033 
1034 /* This is set if a NAME token appeared at the very end of the input
1035    string, with no whitespace separating the name from the EOF.  This
1036    is used only when parsing to do field name completion.  */
1037 static int saw_name_at_eof;
1038 
1039 /* This is set if the previously-returned token was a structure
1040    operator -- either '.' or ARROW.  This is used only when parsing to
1041    do field name completion.  */
1042 static int last_was_structop;
1043 
1044 /* Read one token, getting characters through lexptr.  */
1045 
1046 static int
1047 lex_one_token (void)
1048 {
1049   int c;
1050   int namelen;
1051   unsigned int i;
1052   char *tokstart;
1053   int saw_structop = last_was_structop;
1054   char *copy;
1055 
1056   last_was_structop = 0;
1057 
1058  retry:
1059 
1060   prev_lexptr = lexptr;
1061 
1062   tokstart = lexptr;
1063   /* See if it is a special token of length 3.  */
1064   for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
1065     if (strncmp (tokstart, tokentab3[i].operator, 3) == 0)
1066       {
1067 	lexptr += 3;
1068 	yylval.opcode = tokentab3[i].opcode;
1069 	return tokentab3[i].token;
1070       }
1071 
1072   /* See if it is a special token of length 2.  */
1073   for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
1074     if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
1075       {
1076 	lexptr += 2;
1077 	yylval.opcode = tokentab2[i].opcode;
1078 	/* NOTE: -> doesn't exist in Go, so we don't need to watch for
1079 	   setting last_was_structop here.  */
1080 	return tokentab2[i].token;
1081       }
1082 
1083   switch (c = *tokstart)
1084     {
1085     case 0:
1086       if (saw_name_at_eof)
1087 	{
1088 	  saw_name_at_eof = 0;
1089 	  return COMPLETE;
1090 	}
1091       else if (saw_structop)
1092 	return COMPLETE;
1093       else
1094         return 0;
1095 
1096     case ' ':
1097     case '\t':
1098     case '\n':
1099       lexptr++;
1100       goto retry;
1101 
1102     case '[':
1103     case '(':
1104       paren_depth++;
1105       lexptr++;
1106       return c;
1107 
1108     case ']':
1109     case ')':
1110       if (paren_depth == 0)
1111 	return 0;
1112       paren_depth--;
1113       lexptr++;
1114       return c;
1115 
1116     case ',':
1117       if (comma_terminates
1118           && paren_depth == 0)
1119 	return 0;
1120       lexptr++;
1121       return c;
1122 
1123     case '.':
1124       /* Might be a floating point number.  */
1125       if (lexptr[1] < '0' || lexptr[1] > '9')
1126 	{
1127 	  if (parse_completion)
1128 	    last_was_structop = 1;
1129 	  goto symbol;		/* Nope, must be a symbol. */
1130 	}
1131       /* FALL THRU into number case.  */
1132 
1133     case '0':
1134     case '1':
1135     case '2':
1136     case '3':
1137     case '4':
1138     case '5':
1139     case '6':
1140     case '7':
1141     case '8':
1142     case '9':
1143       {
1144 	/* It's a number.  */
1145 	int got_dot = 0, got_e = 0, toktype;
1146 	char *p = tokstart;
1147 	int hex = input_radix > 10;
1148 
1149 	if (c == '0' && (p[1] == 'x' || p[1] == 'X'))
1150 	  {
1151 	    p += 2;
1152 	    hex = 1;
1153 	  }
1154 
1155 	for (;; ++p)
1156 	  {
1157 	    /* This test includes !hex because 'e' is a valid hex digit
1158 	       and thus does not indicate a floating point number when
1159 	       the radix is hex.  */
1160 	    if (!hex && !got_e && (*p == 'e' || *p == 'E'))
1161 	      got_dot = got_e = 1;
1162 	    /* This test does not include !hex, because a '.' always indicates
1163 	       a decimal floating point number regardless of the radix.  */
1164 	    else if (!got_dot && *p == '.')
1165 	      got_dot = 1;
1166 	    else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
1167 		     && (*p == '-' || *p == '+'))
1168 	      /* This is the sign of the exponent, not the end of the
1169 		 number.  */
1170 	      continue;
1171 	    /* We will take any letters or digits.  parse_number will
1172 	       complain if past the radix, or if L or U are not final.  */
1173 	    else if ((*p < '0' || *p > '9')
1174 		     && ((*p < 'a' || *p > 'z')
1175 				  && (*p < 'A' || *p > 'Z')))
1176 	      break;
1177 	  }
1178 	toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
1179         if (toktype == ERROR)
1180 	  {
1181 	    char *err_copy = (char *) alloca (p - tokstart + 1);
1182 
1183 	    memcpy (err_copy, tokstart, p - tokstart);
1184 	    err_copy[p - tokstart] = 0;
1185 	    error (_("Invalid number \"%s\"."), err_copy);
1186 	  }
1187 	lexptr = p;
1188 	return toktype;
1189       }
1190 
1191     case '@':
1192       {
1193 	char *p = &tokstart[1];
1194 	size_t len = strlen ("entry");
1195 
1196 	while (isspace (*p))
1197 	  p++;
1198 	if (strncmp (p, "entry", len) == 0 && !isalnum (p[len])
1199 	    && p[len] != '_')
1200 	  {
1201 	    lexptr = &p[len];
1202 	    return ENTRY;
1203 	  }
1204       }
1205       /* FALLTHRU */
1206     case '+':
1207     case '-':
1208     case '*':
1209     case '/':
1210     case '%':
1211     case '|':
1212     case '&':
1213     case '^':
1214     case '~':
1215     case '!':
1216     case '<':
1217     case '>':
1218     case '?':
1219     case ':':
1220     case '=':
1221     case '{':
1222     case '}':
1223     symbol:
1224       lexptr++;
1225       return c;
1226 
1227     case '\'':
1228     case '"':
1229     case '`':
1230       {
1231 	int host_len;
1232 	int result = parse_string_or_char (tokstart, &lexptr, &yylval.tsval,
1233 					   &host_len);
1234 	if (result == CHAR)
1235 	  {
1236 	    if (host_len == 0)
1237 	      error (_("Empty character constant."));
1238 	    else if (host_len > 2 && c == '\'')
1239 	      {
1240 		++tokstart;
1241 		namelen = lexptr - tokstart - 1;
1242 		goto tryname;
1243 	      }
1244 	    else if (host_len > 1)
1245 	      error (_("Invalid character constant."));
1246 	  }
1247 	return result;
1248       }
1249     }
1250 
1251   if (!(c == '_' || c == '$'
1252 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
1253     /* We must have come across a bad character (e.g. ';').  */
1254     error (_("Invalid character '%c' in expression."), c);
1255 
1256   /* It's a name.  See how long it is.  */
1257   namelen = 0;
1258   for (c = tokstart[namelen];
1259        (c == '_' || c == '$' || (c >= '0' && c <= '9')
1260 	|| (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));)
1261     {
1262       c = tokstart[++namelen];
1263     }
1264 
1265   /* The token "if" terminates the expression and is NOT removed from
1266      the input stream.  It doesn't count if it appears in the
1267      expansion of a macro.  */
1268   if (namelen == 2
1269       && tokstart[0] == 'i'
1270       && tokstart[1] == 'f')
1271     {
1272       return 0;
1273     }
1274 
1275   /* For the same reason (breakpoint conditions), "thread N"
1276      terminates the expression.  "thread" could be an identifier, but
1277      an identifier is never followed by a number without intervening
1278      punctuation.
1279      Handle abbreviations of these, similarly to
1280      breakpoint.c:find_condition_and_thread.
1281      TODO: Watch for "goroutine" here?  */
1282   if (namelen >= 1
1283       && strncmp (tokstart, "thread", namelen) == 0
1284       && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
1285     {
1286       char *p = tokstart + namelen + 1;
1287       while (*p == ' ' || *p == '\t')
1288 	p++;
1289       if (*p >= '0' && *p <= '9')
1290 	return 0;
1291     }
1292 
1293   lexptr += namelen;
1294 
1295   tryname:
1296 
1297   yylval.sval.ptr = tokstart;
1298   yylval.sval.length = namelen;
1299 
1300   /* Catch specific keywords.  */
1301   copy = copy_name (yylval.sval);
1302   for (i = 0; i < sizeof (ident_tokens) / sizeof (ident_tokens[0]); i++)
1303     if (strcmp (copy, ident_tokens[i].operator) == 0)
1304       {
1305 	/* It is ok to always set this, even though we don't always
1306 	   strictly need to.  */
1307 	yylval.opcode = ident_tokens[i].opcode;
1308 	return ident_tokens[i].token;
1309       }
1310 
1311   if (*tokstart == '$')
1312     return DOLLAR_VARIABLE;
1313 
1314   if (parse_completion && *lexptr == '\0')
1315     saw_name_at_eof = 1;
1316   return NAME;
1317 }
1318 
1319 /* An object of this type is pushed on a FIFO by the "outer" lexer.  */
1320 typedef struct
1321 {
1322   int token;
1323   YYSTYPE value;
1324 } token_and_value;
1325 
1326 DEF_VEC_O (token_and_value);
1327 
1328 /* A FIFO of tokens that have been read but not yet returned to the
1329    parser.  */
1330 static VEC (token_and_value) *token_fifo;
1331 
1332 /* Non-zero if the lexer should return tokens from the FIFO.  */
1333 static int popping;
1334 
1335 /* Temporary storage for yylex; this holds symbol names as they are
1336    built up.  */
1337 static struct obstack name_obstack;
1338 
1339 /* Build "package.name" in name_obstack.
1340    For convenience of the caller, the name is NUL-terminated,
1341    but the NUL is not included in the recorded length.  */
1342 
1343 static struct stoken
1344 build_packaged_name (const char *package, int package_len,
1345 		     const char *name, int name_len)
1346 {
1347   struct stoken result;
1348 
1349   obstack_free (&name_obstack, obstack_base (&name_obstack));
1350   obstack_grow (&name_obstack, package, package_len);
1351   obstack_grow_str (&name_obstack, ".");
1352   obstack_grow (&name_obstack, name, name_len);
1353   obstack_grow (&name_obstack, "", 1);
1354   result.ptr = obstack_base (&name_obstack);
1355   result.length = obstack_object_size (&name_obstack) - 1;
1356 
1357   return result;
1358 }
1359 
1360 /* Return non-zero if NAME is a package name.
1361    BLOCK is the scope in which to interpret NAME; this can be NULL
1362    to mean the global scope.  */
1363 
1364 static int
1365 package_name_p (const char *name, const struct block *block)
1366 {
1367   struct symbol *sym;
1368   struct field_of_this_result is_a_field_of_this;
1369 
1370   sym = lookup_symbol (name, block, STRUCT_DOMAIN, &is_a_field_of_this);
1371 
1372   if (sym
1373       && SYMBOL_CLASS (sym) == LOC_TYPEDEF
1374       && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_MODULE)
1375     return 1;
1376 
1377   return 0;
1378 }
1379 
1380 /* Classify a (potential) function in the "unsafe" package.
1381    We fold these into "keywords" to keep things simple, at least until
1382    something more complex is warranted.  */
1383 
1384 static int
1385 classify_unsafe_function (struct stoken function_name)
1386 {
1387   char *copy = copy_name (function_name);
1388 
1389   if (strcmp (copy, "Sizeof") == 0)
1390     {
1391       yylval.sval = function_name;
1392       return SIZEOF_KEYWORD;
1393     }
1394 
1395   error (_("Unknown function in `unsafe' package: %s"), copy);
1396 }
1397 
1398 /* Classify token(s) "name1.name2" where name1 is known to be a package.
1399    The contents of the token are in `yylval'.
1400    Updates yylval and returns the new token type.
1401 
1402    The result is one of NAME, NAME_OR_INT, or TYPENAME.  */
1403 
1404 static int
1405 classify_packaged_name (const struct block *block)
1406 {
1407   char *copy;
1408   struct symbol *sym;
1409   struct field_of_this_result is_a_field_of_this;
1410 
1411   copy = copy_name (yylval.sval);
1412 
1413   sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
1414 
1415   if (sym)
1416     {
1417       yylval.ssym.sym = sym;
1418       yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1419     }
1420 
1421   return NAME;
1422 }
1423 
1424 /* Classify a NAME token.
1425    The contents of the token are in `yylval'.
1426    Updates yylval and returns the new token type.
1427    BLOCK is the block in which lookups start; this can be NULL
1428    to mean the global scope.
1429 
1430    The result is one of NAME, NAME_OR_INT, or TYPENAME.  */
1431 
1432 static int
1433 classify_name (const struct block *block)
1434 {
1435   struct type *type;
1436   struct symbol *sym;
1437   char *copy;
1438   struct field_of_this_result is_a_field_of_this;
1439 
1440   copy = copy_name (yylval.sval);
1441 
1442   /* Try primitive types first so they win over bad/weird debug info.  */
1443   type = language_lookup_primitive_type_by_name (parse_language,
1444 						 parse_gdbarch, copy);
1445   if (type != NULL)
1446     {
1447       /* NOTE: We take advantage of the fact that yylval coming in was a
1448 	 NAME, and that struct ttype is a compatible extension of struct
1449 	 stoken, so yylval.tsym.stoken is already filled in.  */
1450       yylval.tsym.type = type;
1451       return TYPENAME;
1452     }
1453 
1454   /* TODO: What about other types?  */
1455 
1456   sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
1457 
1458   if (sym)
1459     {
1460       yylval.ssym.sym = sym;
1461       yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1462       return NAME;
1463     }
1464 
1465   /* If we didn't find a symbol, look again in the current package.
1466      This is to, e.g., make "p global_var" work without having to specify
1467      the package name.  We intentionally only looks for objects in the
1468      current package.  */
1469 
1470   {
1471     char *current_package_name = go_block_package_name (block);
1472 
1473     if (current_package_name != NULL)
1474       {
1475 	struct stoken sval =
1476 	  build_packaged_name (current_package_name,
1477 			       strlen (current_package_name),
1478 			       copy, strlen (copy));
1479 
1480 	xfree (current_package_name);
1481 	sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN,
1482 			     &is_a_field_of_this);
1483 	if (sym)
1484 	  {
1485 	    yylval.ssym.stoken = sval;
1486 	    yylval.ssym.sym = sym;
1487 	    yylval.ssym.is_a_field_of_this = is_a_field_of_this.type != NULL;
1488 	    return NAME;
1489 	  }
1490       }
1491   }
1492 
1493   /* Input names that aren't symbols but ARE valid hex numbers, when
1494      the input radix permits them, can be names or numbers depending
1495      on the parse.  Note we support radixes > 16 here.  */
1496   if ((copy[0] >= 'a' && copy[0] < 'a' + input_radix - 10)
1497       || (copy[0] >= 'A' && copy[0] < 'A' + input_radix - 10))
1498     {
1499       YYSTYPE newlval;	/* Its value is ignored.  */
1500       int hextype = parse_number (copy, yylval.sval.length, 0, &newlval);
1501       if (hextype == INT)
1502 	{
1503 	  yylval.ssym.sym = NULL;
1504 	  yylval.ssym.is_a_field_of_this = 0;
1505 	  return NAME_OR_INT;
1506 	}
1507     }
1508 
1509   yylval.ssym.sym = NULL;
1510   yylval.ssym.is_a_field_of_this = 0;
1511   return NAME;
1512 }
1513 
1514 /* This is taken from c-exp.y mostly to get something working.
1515    The basic structure has been kept because we may yet need some of it.  */
1516 
1517 static int
1518 yylex (void)
1519 {
1520   token_and_value current, next;
1521 
1522   if (popping && !VEC_empty (token_and_value, token_fifo))
1523     {
1524       token_and_value tv = *VEC_index (token_and_value, token_fifo, 0);
1525       VEC_ordered_remove (token_and_value, token_fifo, 0);
1526       yylval = tv.value;
1527       /* There's no need to fall through to handle package.name
1528 	 as that can never happen here.  In theory.  */
1529       return tv.token;
1530     }
1531   popping = 0;
1532 
1533   current.token = lex_one_token ();
1534 
1535   /* TODO: Need a way to force specifying name1 as a package.
1536      .name1.name2 ?  */
1537 
1538   if (current.token != NAME)
1539     return current.token;
1540 
1541   /* See if we have "name1 . name2".  */
1542 
1543   current.value = yylval;
1544   next.token = lex_one_token ();
1545   next.value = yylval;
1546 
1547   if (next.token == '.')
1548     {
1549       token_and_value name2;
1550 
1551       name2.token = lex_one_token ();
1552       name2.value = yylval;
1553 
1554       if (name2.token == NAME)
1555 	{
1556 	  /* Ok, we have "name1 . name2".  */
1557 	  char *copy;
1558 
1559 	  copy = copy_name (current.value.sval);
1560 
1561 	  if (strcmp (copy, "unsafe") == 0)
1562 	    {
1563 	      popping = 1;
1564 	      return classify_unsafe_function (name2.value.sval);
1565 	    }
1566 
1567 	  if (package_name_p (copy, expression_context_block))
1568 	    {
1569 	      popping = 1;
1570 	      yylval.sval = build_packaged_name (current.value.sval.ptr,
1571 						 current.value.sval.length,
1572 						 name2.value.sval.ptr,
1573 						 name2.value.sval.length);
1574 	      return classify_packaged_name (expression_context_block);
1575 	    }
1576 	}
1577 
1578       VEC_safe_push (token_and_value, token_fifo, &next);
1579       VEC_safe_push (token_and_value, token_fifo, &name2);
1580     }
1581   else
1582     {
1583       VEC_safe_push (token_and_value, token_fifo, &next);
1584     }
1585 
1586   /* If we arrive here we don't have a package-qualified name.  */
1587 
1588   popping = 1;
1589   yylval = current.value;
1590   return classify_name (expression_context_block);
1591 }
1592 
1593 int
1594 go_parse (void)
1595 {
1596   int result;
1597   struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
1598 
1599   make_cleanup_restore_integer (&yydebug);
1600   yydebug = parser_debug;
1601 
1602   /* Initialize some state used by the lexer.  */
1603   last_was_structop = 0;
1604   saw_name_at_eof = 0;
1605 
1606   VEC_free (token_and_value, token_fifo);
1607   popping = 0;
1608   obstack_init (&name_obstack);
1609   make_cleanup_obstack_free (&name_obstack);
1610 
1611   result = yyparse ();
1612   do_cleanups (back_to);
1613   return result;
1614 }
1615 
1616 void
1617 yyerror (char *msg)
1618 {
1619   if (prev_lexptr)
1620     lexptr = prev_lexptr;
1621 
1622   error (_("A %s in expression, near `%s'."), (msg ? msg : "error"), lexptr);
1623 }
1624