1 /* YACC grammar for Chill expressions, for GDB.
2 Copyright (C) 1992 Free Software Foundation, Inc.
4 This file is part of GDB.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
20 /* Parse a Chill expression from text in a string,
21 and return the result as a struct expression pointer.
22 That structure contains arithmetic operations in reverse polish,
23 with constants represented by operations that are followed by special data.
24 See expression.h for the details of the format.
25 What is important here is that it can be built up sequentially
26 during the process of parsing; the lower levels of the tree always
27 come first in the result.
29 Note that malloc's and realloc's in this file are transformed to
30 xmalloc and xrealloc respectively by the same sed command in the
31 makefile that remaps any other malloc/realloc inserted by the parser
32 generator. Doing this with #defines and trying to control the interaction
33 with include files (<malloc.h> and <stdlib.h> for example) just became
34 too messy, particularly when such includes can be inserted at random
35 times by the parser generator.
37 Also note that the language accepted by this parser is more liberal
38 than the one accepted by an actual Chill compiler. For example, the
39 language rule that a simple name string can not be one of the reserved
40 simple name strings is not enforced (e.g "case" is not treated as a
41 reserved name). Another example is that Chill is a strongly typed
42 language, and certain expressions that violate the type constraints
43 may still be evaluated if gdb can do so in a meaningful manner, while
44 such expressions would be rejected by the compiler. The reason for
45 this more liberal behavior is the philosophy that the debugger
46 is intended to be a tool that is used by the programmer when things
47 go wrong, and as such, it should provide as few artificial barriers
48 to it's use as possible. If it can do something meaningful, even
49 something that violates language contraints that are enforced by the
50 compiler, it should do so without complaint.
62 #include "expression.h"
65 #include "parser-defs.h"
70 /* These MUST be included in any grammar file!!!! Please choose unique names!
71 Note that this are a combined list of variables that can be produced
72 by any one of bison, byacc, or yacc. */
73 #define yymaxdepth chill_maxdepth
74 #define yyparse chill_parse
75 #define yylex chill_lex
76 #define yyerror chill_error
77 #define yylval chill_lval
78 #define yychar chill_char
79 #define yydebug chill_debug
80 #define yypact chill_pact
83 #define yydef chill_def
84 #define yychk chill_chk
85 #define yypgo chill_pgo
86 #define yyact chill_act
87 #define yyexca chill_exca
88 #define yyerrflag chill_errflag
89 #define yynerrs chill_nerrs
93 #define yy_yys chill_yys
94 #define yystate chill_state
95 #define yytmp chill_tmp
97 #define yy_yyv chill_yyv
98 #define yyval chill_val
99 #define yylloc chill_lloc
100 #define yyss chill_yyss /* byacc */
101 #define yyssp chill_yysp /* byacc */
102 #define yyvs chill_yyvs /* byacc */
103 #define yyvsp chill_yyvsp /* byacc */
106 yylex PARAMS ((void));
109 yyerror PARAMS ((char *));
112 yyparse PARAMS ((void));
114 /* #define YYDEBUG 1 */
118 /* Although the yacc "value" of an expression is not used,
119 since the result is stored in the structure being created,
120 other node types do have values. */
125 unsigned LONGEST ulval;
135 struct symtoken ssym;
138 enum exp_opcode opcode;
139 struct internalvar *ivar;
146 static int parse_number PARAMS ((void));
149 %token <voidval> FIXME
151 %token <typed_val> INTEGER_LITERAL
152 %token <ulval> BOOLEAN_LITERAL
153 %token <voidval> CHARACTER_LITERAL
154 %token <voidval> SET_LITERAL
155 %token <voidval> EMPTINESS_LITERAL
156 %token <voidval> CHARACTER_STRING_LITERAL
157 %token <voidval> BIT_STRING_LITERAL
159 %token <voidval> STRING
160 %token <voidval> CONSTANT
164 %token <voidval> CASE
166 %token <voidval> ESAC
167 %token <voidval> LOGIOR
168 %token <voidval> ORIF
169 %token <voidval> LOGXOR
170 %token <voidval> LOGAND
171 %token <voidval> ANDIF
173 %token <voidval> NOTEQUAL
183 %token <voidval> SLASH_SLASH
187 %token <voidval> POINTER
188 %token <voidval> RECEIVE
196 %token <voidval> THEN
197 %token <voidval> ELSE
199 %token <voidval> ELSIF
200 %token <voidval> ILLEGAL_TOKEN
202 %type <voidval> location
203 %type <voidval> primitive_value
204 %type <voidval> location_contents
205 %type <voidval> value_name
206 %type <voidval> literal
207 %type <voidval> tuple
208 %type <voidval> value_string_element
209 %type <voidval> value_string_slice
210 %type <voidval> value_array_element
211 %type <voidval> value_array_slice
212 %type <voidval> value_structure_field
213 %type <voidval> expression_conversion
214 %type <voidval> value_procedure_call
215 %type <voidval> value_built_in_routine_call
216 %type <voidval> start_expression
217 %type <voidval> zero_adic_operator
218 %type <voidval> parenthesised_expression
219 %type <voidval> value
220 %type <voidval> undefined_value
221 %type <voidval> expression
222 %type <voidval> conditional_expression
223 %type <voidval> then_alternative
224 %type <voidval> else_alternative
225 %type <voidval> sub_expression
226 %type <voidval> value_case_alternative
227 %type <voidval> operand_0
228 %type <voidval> operand_1
229 %type <voidval> operand_2
230 %type <voidval> operand_3
231 %type <voidval> operand_4
232 %type <voidval> operand_5
233 %type <voidval> operand_6
234 %type <voidval> integer_literal_expression
235 %type <voidval> synonym_name
236 %type <voidval> value_enumeration_name
237 %type <voidval> value_do_with_name
238 %type <voidval> value_receive_name
239 %type <voidval> general_procedure_name
240 %type <voidval> string_primitive_value
241 %type <voidval> start_element
242 %type <voidval> left_element
243 %type <voidval> right_element
244 %type <voidval> slice_size
245 %type <voidval> array_primitive_value
246 %type <voidval> expression_list
247 %type <voidval> lower_element
248 %type <voidval> upper_element
249 %type <voidval> first_element
250 %type <voidval> structure_primitive_value
251 %type <voidval> field_name
252 %type <voidval> mode_name
253 %type <voidval> boolean_expression
254 %type <voidval> case_selector_list
255 %type <voidval> subexpression
256 %type <voidval> case_label_specification
257 %type <voidval> buffer_location
273 undefined_value : FIXME
289 primitive_value : location_contents
305 | value_string_element
313 | value_array_element
321 | value_structure_field
325 | expression_conversion
329 | value_procedure_call
333 | value_built_in_routine_call
345 | parenthesised_expression
353 location_contents: location
361 value_name : synonym_name
365 | value_enumeration_name
377 | general_procedure_name
385 literal : INTEGER_LITERAL
387 write_exp_elt_opcode (OP_LONG);
388 write_exp_elt_type ($1.type);
389 write_exp_elt_longcst ((LONGEST) ($1.val));
390 write_exp_elt_opcode (OP_LONG);
394 write_exp_elt_opcode (OP_BOOL);
395 write_exp_elt_longcst ((LONGEST) $1);
396 write_exp_elt_opcode (OP_BOOL);
410 | CHARACTER_STRING_LITERAL
431 value_string_element: string_primitive_value '(' start_element ')'
439 value_string_slice: string_primitive_value '(' left_element ':' right_element ')'
443 | string_primitive_value '(' start_element UP slice_size ')'
451 value_array_element: array_primitive_value '(' expression_list ')'
459 value_array_slice: array_primitive_value '(' lower_element ':' upper_element ')'
463 | array_primitive_value '(' first_element UP slice_size '('
471 value_structure_field: structure_primitive_value '.' field_name
479 expression_conversion: mode_name '(' expression ')'
487 value_procedure_call: FIXME
495 value_built_in_routine_call: FIXME
503 start_expression: FIXME
506 } /* Not in GNU-Chill */
511 zero_adic_operator: FIXME
519 parenthesised_expression: '(' expression ')'
527 expression : operand_0
531 | conditional_expression
537 conditional_expression : IF boolean_expression then_alternative else_alternative FI
541 | CASE case_selector_list OF value_case_alternative '[' ELSE sub_expression ']' ESAC
547 then_alternative: THEN subexpression
553 else_alternative: ELSE subexpression
557 | ELSIF boolean_expression then_alternative else_alternative
563 sub_expression : expression
569 value_case_alternative: case_label_specification ':' sub_expression ';'
577 operand_0 : operand_1
581 | operand_0 LOGIOR operand_1
583 write_exp_elt_opcode (BINOP_BITWISE_IOR);
585 | operand_0 ORIF operand_1
589 | operand_0 LOGXOR operand_1
591 write_exp_elt_opcode (BINOP_BITWISE_XOR);
597 operand_1 : operand_2
601 | operand_1 LOGAND operand_2
603 write_exp_elt_opcode (BINOP_BITWISE_AND);
605 | operand_1 ANDIF operand_2
613 operand_2 : operand_3
617 | operand_2 '=' operand_3
619 write_exp_elt_opcode (BINOP_EQUAL);
621 | operand_2 NOTEQUAL operand_3
623 write_exp_elt_opcode (BINOP_NOTEQUAL);
625 | operand_2 '>' operand_3
627 write_exp_elt_opcode (BINOP_GTR);
629 | operand_2 GTR operand_3
631 write_exp_elt_opcode (BINOP_GEQ);
633 | operand_2 '<' operand_3
635 write_exp_elt_opcode (BINOP_LESS);
637 | operand_2 LEQ operand_3
639 write_exp_elt_opcode (BINOP_LEQ);
641 | operand_2 IN operand_3
650 operand_3 : operand_4
654 | operand_3 '+' operand_4
656 write_exp_elt_opcode (BINOP_ADD);
658 | operand_3 '-' operand_4
660 write_exp_elt_opcode (BINOP_SUB);
662 | operand_3 SLASH_SLASH operand_4
670 operand_4 : operand_5
674 | operand_4 '*' operand_5
676 write_exp_elt_opcode (BINOP_MUL);
678 | operand_4 '/' operand_5
680 write_exp_elt_opcode (BINOP_DIV);
682 | operand_4 MOD operand_5
686 | operand_4 REM operand_5
694 operand_5 : operand_6
700 write_exp_elt_opcode (UNOP_NEG);
704 write_exp_elt_opcode (UNOP_LOGICAL_NOT);
706 | '(' integer_literal_expression ')' operand_6
714 operand_6 : POINTER location
718 | RECEIVE buffer_location
730 /* FIXME: For now we just accept only a single integer literal. */
732 integer_literal_expression:
738 /* Things which still need productions... */
739 synonym_name : FIXME { $$ = 0; }
740 value_enumeration_name : FIXME { $$ = 0; }
741 value_do_with_name : FIXME { $$ = 0; }
742 value_receive_name : FIXME { $$ = 0; }
743 general_procedure_name : FIXME { $$ = 0; }
744 string_primitive_value : FIXME { $$ = 0; }
745 start_element : FIXME { $$ = 0; }
746 left_element : FIXME { $$ = 0; }
747 right_element : FIXME { $$ = 0; }
748 slice_size : FIXME { $$ = 0; }
749 array_primitive_value : FIXME { $$ = 0; }
750 expression_list : FIXME { $$ = 0; }
751 lower_element : FIXME { $$ = 0; }
752 upper_element : FIXME { $$ = 0; }
753 first_element : FIXME { $$ = 0; }
754 structure_primitive_value: FIXME { $$ = 0; }
755 field_name : FIXME { $$ = 0; }
756 mode_name : FIXME { $$ = 0; }
757 boolean_expression : FIXME { $$ = 0; }
758 case_selector_list : FIXME { $$ = 0; }
759 subexpression : FIXME { $$ = 0; }
760 case_label_specification: FIXME { $$ = 0; }
761 buffer_location : FIXME { $$ = 0; }
765 /* Recognize a character literal. */
768 decode_character_literal ()
770 char *tokptr = lexptr;
773 if (*tokptr++ != '\'')
787 if (*++tokptr != '\'')
791 yylval.typed_val.val = ival;
792 yylval.typed_val.type = builtin_type_int;
794 return (CHARACTER_LITERAL);
797 /* Recognize an integer literal, as specified in Z.200 sec 5.2.4.2.
798 Note that according to 5.2.4.2, a single "_" is also a valid integer
799 literal, however GNU-chill requires there to be at least one "digit"
800 in any integer literal. */
803 decode_integer_literal ()
805 char *tokptr = lexptr;
811 /* Look for an explicit base specifier, which is optional. */
837 /* If we found no explicit base then default to 10, otherwise ensure
838 that the character after the explicit base is a single quote. */
846 if (*tokptr++ != '\'')
852 /* Start looking for a value composed of valid digits as set by the base
853 in use. Note that '_' characters are valid anywhere, in any quantity,
854 and are simply ignored. Since we must find at least one valid digit,
855 or reject this token as an integer literal, we keep track of how many
856 digits we have encountered. */
858 while (*tokptr != '\0')
860 temp = tolower (*tokptr);
866 case '0': case '1': case '2': case '3': case '4':
867 case '5': case '6': case '7': case '8': case '9':
870 case 'a': case 'b': case 'c': case 'd': case 'e':
887 /* Found something not in domain for current base. */
888 tokptr--; /* Unconsume what gave us indigestion. */
893 /* If we didn't find any digits, then we don't have a valid integer
894 literal, so reject the entire token. Otherwise, set up the parser
895 variables, advance the current lexical scan pointer, and return the
896 INTEGER_LITERAL token. */
904 yylval.typed_val.val = ival;
905 yylval.typed_val.type = builtin_type_int;
907 return (INTEGER_LITERAL);
911 static void convert_float ()
914 extern double strtod ();
917 char *p = yytext, *p1 = tmp;
937 d = strtod (tmp, &p1);
940 /* add error handling here */
947 /* Take care of parsing a number (anything that starts with a digit).
948 Set yylval and return the token type; update lexptr.
949 LEN is the number of characters in it. */
951 /*** Needs some error checking for the float case ***/
964 const static struct token tokentab5[] =
969 const static struct token tokentab4[] =
974 const static struct token tokentab3[] =
981 const static struct token tokentab2[] =
983 { "//", SLASH_SLASH },
991 /* Read one token, getting characters through lexptr. */
992 /* This is where we will check to make sure that the language and the
993 operators used are compatible. */
1001 /* Skip over any leading whitespace. */
1002 while (isspace (*lexptr))
1006 /* Look for special single character cases which can't be the first
1007 character of some other multicharacter token. */
1027 /* Look for characters which start a particular kind of multicharacter
1028 token, such as a character literal. */
1032 if ((token = decode_character_literal ()) != 0)
1038 /* See if it is a special token of length 5. */
1039 for (i = 0; i < sizeof (tokentab5) / sizeof (tokentab5[0]); i++)
1041 if (strncmp (lexptr, tokentab5[i].operator, 5) == 0)
1044 return (tokentab5[i].token);
1047 /* See if it is a special token of length 4. */
1048 for (i = 0; i < sizeof (tokentab4) / sizeof (tokentab4[0]); i++)
1050 if (strncmp (lexptr, tokentab4[i].operator, 4) == 0)
1053 return (tokentab4[i].token);
1056 /* See if it is a special token of length 3. */
1057 for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
1059 if (strncmp (lexptr, tokentab3[i].operator, 3) == 0)
1062 return (tokentab3[i].token);
1065 /* See if it is a special token of length 2. */
1066 for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
1068 if (strncmp (lexptr, tokentab2[i].operator, 2) == 0)
1071 return (tokentab2[i].token);
1074 /* Look for single character cases which which could be the first
1075 character of some other multicharacter token, but aren't, or we
1076 would already have found it. */
1084 /* Look for other special tokens. */
1085 if (strncmp (lexptr, "TRUE", 4) == 0) /* FIXME: What about lowercase? */
1089 return (BOOLEAN_LITERAL);
1091 if (strncmp (lexptr, "FALSE", 5) == 0) /* FIXME: What about lowercase? */
1095 return (BOOLEAN_LITERAL);
1097 if ((token = decode_integer_literal ()) != 0)
1101 return (ILLEGAL_TOKEN);
1106 char *msg; /* unused */
1108 printf ("Parsing: %s\n", lexptr);
1111 error ("Invalid syntax in expression near character '%c'.", yychar);
1115 error ("Invalid syntax in expression");
1120 /* Table of operators and their precedences for printing expressions. */
1122 const static struct op_print chill_op_print_tab[] = {
1123 {"AND", BINOP_LOGICAL_AND, PREC_LOGICAL_AND, 0},
1124 {"OR", BINOP_LOGICAL_OR, PREC_LOGICAL_OR, 0},
1125 {"NOT", UNOP_LOGICAL_NOT, PREC_PREFIX, 0},
1126 {"MOD", BINOP_REM, PREC_MUL, 0},
1127 {":=", BINOP_ASSIGN, PREC_ASSIGN, 1},
1128 {"=", BINOP_EQUAL, PREC_EQUAL, 0},
1129 {"/=", BINOP_NOTEQUAL, PREC_EQUAL, 0},
1130 {"<=", BINOP_LEQ, PREC_ORDER, 0},
1131 {">=", BINOP_GEQ, PREC_ORDER, 0},
1132 {">", BINOP_GTR, PREC_ORDER, 0},
1133 {"<", BINOP_LESS, PREC_ORDER, 0},
1134 {"+", BINOP_ADD, PREC_ADD, 0},
1135 {"-", BINOP_SUB, PREC_ADD, 0},
1136 {"*", BINOP_MUL, PREC_MUL, 0},
1137 {"/", BINOP_DIV, PREC_MUL, 0},
1138 {"-", UNOP_NEG, PREC_PREFIX, 0},
1143 /* The built-in types of Chill. */
1145 struct type *builtin_type_chill_bool;
1146 struct type *builtin_type_chill_long;
1147 struct type *builtin_type_chill_ulong;
1148 struct type *builtin_type_chill_real;
1150 struct type ** const (chill_builtin_types[]) =
1152 &builtin_type_chill_bool,
1153 &builtin_type_chill_long,
1154 &builtin_type_chill_ulong,
1155 &builtin_type_chill_real,
1159 const struct language_defn chill_language_defn = {
1162 chill_builtin_types,
1165 chill_parse, /* parser */
1166 chill_error, /* parser error function */
1167 &BUILTIN_TYPE_LONGEST, /* longest signed integral type */
1168 &BUILTIN_TYPE_UNSIGNED_LONGEST,/* longest unsigned integral type */
1169 &builtin_type_chill_real, /* longest floating point type */
1170 "0x%x", "0x%", "x", /* Hex format, prefix, suffix */
1171 "0%o", "0%", "o", /* Octal format, prefix, suffix */
1172 chill_op_print_tab, /* expression operators for printing */
1176 /* Initialization for Chill */
1179 _initialize_chill_exp ()
1181 builtin_type_chill_bool =
1182 init_type (TYPE_CODE_BOOL, TARGET_INT_BIT / TARGET_CHAR_BIT,
1184 "BOOL", (struct objfile *) NULL);
1185 builtin_type_chill_long =
1186 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
1188 "LONG", (struct objfile *) NULL);
1189 builtin_type_chill_ulong =
1190 init_type (TYPE_CODE_INT, TARGET_LONG_BIT / TARGET_CHAR_BIT,
1192 "ULONG", (struct objfile *) NULL);
1193 builtin_type_chill_real =
1194 init_type (TYPE_CODE_FLT, TARGET_DOUBLE_BIT / TARGET_CHAR_BIT,
1196 "LONG_REAL", (struct objfile *) NULL);
1198 add_language (&chill_language_defn);