]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/m2-exp.y
note name change of cdtest-bar.cc
[thirdparty/binutils-gdb.git] / gdb / m2-exp.y
CommitLineData
3d6b6a90 1/* YACC grammar for Modula-2 expressions, for GDB.
ba47c66a
PS
2 Copyright (C) 1986, 1989, 1990, 1991, 1993, 1994
3 Free Software Foundation, Inc.
3d6b6a90
JG
4 Generated from expread.y (now c-exp.y) and contributed by the Department
5 of Computer Science at the State University of New York at Buffalo, 1991.
6
7This file is part of GDB.
8
9This program is free software; you can redistribute it and/or modify
10it under the terms of the GNU General Public License as published by
11the Free Software Foundation; either version 2 of the License, or
12(at your option) any later version.
13
14This program is distributed in the hope that it will be useful,
15but WITHOUT ANY WARRANTY; without even the implied warranty of
16MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17GNU General Public License for more details.
18
19You should have received a copy of the GNU General Public License
20along with this program; if not, write to the Free Software
21Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
22
23/* Parse a Modula-2 expression from text in a string,
24 and return the result as a struct expression pointer.
25 That structure contains arithmetic operations in reverse polish,
26 with constants represented by operations that are followed by special data.
27 See expression.h for the details of the format.
28 What is important here is that it can be built up sequentially
29 during the process of parsing; the lower levels of the tree always
e35843d4
FF
30 come first in the result.
31
32 Note that malloc's and realloc's in this file are transformed to
33 xmalloc and xrealloc respectively by the same sed command in the
34 makefile that remaps any other malloc/realloc inserted by the parser
35 generator. Doing this with #defines and trying to control the interaction
36 with include files (<malloc.h> and <stdlib.h> for example) just became
37 too messy, particularly when such includes can be inserted at random
38 times by the parser generator. */
3d6b6a90
JG
39
40%{
e35843d4 41
3d6b6a90 42#include "defs.h"
ba47c66a 43#include <string.h>
3d6b6a90
JG
44#include "expression.h"
45#include "language.h"
39bf5952 46#include "value.h"
3d6b6a90 47#include "parser-defs.h"
22e39759 48#include "m2-lang.h"
100f92e2
JK
49#include "bfd.h" /* Required by objfiles.h. */
50#include "symfile.h" /* Required by objfiles.h. */
51#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
3d6b6a90 52
19d0f3f4
FF
53/* Remap normal yacc parser interface names (yyparse, yylex, yyerror, etc),
54 as well as gratuitiously global symbol names, so we can have multiple
55 yacc generated parsers in gdb. Note that these are only the variables
56 produced by yacc. If other parser generators (bison, byacc, etc) produce
57 additional global names that conflict at link time, then those parser
58 generators need to be fixed instead of adding those names to this list. */
59
d018c8a6 60#define yymaxdepth m2_maxdepth
3d6b6a90
JG
61#define yyparse m2_parse
62#define yylex m2_lex
63#define yyerror m2_error
64#define yylval m2_lval
65#define yychar m2_char
66#define yydebug m2_debug
67#define yypact m2_pact
68#define yyr1 m2_r1
69#define yyr2 m2_r2
70#define yydef m2_def
71#define yychk m2_chk
72#define yypgo m2_pgo
73#define yyact m2_act
74#define yyexca m2_exca
4015bfb9
BK
75#define yyerrflag m2_errflag
76#define yynerrs m2_nerrs
39bf5952
JG
77#define yyps m2_ps
78#define yypv m2_pv
79#define yys m2_s
d018c8a6 80#define yy_yys m2_yys
39bf5952
JG
81#define yystate m2_state
82#define yytmp m2_tmp
83#define yyv m2_v
d018c8a6 84#define yy_yyv m2_yyv
39bf5952
JG
85#define yyval m2_val
86#define yylloc m2_lloc
4015bfb9
BK
87#define yyreds m2_reds /* With YYDEBUG defined */
88#define yytoks m2_toks /* With YYDEBUG defined */
3d6b6a90 89
19d0f3f4
FF
90#ifndef YYDEBUG
91#define YYDEBUG 0 /* Default to no yydebug support */
be772100 92#endif
1ab3bf1b 93
19d0f3f4
FF
94int
95yyparse PARAMS ((void));
1ab3bf1b
JG
96
97static int
98yylex PARAMS ((void));
99
22e39759 100void
1ab3bf1b
JG
101yyerror PARAMS ((char *));
102
19d0f3f4
FF
103#if 0
104static char *
105make_qualname PARAMS ((char *, char *));
106#endif
107
108static int
109parse_number PARAMS ((int));
3d6b6a90
JG
110
111/* The sign of the number being parsed. */
e58de8a2 112static int number_sign = 1;
3d6b6a90
JG
113
114/* The block that the module specified by the qualifer on an identifer is
115 contained in, */
e58de8a2
FF
116#if 0
117static struct block *modblock=0;
118#endif
3d6b6a90 119
3d6b6a90
JG
120%}
121
122/* Although the yacc "value" of an expression is not used,
123 since the result is stored in the structure being created,
124 other node types do have values. */
125
126%union
127 {
128 LONGEST lval;
129 unsigned LONGEST ulval;
130 double dval;
131 struct symbol *sym;
132 struct type *tval;
133 struct stoken sval;
134 int voidval;
135 struct block *bval;
136 enum exp_opcode opcode;
137 struct internalvar *ivar;
138
139 struct type **tvec;
140 int *ivec;
141 }
142
143%type <voidval> exp type_exp start set
144%type <voidval> variable
145%type <tval> type
146%type <bval> block
147%type <sym> fblock
148
149%token <lval> INT HEX ERROR
368c8614 150%token <ulval> UINT M2_TRUE M2_FALSE CHAR
3d6b6a90
JG
151%token <dval> FLOAT
152
153/* Both NAME and TYPENAME tokens represent symbols in the input,
154 and both convey their data as strings.
155 But a TYPENAME is a string that happens to be defined as a typedef
156 or builtin type name (such as int or char)
157 and a NAME is any other symbol.
158
159 Contexts where this distinction is not important can use the
160 nonterminal "name", which matches either NAME or TYPENAME. */
161
162%token <sval> STRING
088c3a0b 163%token <sval> NAME BLOCKNAME IDENT VARNAME
3d6b6a90
JG
164%token <sval> TYPENAME
165
71302249 166%token SIZE CAP ORD HIGH ABS MIN_FUNC MAX_FUNC FLOAT_FUNC VAL CHR ODD TRUNC
3d6b6a90
JG
167%token INC DEC INCL EXCL
168
169/* The GDB scope operator */
170%token COLONCOLON
171
172%token <lval> LAST REGNAME
173
174%token <ivar> INTERNAL_VAR
175
176/* M2 tokens */
177%left ','
178%left ABOVE_COMMA
179%nonassoc ASSIGN
180%left '<' '>' LEQ GEQ '=' NOTEQUAL '#' IN
088c3a0b 181%left OROR
e58de8a2 182%left LOGICAL_AND '&'
3d6b6a90
JG
183%left '@'
184%left '+' '-'
185%left '*' '/' DIV MOD
186%right UNARY
187%right '^' DOT '[' '('
188%right NOT '~'
189%left COLONCOLON QID
190/* This is not an actual token ; it is used for precedence.
191%right QID
192*/
3d6b6a90 193
e35843d4 194\f
368c8614
MT
195%%
196
3d6b6a90
JG
197start : exp
198 | type_exp
199 ;
200
201type_exp: type
202 { write_exp_elt_opcode(OP_TYPE);
203 write_exp_elt_type($1);
204 write_exp_elt_opcode(OP_TYPE);
205 }
206 ;
207
208/* Expressions */
209
210exp : exp '^' %prec UNARY
211 { write_exp_elt_opcode (UNOP_IND); }
212
213exp : '-'
214 { number_sign = -1; }
215 exp %prec UNARY
216 { number_sign = 1;
217 write_exp_elt_opcode (UNOP_NEG); }
218 ;
219
220exp : '+' exp %prec UNARY
221 { write_exp_elt_opcode(UNOP_PLUS); }
222 ;
223
224exp : not_exp exp %prec UNARY
e58de8a2 225 { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
3d6b6a90
JG
226 ;
227
228not_exp : NOT
229 | '~'
230 ;
231
232exp : CAP '(' exp ')'
233 { write_exp_elt_opcode (UNOP_CAP); }
234 ;
235
236exp : ORD '(' exp ')'
237 { write_exp_elt_opcode (UNOP_ORD); }
238 ;
239
240exp : ABS '(' exp ')'
241 { write_exp_elt_opcode (UNOP_ABS); }
242 ;
243
244exp : HIGH '(' exp ')'
245 { write_exp_elt_opcode (UNOP_HIGH); }
246 ;
247
71302249 248exp : MIN_FUNC '(' type ')'
3d6b6a90
JG
249 { write_exp_elt_opcode (UNOP_MIN);
250 write_exp_elt_type ($3);
251 write_exp_elt_opcode (UNOP_MIN); }
252 ;
253
71302249 254exp : MAX_FUNC '(' type ')'
3d6b6a90
JG
255 { write_exp_elt_opcode (UNOP_MAX);
256 write_exp_elt_type ($3);
257 write_exp_elt_opcode (UNOP_MIN); }
258 ;
259
260exp : FLOAT_FUNC '(' exp ')'
261 { write_exp_elt_opcode (UNOP_FLOAT); }
262 ;
263
264exp : VAL '(' type ',' exp ')'
265 { write_exp_elt_opcode (BINOP_VAL);
266 write_exp_elt_type ($3);
267 write_exp_elt_opcode (BINOP_VAL); }
268 ;
269
270exp : CHR '(' exp ')'
271 { write_exp_elt_opcode (UNOP_CHR); }
272 ;
273
274exp : ODD '(' exp ')'
275 { write_exp_elt_opcode (UNOP_ODD); }
276 ;
277
278exp : TRUNC '(' exp ')'
279 { write_exp_elt_opcode (UNOP_TRUNC); }
280 ;
281
282exp : SIZE exp %prec UNARY
283 { write_exp_elt_opcode (UNOP_SIZEOF); }
284 ;
285
286
287exp : INC '(' exp ')'
288 { write_exp_elt_opcode(UNOP_PREINCREMENT); }
289 ;
290
291exp : INC '(' exp ',' exp ')'
292 { write_exp_elt_opcode(BINOP_ASSIGN_MODIFY);
293 write_exp_elt_opcode(BINOP_ADD);
294 write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); }
295 ;
296
297exp : DEC '(' exp ')'
298 { write_exp_elt_opcode(UNOP_PREDECREMENT);}
299 ;
300
301exp : DEC '(' exp ',' exp ')'
302 { write_exp_elt_opcode(BINOP_ASSIGN_MODIFY);
303 write_exp_elt_opcode(BINOP_SUB);
304 write_exp_elt_opcode(BINOP_ASSIGN_MODIFY); }
305 ;
306
307exp : exp DOT NAME
308 { write_exp_elt_opcode (STRUCTOP_STRUCT);
309 write_exp_string ($3);
310 write_exp_elt_opcode (STRUCTOP_STRUCT); }
311 ;
312
313exp : set
314 ;
315
316exp : exp IN set
317 { error("Sets are not implemented.");}
318 ;
319
320exp : INCL '(' exp ',' exp ')'
321 { error("Sets are not implemented.");}
322 ;
323
324exp : EXCL '(' exp ',' exp ')'
325 { error("Sets are not implemented.");}
326
327set : '{' arglist '}'
328 { error("Sets are not implemented.");}
329 | type '{' arglist '}'
330 { error("Sets are not implemented.");}
331 ;
332
333
334/* Modula-2 array subscript notation [a,b,c...] */
335exp : exp '['
336 /* This function just saves the number of arguments
337 that follow in the list. It is *not* specific to
338 function types */
339 { start_arglist(); }
340 non_empty_arglist ']' %prec DOT
54bbbfb4 341 { write_exp_elt_opcode (MULTI_SUBSCRIPT);
3d6b6a90 342 write_exp_elt_longcst ((LONGEST) end_arglist());
54bbbfb4 343 write_exp_elt_opcode (MULTI_SUBSCRIPT); }
3d6b6a90
JG
344 ;
345
346exp : exp '('
347 /* This is to save the value of arglist_len
348 being accumulated by an outer function call. */
349 { start_arglist (); }
350 arglist ')' %prec DOT
351 { write_exp_elt_opcode (OP_FUNCALL);
352 write_exp_elt_longcst ((LONGEST) end_arglist ());
353 write_exp_elt_opcode (OP_FUNCALL); }
354 ;
355
356arglist :
357 ;
358
359arglist : exp
360 { arglist_len = 1; }
361 ;
362
363arglist : arglist ',' exp %prec ABOVE_COMMA
364 { arglist_len++; }
365 ;
366
367non_empty_arglist
368 : exp
369 { arglist_len = 1; }
370 ;
371
372non_empty_arglist
373 : non_empty_arglist ',' exp %prec ABOVE_COMMA
374 { arglist_len++; }
375 ;
376
377/* GDB construct */
378exp : '{' type '}' exp %prec UNARY
379 { write_exp_elt_opcode (UNOP_MEMVAL);
380 write_exp_elt_type ($2);
381 write_exp_elt_opcode (UNOP_MEMVAL); }
382 ;
383
384exp : type '(' exp ')' %prec UNARY
385 { write_exp_elt_opcode (UNOP_CAST);
386 write_exp_elt_type ($1);
387 write_exp_elt_opcode (UNOP_CAST); }
388 ;
389
390exp : '(' exp ')'
391 { }
392 ;
393
394/* Binary operators in order of decreasing precedence. Note that some
395 of these operators are overloaded! (ie. sets) */
396
397/* GDB construct */
398exp : exp '@' exp
399 { write_exp_elt_opcode (BINOP_REPEAT); }
400 ;
401
402exp : exp '*' exp
403 { write_exp_elt_opcode (BINOP_MUL); }
404 ;
405
406exp : exp '/' exp
407 { write_exp_elt_opcode (BINOP_DIV); }
408 ;
409
410exp : exp DIV exp
411 { write_exp_elt_opcode (BINOP_INTDIV); }
412 ;
413
414exp : exp MOD exp
415 { write_exp_elt_opcode (BINOP_REM); }
416 ;
417
418exp : exp '+' exp
419 { write_exp_elt_opcode (BINOP_ADD); }
420 ;
421
422exp : exp '-' exp
423 { write_exp_elt_opcode (BINOP_SUB); }
424 ;
425
426exp : exp '=' exp
427 { write_exp_elt_opcode (BINOP_EQUAL); }
428 ;
429
430exp : exp NOTEQUAL exp
431 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
432 | exp '#' exp
433 { write_exp_elt_opcode (BINOP_NOTEQUAL); }
434 ;
435
436exp : exp LEQ exp
437 { write_exp_elt_opcode (BINOP_LEQ); }
438 ;
439
440exp : exp GEQ exp
441 { write_exp_elt_opcode (BINOP_GEQ); }
442 ;
443
444exp : exp '<' exp
445 { write_exp_elt_opcode (BINOP_LESS); }
446 ;
447
448exp : exp '>' exp
449 { write_exp_elt_opcode (BINOP_GTR); }
450 ;
451
e58de8a2
FF
452exp : exp LOGICAL_AND exp
453 { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
3d6b6a90
JG
454 ;
455
088c3a0b 456exp : exp OROR exp
e58de8a2 457 { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
3d6b6a90
JG
458 ;
459
460exp : exp ASSIGN exp
461 { write_exp_elt_opcode (BINOP_ASSIGN); }
462 ;
463
464
465/* Constants */
466
368c8614 467exp : M2_TRUE
3d6b6a90
JG
468 { write_exp_elt_opcode (OP_BOOL);
469 write_exp_elt_longcst ((LONGEST) $1);
470 write_exp_elt_opcode (OP_BOOL); }
471 ;
472
368c8614 473exp : M2_FALSE
3d6b6a90
JG
474 { write_exp_elt_opcode (OP_BOOL);
475 write_exp_elt_longcst ((LONGEST) $1);
476 write_exp_elt_opcode (OP_BOOL); }
477 ;
478
479exp : INT
480 { write_exp_elt_opcode (OP_LONG);
481 write_exp_elt_type (builtin_type_m2_int);
482 write_exp_elt_longcst ((LONGEST) $1);
483 write_exp_elt_opcode (OP_LONG); }
484 ;
485
486exp : UINT
487 {
488 write_exp_elt_opcode (OP_LONG);
489 write_exp_elt_type (builtin_type_m2_card);
490 write_exp_elt_longcst ((LONGEST) $1);
491 write_exp_elt_opcode (OP_LONG);
492 }
493 ;
494
495exp : CHAR
496 { write_exp_elt_opcode (OP_LONG);
497 write_exp_elt_type (builtin_type_m2_char);
498 write_exp_elt_longcst ((LONGEST) $1);
499 write_exp_elt_opcode (OP_LONG); }
500 ;
501
502
503exp : FLOAT
504 { write_exp_elt_opcode (OP_DOUBLE);
505 write_exp_elt_type (builtin_type_m2_real);
506 write_exp_elt_dblcst ($1);
507 write_exp_elt_opcode (OP_DOUBLE); }
508 ;
509
510exp : variable
511 ;
512
513/* The GDB internal variable $$, et al. */
514exp : LAST
515 { write_exp_elt_opcode (OP_LAST);
516 write_exp_elt_longcst ((LONGEST) $1);
517 write_exp_elt_opcode (OP_LAST); }
518 ;
519
520exp : REGNAME
521 { write_exp_elt_opcode (OP_REGISTER);
522 write_exp_elt_longcst ((LONGEST) $1);
523 write_exp_elt_opcode (OP_REGISTER); }
524 ;
525
526exp : SIZE '(' type ')' %prec UNARY
527 { write_exp_elt_opcode (OP_LONG);
528 write_exp_elt_type (builtin_type_int);
529 write_exp_elt_longcst ((LONGEST) TYPE_LENGTH ($3));
530 write_exp_elt_opcode (OP_LONG); }
531 ;
532
533exp : STRING
534 { write_exp_elt_opcode (OP_M2_STRING);
535 write_exp_string ($1);
536 write_exp_elt_opcode (OP_M2_STRING); }
537 ;
538
539/* This will be used for extensions later. Like adding modules. */
540block : fblock
541 { $$ = SYMBOL_BLOCK_VALUE($1); }
542 ;
543
544fblock : BLOCKNAME
545 { struct symbol *sym
546 = lookup_symbol (copy_name ($1), expression_context_block,
547 VAR_NAMESPACE, 0, NULL);
548 $$ = sym;}
549 ;
550
551
552/* GDB scope operator */
553fblock : block COLONCOLON BLOCKNAME
554 { struct symbol *tem
555 = lookup_symbol (copy_name ($3), $1,
556 VAR_NAMESPACE, 0, NULL);
557 if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
558 error ("No function \"%s\" in specified context.",
559 copy_name ($3));
560 $$ = tem;
561 }
562 ;
563
564/* Useful for assigning to PROCEDURE variables */
565variable: fblock
566 { write_exp_elt_opcode(OP_VAR_VALUE);
479fdd26 567 write_exp_elt_block (NULL);
3d6b6a90
JG
568 write_exp_elt_sym ($1);
569 write_exp_elt_opcode (OP_VAR_VALUE); }
570 ;
571
572/* GDB internal ($foo) variable */
573variable: INTERNAL_VAR
574 { write_exp_elt_opcode (OP_INTERNALVAR);
575 write_exp_elt_intern ($1);
576 write_exp_elt_opcode (OP_INTERNALVAR); }
577 ;
578
579/* GDB scope operator */
580variable: block COLONCOLON NAME
581 { struct symbol *sym;
582 sym = lookup_symbol (copy_name ($3), $1,
583 VAR_NAMESPACE, 0, NULL);
584 if (sym == 0)
585 error ("No symbol \"%s\" in specified context.",
586 copy_name ($3));
587
588 write_exp_elt_opcode (OP_VAR_VALUE);
479fdd26
JK
589 /* block_found is set by lookup_symbol. */
590 write_exp_elt_block (block_found);
3d6b6a90
JG
591 write_exp_elt_sym (sym);
592 write_exp_elt_opcode (OP_VAR_VALUE); }
593 ;
594
595/* Base case for variables. */
596variable: NAME
597 { struct symbol *sym;
598 int is_a_field_of_this;
599
600 sym = lookup_symbol (copy_name ($1),
601 expression_context_block,
602 VAR_NAMESPACE,
603 &is_a_field_of_this,
604 NULL);
605 if (sym)
606 {
443abae1 607 if (symbol_read_needs_frame (sym))
3d6b6a90 608 {
3d6b6a90 609 if (innermost_block == 0 ||
443abae1 610 contained_in (block_found,
3d6b6a90
JG
611 innermost_block))
612 innermost_block = block_found;
613 }
443abae1 614
3d6b6a90 615 write_exp_elt_opcode (OP_VAR_VALUE);
479fdd26
JK
616 /* We want to use the selected frame, not
617 another more inner frame which happens to
618 be in the same block. */
619 write_exp_elt_block (NULL);
3d6b6a90
JG
620 write_exp_elt_sym (sym);
621 write_exp_elt_opcode (OP_VAR_VALUE);
622 }
623 else
624 {
1ab3bf1b 625 struct minimal_symbol *msymbol;
3d6b6a90
JG
626 register char *arg = copy_name ($1);
627
abe28b92 628 msymbol = lookup_minimal_symbol (arg, NULL);
1ab3bf1b 629 if (msymbol != NULL)
3d6b6a90 630 {
abe28b92
JK
631 write_exp_msymbol
632 (msymbol,
633 lookup_function_type (builtin_type_int),
634 builtin_type_int);
3d6b6a90 635 }
1ab3bf1b 636 else if (!have_full_symbols () && !have_partial_symbols ())
3d6b6a90
JG
637 error ("No symbol table is loaded. Use the \"symbol-file\" command.");
638 else
639 error ("No symbol \"%s\" in current context.",
640 copy_name ($1));
641 }
642 }
643 ;
644
645type
646 : TYPENAME
647 { $$ = lookup_typename (copy_name ($1),
648 expression_context_block, 0); }
649
650 ;
651
652%%
653
654#if 0 /* FIXME! */
655int
656overflow(a,b)
657 long a,b;
658{
659 return (MAX_OF_TYPE(builtin_type_m2_int) - b) < a;
660}
661
662int
663uoverflow(a,b)
664 unsigned long a,b;
665{
666 return (MAX_OF_TYPE(builtin_type_m2_card) - b) < a;
667}
668#endif /* FIXME */
669
670/* Take care of parsing a number (anything that starts with a digit).
671 Set yylval and return the token type; update lexptr.
672 LEN is the number of characters in it. */
673
674/*** Needs some error checking for the float case ***/
675
676static int
677parse_number (olen)
678 int olen;
679{
680 register char *p = lexptr;
681 register LONGEST n = 0;
682 register LONGEST prevn = 0;
683 register int c,i,ischar=0;
684 register int base = input_radix;
685 register int len = olen;
3d6b6a90
JG
686 int unsigned_p = number_sign == 1 ? 1 : 0;
687
3d6b6a90
JG
688 if(p[len-1] == 'H')
689 {
690 base = 16;
691 len--;
692 }
693 else if(p[len-1] == 'C' || p[len-1] == 'B')
694 {
695 base = 8;
696 ischar = p[len-1] == 'C';
697 len--;
698 }
699
700 /* Scan the number */
701 for (c = 0; c < len; c++)
702 {
703 if (p[c] == '.' && base == 10)
704 {
705 /* It's a float since it contains a point. */
706 yylval.dval = atof (p);
707 lexptr += len;
708 return FLOAT;
709 }
710 if (p[c] == '.' && base != 10)
711 error("Floating point numbers must be base 10.");
712 if (base == 10 && (p[c] < '0' || p[c] > '9'))
713 error("Invalid digit \'%c\' in number.",p[c]);
714 }
715
716 while (len-- > 0)
717 {
718 c = *p++;
719 n *= base;
720 if( base == 8 && (c == '8' || c == '9'))
721 error("Invalid digit \'%c\' in octal number.",c);
722 if (c >= '0' && c <= '9')
723 i = c - '0';
724 else
725 {
726 if (base == 16 && c >= 'A' && c <= 'F')
727 i = c - 'A' + 10;
728 else
729 return ERROR;
730 }
731 n+=i;
732 if(i >= base)
733 return ERROR;
734 if(!unsigned_p && number_sign == 1 && (prevn >= n))
735 unsigned_p=1; /* Try something unsigned */
736 /* Don't do the range check if n==i and i==0, since that special
737 case will give an overflow error. */
738 if(RANGE_CHECK && n!=i && i)
739 {
740 if((unsigned_p && (unsigned)prevn >= (unsigned)n) ||
741 ((!unsigned_p && number_sign==-1) && -prevn <= -n))
742 range_error("Overflow on numeric constant.");
743 }
744 prevn=n;
745 }
746
747 lexptr = p;
748 if(*p == 'B' || *p == 'C' || *p == 'H')
749 lexptr++; /* Advance past B,C or H */
750
751 if (ischar)
752 {
753 yylval.ulval = n;
754 return CHAR;
755 }
756 else if ( unsigned_p && number_sign == 1)
757 {
758 yylval.ulval = n;
759 return UINT;
760 }
9dffe475 761 else if((unsigned_p && (n<0))) {
3d6b6a90 762 range_error("Overflow on numeric constant -- number too large.");
9dffe475 763 /* But, this can return if range_check == range_warn. */
3d6b6a90 764 }
9dffe475
JG
765 yylval.lval = n;
766 return INT;
3d6b6a90
JG
767}
768
769
770/* Some tokens */
771
772static struct
773{
774 char name[2];
775 int token;
776} tokentab2[] =
777{
d453b386
PB
778 { {'<', '>'}, NOTEQUAL },
779 { {':', '='}, ASSIGN },
780 { {'<', '='}, LEQ },
781 { {'>', '='}, GEQ },
782 { {':', ':'}, COLONCOLON },
3d6b6a90
JG
783
784};
785
786/* Some specific keywords */
787
788struct keyword {
789 char keyw[10];
790 int token;
791};
792
793static struct keyword keytab[] =
794{
088c3a0b 795 {"OR" , OROR },
3d6b6a90 796 {"IN", IN },/* Note space after IN */
e58de8a2 797 {"AND", LOGICAL_AND},
3d6b6a90
JG
798 {"ABS", ABS },
799 {"CHR", CHR },
800 {"DEC", DEC },
801 {"NOT", NOT },
802 {"DIV", DIV },
803 {"INC", INC },
71302249
JG
804 {"MAX", MAX_FUNC },
805 {"MIN", MIN_FUNC },
3d6b6a90
JG
806 {"MOD", MOD },
807 {"ODD", ODD },
808 {"CAP", CAP },
809 {"ORD", ORD },
810 {"VAL", VAL },
811 {"EXCL", EXCL },
812 {"HIGH", HIGH },
813 {"INCL", INCL },
814 {"SIZE", SIZE },
815 {"FLOAT", FLOAT_FUNC },
816 {"TRUNC", TRUNC },
817};
818
819
820/* Read one token, getting characters through lexptr. */
821
822/* This is where we will check to make sure that the language and the operators used are
823 compatible */
824
825static int
826yylex ()
827{
828 register int c;
829 register int namelen;
830 register int i;
831 register char *tokstart;
832 register char quote;
833
834 retry:
835
836 tokstart = lexptr;
837
838
839 /* See if it is a special token of length 2 */
840 for( i = 0 ; i < sizeof tokentab2 / sizeof tokentab2[0] ; i++)
45fe3db4 841 if(STREQN(tokentab2[i].name, tokstart, 2))
3d6b6a90
JG
842 {
843 lexptr += 2;
844 return tokentab2[i].token;
845 }
846
847 switch (c = *tokstart)
848 {
849 case 0:
850 return 0;
851
852 case ' ':
853 case '\t':
854 case '\n':
855 lexptr++;
856 goto retry;
857
858 case '(':
859 paren_depth++;
860 lexptr++;
861 return c;
862
863 case ')':
864 if (paren_depth == 0)
865 return 0;
866 paren_depth--;
867 lexptr++;
868 return c;
869
870 case ',':
871 if (comma_terminates && paren_depth == 0)
872 return 0;
873 lexptr++;
874 return c;
875
876 case '.':
877 /* Might be a floating point number. */
878 if (lexptr[1] >= '0' && lexptr[1] <= '9')
879 break; /* Falls into number code. */
880 else
881 {
882 lexptr++;
883 return DOT;
884 }
885
886/* These are character tokens that appear as-is in the YACC grammar */
887 case '+':
888 case '-':
889 case '*':
890 case '/':
891 case '^':
892 case '<':
893 case '>':
894 case '[':
895 case ']':
896 case '=':
897 case '{':
898 case '}':
899 case '#':
900 case '@':
901 case '~':
902 case '&':
903 lexptr++;
904 return c;
905
906 case '\'' :
907 case '"':
908 quote = c;
909 for (namelen = 1; (c = tokstart[namelen]) != quote && c != '\0'; namelen++)
910 if (c == '\\')
911 {
912 c = tokstart[++namelen];
913 if (c >= '0' && c <= '9')
914 {
915 c = tokstart[++namelen];
916 if (c >= '0' && c <= '9')
917 c = tokstart[++namelen];
918 }
919 }
920 if(c != quote)
921 error("Unterminated string or character constant.");
922 yylval.sval.ptr = tokstart + 1;
923 yylval.sval.length = namelen - 1;
924 lexptr += namelen + 1;
925
926 if(namelen == 2) /* Single character */
927 {
928 yylval.ulval = tokstart[1];
929 return CHAR;
930 }
931 else
932 return STRING;
933 }
934
935 /* Is it a number? */
936 /* Note: We have already dealt with the case of the token '.'.
937 See case '.' above. */
938 if ((c >= '0' && c <= '9'))
939 {
940 /* It's a number. */
941 int got_dot = 0, got_e = 0;
942 register char *p = tokstart;
943 int toktype;
944
945 for (++p ;; ++p)
946 {
947 if (!got_e && (*p == 'e' || *p == 'E'))
948 got_dot = got_e = 1;
949 else if (!got_dot && *p == '.')
950 got_dot = 1;
951 else if (got_e && (p[-1] == 'e' || p[-1] == 'E')
952 && (*p == '-' || *p == '+'))
953 /* This is the sign of the exponent, not the end of the
954 number. */
955 continue;
956 else if ((*p < '0' || *p > '9') &&
957 (*p < 'A' || *p > 'F') &&
958 (*p != 'H')) /* Modula-2 hexadecimal number */
959 break;
960 }
961 toktype = parse_number (p - tokstart);
962 if (toktype == ERROR)
963 {
964 char *err_copy = (char *) alloca (p - tokstart + 1);
965
4ed3a9ea 966 memcpy (err_copy, tokstart, p - tokstart);
3d6b6a90
JG
967 err_copy[p - tokstart] = 0;
968 error ("Invalid number \"%s\".", err_copy);
969 }
970 lexptr = p;
971 return toktype;
972 }
973
974 if (!(c == '_' || c == '$'
975 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')))
976 /* We must have come across a bad character (e.g. ';'). */
977 error ("Invalid character '%c' in expression.", c);
978
979 /* It's a name. See how long it is. */
980 namelen = 0;
981 for (c = tokstart[namelen];
982 (c == '_' || c == '$' || (c >= '0' && c <= '9')
983 || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));
984 c = tokstart[++namelen])
985 ;
986
987 /* The token "if" terminates the expression and is NOT
988 removed from the input stream. */
989 if (namelen == 2 && tokstart[0] == 'i' && tokstart[1] == 'f')
990 {
991 return 0;
992 }
993
994 lexptr += namelen;
995
996 /* Handle the tokens $digits; also $ (short for $0) and $$ (short for $$1)
997 and $$digits (equivalent to $<-digits> if you could type that).
998 Make token type LAST, and put the number (the digits) in yylval. */
999
1000 if (*tokstart == '$')
1001 {
1002 register int negate = 0;
1003 c = 1;
1004 /* Double dollar means negate the number and add -1 as well.
1005 Thus $$ alone means -1. */
1006 if (namelen >= 2 && tokstart[1] == '$')
1007 {
1008 negate = 1;
1009 c = 2;
1010 }
1011 if (c == namelen)
1012 {
1013 /* Just dollars (one or two) */
1014 yylval.lval = - negate;
1015 return LAST;
1016 }
1017 /* Is the rest of the token digits? */
1018 for (; c < namelen; c++)
1019 if (!(tokstart[c] >= '0' && tokstart[c] <= '9'))
1020 break;
1021 if (c == namelen)
1022 {
1023 yylval.lval = atoi (tokstart + 1 + negate);
1024 if (negate)
1025 yylval.lval = - yylval.lval;
1026 return LAST;
1027 }
1028 }
1029
1030 /* Handle tokens that refer to machine registers:
1031 $ followed by a register name. */
1032
1033 if (*tokstart == '$') {
1034 for (c = 0; c < NUM_REGS; c++)
1035 if (namelen - 1 == strlen (reg_names[c])
45fe3db4 1036 && STREQN (tokstart + 1, reg_names[c], namelen - 1))
3d6b6a90
JG
1037 {
1038 yylval.lval = c;
1039 return REGNAME;
1040 }
1041 for (c = 0; c < num_std_regs; c++)
1042 if (namelen - 1 == strlen (std_regs[c].name)
45fe3db4 1043 && STREQN (tokstart + 1, std_regs[c].name, namelen - 1))
3d6b6a90
JG
1044 {
1045 yylval.lval = std_regs[c].regnum;
1046 return REGNAME;
1047 }
1048 }
1049
1050
1051 /* Lookup special keywords */
1052 for(i = 0 ; i < sizeof(keytab) / sizeof(keytab[0]) ; i++)
45fe3db4 1053 if(namelen == strlen(keytab[i].keyw) && STREQN(tokstart,keytab[i].keyw,namelen))
3d6b6a90
JG
1054 return keytab[i].token;
1055
1056 yylval.sval.ptr = tokstart;
1057 yylval.sval.length = namelen;
1058
1059 /* Any other names starting in $ are debugger internal variables. */
1060
1061 if (*tokstart == '$')
1062 {
1063 yylval.ivar = (struct internalvar *) lookup_internalvar (copy_name (yylval.sval) + 1);
1064 return INTERNAL_VAR;
1065 }
1066
1067
1068 /* Use token-type BLOCKNAME for symbols that happen to be defined as
1069 functions. If this is not so, then ...
1070 Use token-type TYPENAME for symbols that happen to be defined
1071 currently as names of types; NAME for other symbols.
1072 The caller is not constrained to care about the distinction. */
1073 {
1074
1075
1076 char *tmp = copy_name (yylval.sval);
1077 struct symbol *sym;
1078
1079 if (lookup_partial_symtab (tmp))
1080 return BLOCKNAME;
1081 sym = lookup_symbol (tmp, expression_context_block,
1082 VAR_NAMESPACE, 0, NULL);
1083 if (sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
1084 return BLOCKNAME;
1085 if (lookup_typename (copy_name (yylval.sval), expression_context_block, 1))
1086 return TYPENAME;
1087
1088 if(sym)
1089 {
1090 switch(sym->class)
1091 {
1092 case LOC_STATIC:
1093 case LOC_REGISTER:
1094 case LOC_ARG:
1095 case LOC_REF_ARG:
1096 case LOC_REGPARM:
996ccb30 1097 case LOC_REGPARM_ADDR:
3d6b6a90
JG
1098 case LOC_LOCAL:
1099 case LOC_LOCAL_ARG:
a1c8d76e
JK
1100 case LOC_BASEREG:
1101 case LOC_BASEREG_ARG:
3d6b6a90
JG
1102 case LOC_CONST:
1103 case LOC_CONST_BYTES:
996ccb30 1104 case LOC_OPTIMIZED_OUT:
3d6b6a90
JG
1105 return NAME;
1106
1107 case LOC_TYPEDEF:
1108 return TYPENAME;
1109
1110 case LOC_BLOCK:
1111 return BLOCKNAME;
1112
1113 case LOC_UNDEF:
1114 error("internal: Undefined class in m2lex()");
1115
1116 case LOC_LABEL:
1117 error("internal: Unforseen case in m2lex()");
1118 }
1119 }
1120 else
1121 {
1122 /* Built-in BOOLEAN type. This is sort of a hack. */
45fe3db4 1123 if(STREQN(tokstart,"TRUE",4))
3d6b6a90
JG
1124 {
1125 yylval.ulval = 1;
368c8614 1126 return M2_TRUE;
3d6b6a90 1127 }
45fe3db4 1128 else if(STREQN(tokstart,"FALSE",5))
3d6b6a90
JG
1129 {
1130 yylval.ulval = 0;
368c8614 1131 return M2_FALSE;
3d6b6a90
JG
1132 }
1133 }
1134
1135 /* Must be another type of name... */
1136 return NAME;
1137 }
1138}
1139
be772100 1140#if 0 /* Unused */
1ab3bf1b 1141static char *
3d6b6a90
JG
1142make_qualname(mod,ident)
1143 char *mod, *ident;
1144{
e35843d4 1145 char *new = malloc(strlen(mod)+strlen(ident)+2);
3d6b6a90
JG
1146
1147 strcpy(new,mod);
1148 strcat(new,".");
1149 strcat(new,ident);
1150 return new;
1151}
be772100 1152#endif /* 0 */
3d6b6a90 1153
22e39759 1154void
1ab3bf1b
JG
1155yyerror(msg)
1156 char *msg; /* unused */
3d6b6a90 1157{
199b2450 1158 printf_unfiltered("Parsing: %s\n",lexptr);
3d6b6a90
JG
1159 if (yychar < 256)
1160 error("Invalid syntax in expression near character '%c'.",yychar);
1161 else
f24adda3 1162 error("Invalid syntax in expression");
3d6b6a90 1163}
5d074aa9 1164