1 /* FLEX lexer for Ada expressions, for GDB.
2 Copyright (C) 1994, 1997, 1998, 2000, 2001, 2002, 2003
3 Free Software Foundation, Inc.
5 This file is part of GDB.
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 2 of the License, or
10 (at your option) any later version.
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.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /*----------------------------------------------------------------------*/
23 /* The converted version of this file is to be included in ada-exp.y, */
24 /* the Ada parser for gdb. The function yylex obtains characters from */
25 /* the global pointer lexptr. It returns a syntactic category for */
26 /* each successive token and places a semantic value into yylval */
27 /* (ada-lval), defined by the parser. */
30 NUM10 ({DIG}({DIG}|_)*)
32 NUM16 ({HEXDIG}({HEXDIG}|_)*)
35 ID ({LETTER}({LETTER}|{DIG})*|"<"{LETTER}({LETTER}|{DIG})*">")
38 GRAPHIC [a-z0-9 #&'()*+,-./:;<>=_|!$%?@\[\]\\^`{}~]
39 OPER ([-+*/=<>&]|"<="|">="|"**"|"/="|"and"|"or"|"xor"|"not"|"mod"|"rem"|"abs")
46 #define NUMERAL_WIDTH 256
47 #define LONGEST_SIGN ((ULONGEST) 1 << (sizeof(LONGEST) * HOST_CHAR_BIT - 1))
49 /* Temporary staging for numeric literals. */
50 static char numbuf[NUMERAL_WIDTH];
51 static void canonicalizeNumeral (char *s1, const char *);
52 static int processInt (const char *, const char *, const char *);
53 static int processReal (const char *);
54 static int processId (const char *, int);
55 static int processAttribute (const char *);
56 static int find_dot_all (const char *);
59 #define YY_DECL static int yylex ( void )
62 #define YY_INPUT(BUF, RESULT, MAX_SIZE) \
63 if ( *lexptr == '\000' ) \
72 static char *tempbuf = NULL;
73 static int tempbufsize = 0;
74 static int tempbuf_len;
75 static struct block *left_block_context;
77 static void resize_tempbuf (unsigned int);
79 static void block_lookup (char *, char *);
81 static int name_lookup (char *, char *, int *, int);
83 static int find_dot_all (const char *);
87 %option case-insensitive interactive nodefault
89 %s IN_STRING BEFORE_QUAL_QUOTE
95 "--".* { yyterminate(); }
98 canonicalizeNumeral (numbuf, yytext);
99 return processInt (NULL, numbuf, strrchr(numbuf, 'e')+1);
103 canonicalizeNumeral (numbuf, yytext);
104 return processInt (NULL, numbuf, NULL);
107 {NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#"{POSEXP} {
108 canonicalizeNumeral (numbuf, yytext);
109 return processInt (numbuf,
110 strchr (numbuf, '#') + 1,
111 strrchr(numbuf, '#') + 1);
114 {NUM10}"#"{HEXDIG}({HEXDIG}|_)*"#" {
115 canonicalizeNumeral (numbuf, yytext);
116 return processInt (numbuf, strchr (numbuf, '#') + 1, NULL);
120 canonicalizeNumeral (numbuf, yytext+2);
121 return processInt ("16#", numbuf, NULL);
125 {NUM10}"."{NUM10}{EXP} {
126 canonicalizeNumeral (numbuf, yytext);
127 return processReal (numbuf);
131 canonicalizeNumeral (numbuf, yytext);
132 return processReal (numbuf);
135 {NUM10}"#"{NUM16}"."{NUM16}"#"{EXP} {
136 error ("Based real literals not implemented yet.");
139 {NUM10}"#"{NUM16}"."{NUM16}"#" {
140 error ("Based real literals not implemented yet.");
143 <INITIAL>"'"({GRAPHIC}|\")"'" {
144 yylval.typed_val.type = type_char ();
145 yylval.typed_val.val = yytext[1];
149 <INITIAL>"'[\""{HEXDIG}{2}"\"]'" {
151 yylval.typed_val.type = type_char ();
152 sscanf (yytext+3, "%2x", &v);
153 yylval.typed_val.val = v;
162 <IN_STRING>{GRAPHIC}*\" {
163 resize_tempbuf (yyleng+tempbuf_len);
164 strncpy (tempbuf+tempbuf_len, yytext, yyleng-1);
165 tempbuf_len += yyleng-1;
166 yylval.sval.ptr = tempbuf;
167 yylval.sval.length = tempbuf_len;
172 <IN_STRING>{GRAPHIC}*"[\""{HEXDIG}{2}"\"]" {
174 resize_tempbuf (yyleng-5+tempbuf_len+1);
175 strncpy (tempbuf+tempbuf_len, yytext, yyleng-6);
176 sscanf(yytext+yyleng-4, "%2x", &n);
177 tempbuf[yyleng-6+tempbuf_len] = (char) n;
178 tempbuf_len += yyleng-5;
181 <IN_STRING>{GRAPHIC}*"[\"\"\"]" {
183 resize_tempbuf (yyleng-4+tempbuf_len+1);
184 strncpy (tempbuf+tempbuf_len, yytext, yyleng-6);
185 tempbuf[yyleng-5+tempbuf_len] = '"';
186 tempbuf_len += yyleng-4;
190 while (*lexptr != 'i' && *lexptr != 'I')
199 and { return _AND_; }
200 else { return ELSE; }
205 null { return NULL_PTR; }
208 then { return THEN; }
213 {TICK}[a-zA-Z][a-zA-Z]+ { return processAttribute (yytext+1); }
217 "=>" { return ARROW; }
218 ".." { return DOTDOT; }
219 "**" { return STARSTAR; }
220 ":=" { return ASSIGN; }
221 "/=" { return NOTEQUAL; }
225 <BEFORE_QUAL_QUOTE>"'" { BEGIN INITIAL; return '\''; }
227 [-&*+./:<>=|;\[\]] { return yytext[0]; }
229 "," { if (paren_depth == 0 && comma_terminates)
239 "(" { paren_depth += 1; return '('; }
240 ")" { if (paren_depth == 0)
253 "."{WHITE}*all { return DOT_ALL; }
256 processId (yytext+1, yyleng-1);
260 {ID}({WHITE}*"."{WHITE}*({ID}|\"{OPER}\"))*(" "*"'")? {
261 int all_posn = find_dot_all (yytext);
262 int token_type, segments, k;
265 if (all_posn == -1 && yytext[yyleng-1] == '\'')
270 } while (yytext[yyleng-1] == ' ');
277 processId(yytext, yyleng);
278 segments = name_lookup (ada_encode (yylval.ssym.stoken.ptr),
279 yylval.ssym.stoken.ptr,
281 MAX_RENAMING_CHAIN_LENGTH);
282 left_block_context = NULL;
283 for (k = yyleng; segments > 0 && k > 0; k -= 1)
285 if (yytext[k-1] == '.')
290 error ("confused by name %s", yytext);
293 BEGIN BEFORE_QUAL_QUOTE;
297 /* GDB EXPRESSION CONSTRUCTS */
300 "'"[^']+"'"{WHITE}*:: {
301 processId(yytext, yyleng-2);
302 block_lookup (yylval.ssym.stoken.ptr, yylval.ssym.stoken.ptr);
306 {ID}({WHITE}*"."{WHITE}*({ID}|\"{OPER}\"))*{WHITE}*:: {
307 processId(yytext, yyleng-2);
308 block_lookup (ada_encode (yylval.ssym.stoken.ptr),
309 yylval.ssym.stoken.ptr);
313 [{}@] { return yytext[0]; }
315 /* REGISTERS AND GDB CONVENIENCE VARIABLES */
317 "$"({LETTER}|{DIG}|"$")* {
318 yylval.sval.ptr = yytext;
319 yylval.sval.length = yyleng;
320 return SPECIAL_VARIABLE;
323 /* CATCH-ALL ERROR CASE */
325 . { error ("Invalid character '%s' in expression.", yytext); }
329 #include "gdb_string.h"
331 /* Initialize the lexer for processing new expression */
333 lexer_init (FILE *inp)
340 /* Make sure that tempbuf points at an array at least N characters long. */
343 resize_tempbuf (unsigned int n)
347 tempbufsize = (n+63) & ~63;
348 tempbuf = xrealloc (tempbuf, tempbufsize);
352 /* Copy S2 to S1, removing all underscores, and downcasing all letters. */
355 canonicalizeNumeral (char *s1, const char *s2)
357 for (; *s2 != '\000'; s2 += 1)
368 #define HIGH_BYTE_POSN ((sizeof (ULONGEST) - 1) * HOST_CHAR_BIT)
370 /* True (non-zero) iff DIGIT is a valid digit in radix BASE,
371 where 2 <= BASE <= 16. */
374 is_digit_in_base (unsigned char digit, int base)
376 if (!isxdigit (digit))
379 return (isdigit (digit) && digit < base + '0');
381 return (isdigit (digit) || tolower (digit) < base - 10 + 'a');
385 digit_to_int (unsigned char c)
390 return tolower (c) - 'a' + 10;
393 /* As for strtoul, but for ULONGEST results. */
395 strtoulst (const char *num, const char **trailer, int base)
397 unsigned int high_part;
402 if (base < 2 || base > 16)
407 lim = base - 1 + '0';
409 result = high_part = 0;
410 for (i = 0; is_digit_in_base (num[i], base); i += 1)
412 result = result*base + digit_to_int (num[i]);
413 high_part = high_part*base + (unsigned int) (result >> HIGH_BYTE_POSN);
414 result &= ((ULONGEST) 1 << HIGH_BYTE_POSN) - 1;
415 if (high_part > 0xff)
418 result = high_part = 0;
426 return result + ((ULONGEST) high_part << HIGH_BYTE_POSN);
431 /* Interprets the prefix of NUM that consists of digits of the given BASE
432 as an integer of that BASE, with the string EXP as an exponent.
433 Puts value in yylval, and returns INT, if the string is valid. Causes
434 an error if the number is improperly formated. BASE, if NULL, defaults
435 to "10", and EXP to "1". The EXP does not contain a leading 'e' or 'E'. */
438 processInt (const char *base0, const char *num0, const char *exp0)
450 base = strtol (base0, (char **) NULL, 10);
451 if (base < 2 || base > 16)
452 error ("Invalid base: %d.", base);
458 exp = strtol(exp0, (char **) NULL, 10);
461 result = strtoulst (num0, (const char **) &trailer, base);
463 error ("Integer literal out of range");
464 if (isxdigit(*trailer))
465 error ("Invalid digit `%c' in based literal", *trailer);
469 if (result > (ULONG_MAX / base))
470 error ("Integer literal out of range");
475 if ((result >> (TARGET_INT_BIT-1)) == 0)
476 yylval.typed_val.type = type_int ();
477 else if ((result >> (TARGET_LONG_BIT-1)) == 0)
478 yylval.typed_val.type = type_long ();
479 else if (((result >> (TARGET_LONG_BIT-1)) >> 1) == 0)
481 /* We have a number representable as an unsigned integer quantity.
482 For consistency with the C treatment, we will treat it as an
483 anonymous modular (unsigned) quantity. Alas, the types are such
484 that we need to store .val as a signed quantity. Sorry
485 for the mess, but C doesn't officially guarantee that a simple
486 assignment does the trick (no, it doesn't; read the reference manual).
488 yylval.typed_val.type = builtin_type_unsigned_long;
489 if (result & LONGEST_SIGN)
490 yylval.typed_val.val =
491 (LONGEST) (result & ~LONGEST_SIGN)
492 - (LONGEST_SIGN>>1) - (LONGEST_SIGN>>1);
494 yylval.typed_val.val = (LONGEST) result;
498 yylval.typed_val.type = type_long_long ();
500 yylval.typed_val.val = (LONGEST) result;
504 #if defined (PRINTF_HAS_LONG_DOUBLE)
505 # undef PRINTF_HAS_LONG_DOUBLE
506 # define PRINTF_HAS_LONG_DOUBLE 1
508 # define PRINTF_HAS_LONG_DOUBLE 0
512 processReal (const char *num0)
514 #if defined (PRINTF_HAS_LONG_DOUBLE)
515 if (sizeof (DOUBLEST) > sizeof (double))
516 sscanf (num0, "%Lg", &yylval.typed_val_float.dval);
521 sscanf (num0, "%lg", &temp);
522 yylval.typed_val_float.dval = temp;
525 yylval.typed_val_float.type = type_float ();
526 if (sizeof(DOUBLEST) >= TARGET_DOUBLE_BIT / TARGET_CHAR_BIT)
527 yylval.typed_val_float.type = type_double ();
528 if (sizeof(DOUBLEST) >= TARGET_LONG_DOUBLE_BIT / TARGET_CHAR_BIT)
529 yylval.typed_val_float.type = type_long_double ();
535 processId (const char *name0, int len)
537 char *name = obstack_alloc (&temp_parse_space, len + 11);
540 while (len > 0 && isspace (name0[len-1]))
545 if (isalnum (name0[i0]))
547 name[i] = tolower (name0[i0]);
550 else switch (name0[i0])
561 while (i0 < len && name0[i0] != '\'')
570 while (i0 < len && name0[i0] != '>')
581 yylval.ssym.sym = NULL;
582 yylval.ssym.stoken.ptr = name;
583 yylval.ssym.stoken.length = i;
588 block_lookup (char *name, char *err_name)
590 struct ada_symbol_info *syms;
592 struct symtab *symtab;
593 nsyms = ada_lookup_symbol_list (name, left_block_context,
595 if (left_block_context == NULL &&
596 (nsyms == 0 || SYMBOL_CLASS (syms[0].sym) != LOC_BLOCK))
597 symtab = lookup_symtab (name);
602 left_block_context = yylval.bval =
603 BLOCKVECTOR_BLOCK (BLOCKVECTOR (symtab), STATIC_BLOCK);
604 else if (nsyms == 0 || SYMBOL_CLASS (syms[0].sym) != LOC_BLOCK)
606 if (left_block_context == NULL)
607 error ("No file or function \"%s\".", err_name);
609 error ("No function \"%s\" in specified context.", err_name);
613 left_block_context = yylval.bval = SYMBOL_BLOCK_VALUE (syms[0].sym);
615 warning ("Function name \"%s\" ambiguous here", err_name);
619 /* Look up NAME0 (assumed to be encoded) as a name in VAR_DOMAIN,
620 setting *TOKEN_TYPE to NAME or TYPENAME, depending on what is
621 found. Try first the entire name, then the name without the last
622 segment (i.e., after the last .id), etc., and return the number of
623 segments that had to be removed to get a match. Try only the full
624 name if it starts with "standard__". Calls error if no
625 matches are found, using ERR_NAME in any error message. When
626 exactly one symbol match is found, it is placed in yylval. When
627 the symbol is a renaming, follow at most DEPTH steps to find the
628 ultimate definition; cause error if depth exceeded. */
631 name_lookup (char *name0, char *err_name, int *token_type, int depth)
633 struct ada_symbol_info *syms;
635 int len0 = strlen (name0);
636 char *name = obsavestring (name0, len0, &temp_parse_space);
641 error ("Could not find renamed symbol \"%s\"", err_name);
643 yylval.ssym.stoken.ptr = name;
644 yylval.ssym.stoken.length = strlen (name);
645 for (segments = 0; ; segments += 1)
647 struct type *preferred_type;
648 int i, preferred_index;
650 if (left_block_context == NULL)
651 nsyms = ada_lookup_symbol_list (name, expression_context_block,
654 nsyms = ada_lookup_symbol_list (name, left_block_context,
658 /* Check for a type renaming. */
660 if (nsyms == 1 && !ada_is_object_renaming (syms[0].sym))
662 struct symbol *renaming_sym =
663 ada_find_renaming_symbol (SYMBOL_LINKAGE_NAME (syms[0].sym),
666 if (renaming_sym != NULL)
667 syms[0].sym = renaming_sym;
670 /* Check for a type definition. */
672 /* Look for a symbol that doesn't denote void. This is (I think) a */
673 /* temporary kludge to get around problems in GNAT output. */
674 preferred_index = -1; preferred_type = NULL;
675 for (i = 0; i < nsyms; i += 1)
676 switch (SYMBOL_CLASS (syms[i].sym))
679 if (ada_prefer_type (SYMBOL_TYPE (syms[i].sym), preferred_type))
682 preferred_type = SYMBOL_TYPE (syms[i].sym);
689 case LOC_REGPARM_ADDR:
693 case LOC_BASEREG_ARG:
695 case LOC_COMPUTED_ARG:
700 if (preferred_type != NULL)
702 if (TYPE_CODE (preferred_type) == TYPE_CODE_VOID)
703 error ("`%s' matches only void type name(s)",
705 else if (ada_is_object_renaming (syms[preferred_index].sym))
707 yylval.ssym.sym = syms[preferred_index].sym;
708 *token_type = OBJECT_RENAMING;
711 else if (ada_renaming_type (SYMBOL_TYPE (syms[preferred_index].sym))
716 = ada_simple_renamed_entity (syms[preferred_index].sym);
718 = (char *) obstack_alloc (&temp_parse_space,
719 strlen (renaming) + len0
720 - yylval.ssym.stoken.length + 1);
721 strcpy (new_name, renaming);
723 strcat (new_name, name0 + yylval.ssym.stoken.length);
724 result = name_lookup (new_name, err_name, token_type, depth - 1);
725 if (result > segments)
726 error ("Confused by renamed symbol.");
729 else if (segments == 0)
731 yylval.tval = preferred_type;
732 *token_type = TYPENAME;
739 type = language_lookup_primitive_type_by_name (current_language,
742 if (type == NULL && strcmp ("system__address", name) == 0)
743 type = type_system_address ();
746 /* First check to see if we have a regular definition of this
747 type that just didn't happen to have been read yet. */
750 char *expanded_name =
751 (char *) alloca (strlen (name) + sizeof ("standard__"));
752 strcpy (expanded_name, "standard__");
753 strcat (expanded_name, name);
754 sym = ada_lookup_symbol (expanded_name, NULL,
755 VAR_DOMAIN, NULL, NULL);
756 if (sym != NULL && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
757 type = SYMBOL_TYPE (sym);
760 *token_type = TYPENAME;
769 yylval.ssym.sym = syms[0].sym;
770 yylval.ssym.msym = NULL;
771 yylval.ssym.block = syms[0].block;
774 else if (nsyms == 0) {
776 yylval.ssym.msym = ada_lookup_simple_minsym (name);
777 if (yylval.ssym.msym != NULL)
779 yylval.ssym.sym = NULL;
780 yylval.ssym.block = NULL;
786 && strncmp (name, "standard__", sizeof ("standard__") - 1) == 0)
787 error ("No definition of \"%s\" found.", err_name);
789 for (i = yylval.ssym.stoken.length - 1; i > 0; i -= 1)
794 yylval.ssym.stoken.length = i;
797 else if (name[i] == '_' && name[i-1] == '_')
801 yylval.ssym.stoken.length = i;
807 if (!have_full_symbols () && !have_partial_symbols ()
808 && left_block_context == NULL)
809 error ("No symbol table is loaded. Use the \"file\" command.");
810 if (left_block_context == NULL)
811 error ("No definition of \"%s\" in current context.",
814 error ("No definition of \"%s\" in specified context.",
821 yylval.ssym.sym = NULL;
822 yylval.ssym.msym = NULL;
823 if (left_block_context == NULL)
824 yylval.ssym.block = expression_context_block;
826 yylval.ssym.block = left_block_context;
832 /* Returns the position within STR of the '.' in a
833 '.{WHITE}*all' component of a dotted name, or -1 if there is none. */
835 find_dot_all (const char *str)
838 for (i = 0; str[i] != '\000'; i += 1)
845 while (isspace (str[i]));
846 if (strcmp (str+i, "all") == 0
847 && ! isalnum (str[i+3]) && str[i+3] != '_')
854 /* Returns non-zero iff string SUBSEQ matches a subsequence of STR, ignoring
858 subseqMatch (const char *subseq, const char *str)
860 if (subseq[0] == '\0')
862 else if (str[0] == '\0')
864 else if (tolower (subseq[0]) == tolower (str[0]))
865 return subseqMatch (subseq+1, str+1) || subseqMatch (subseq, str+1);
867 return subseqMatch (subseq, str+1);
871 static struct { const char *name; int code; }
873 { "address", TICK_ADDRESS },
874 { "unchecked_access", TICK_ACCESS },
875 { "unrestricted_access", TICK_ACCESS },
876 { "access", TICK_ACCESS },
877 { "first", TICK_FIRST },
878 { "last", TICK_LAST },
879 { "length", TICK_LENGTH },
882 { "modulus", TICK_MODULUS },
884 { "range", TICK_RANGE },
885 { "size", TICK_SIZE },
891 /* Return the syntactic code corresponding to the attribute name or
895 processAttribute (const char *str)
899 for (i = 0; attributes[i].code != -1; i += 1)
900 if (strcasecmp (str, attributes[i].name) == 0)
901 return attributes[i].code;
903 for (i = 0, k = -1; attributes[i].code != -1; i += 1)
904 if (subseqMatch (str, attributes[i].name))
909 error ("ambiguous attribute name: `%s'", str);
912 error ("unrecognized attribute: `%s'", str);
914 return attributes[k].code;
923 /* Dummy definition to suppress warnings about unused static definitions. */
924 typedef void (*dummy_function) ();
925 dummy_function ada_flex_use[] =
927 (dummy_function) yyunput