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