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