Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(79)

Unified Diff: gdb/go-exp.c

Issue 11969036: Merge GDB 7.5.1 (Closed) Base URL: http://git.chromium.org/native_client/nacl-gdb.git@master
Patch Set: Created 7 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « gdb/gnulib/wchar.in.h ('k') | gdb/go-exp.y » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: gdb/go-exp.c
diff --git a/gdb/p-exp.c b/gdb/go-exp.c
similarity index 52%
copy from gdb/p-exp.c
copy to gdb/go-exp.c
index 469fcdec3305fffde9b44160523a50fec64394de..99421e55fc4cd3902f2c3bcdd6980701ffea5e6d 100644
--- a/gdb/p-exp.c
+++ b/gdb/go-exp.c
@@ -55,82 +55,96 @@
enum yytokentype {
INT = 258,
FLOAT = 259,
- STRING = 260,
- FIELDNAME = 261,
- COMPLETE = 262,
+ RAW_STRING = 260,
+ STRING = 261,
+ CHAR = 262,
NAME = 263,
TYPENAME = 264,
- NAME_OR_INT = 265,
- STRUCT = 266,
- CLASS = 267,
- SIZEOF = 268,
- COLONCOLON = 269,
- ERROR = 270,
- VARIABLE = 271,
- THIS = 272,
- TRUEKEYWORD = 273,
- FALSEKEYWORD = 274,
- ABOVE_COMMA = 275,
- ASSIGN = 276,
- NOT = 277,
- OR = 278,
- XOR = 279,
- ANDAND = 280,
- NOTEQUAL = 281,
- GEQ = 282,
- LEQ = 283,
- MOD = 284,
- DIV = 285,
- RSH = 286,
- LSH = 287,
- DECREMENT = 288,
- INCREMENT = 289,
- UNARY = 290,
- ARROW = 291,
- BLOCKNAME = 292
+ COMPLETE = 265,
+ NAME_OR_INT = 266,
+ TRUE_KEYWORD = 267,
+ FALSE_KEYWORD = 268,
+ STRUCT_KEYWORD = 269,
+ INTERFACE_KEYWORD = 270,
+ TYPE_KEYWORD = 271,
+ CHAN_KEYWORD = 272,
+ SIZEOF_KEYWORD = 273,
+ LEN_KEYWORD = 274,
+ CAP_KEYWORD = 275,
+ NEW_KEYWORD = 276,
+ IOTA_KEYWORD = 277,
+ NIL_KEYWORD = 278,
+ CONST_KEYWORD = 279,
+ DOTDOTDOT = 280,
+ ENTRY = 281,
+ ERROR = 282,
+ BYTE_KEYWORD = 283,
+ DOLLAR_VARIABLE = 284,
+ ASSIGN_MODIFY = 285,
+ ABOVE_COMMA = 286,
+ OROR = 287,
+ ANDAND = 288,
+ ANDNOT = 289,
+ NOTEQUAL = 290,
+ EQUAL = 291,
+ GEQ = 292,
+ LEQ = 293,
+ RSH = 294,
+ LSH = 295,
+ DECREMENT = 296,
+ INCREMENT = 297,
+ UNARY = 298,
+ LEFT_ARROW = 299
};
#endif
#define INT 258
#define FLOAT 259
-#define STRING 260
-#define FIELDNAME 261
-#define COMPLETE 262
+#define RAW_STRING 260
+#define STRING 261
+#define CHAR 262
#define NAME 263
#define TYPENAME 264
-#define NAME_OR_INT 265
-#define STRUCT 266
-#define CLASS 267
-#define SIZEOF 268
-#define COLONCOLON 269
-#define ERROR 270
-#define VARIABLE 271
-#define THIS 272
-#define TRUEKEYWORD 273
-#define FALSEKEYWORD 274
-#define ABOVE_COMMA 275
-#define ASSIGN 276
-#define NOT 277
-#define OR 278
-#define XOR 279
-#define ANDAND 280
-#define NOTEQUAL 281
-#define GEQ 282
-#define LEQ 283
-#define MOD 284
-#define DIV 285
-#define RSH 286
-#define LSH 287
-#define DECREMENT 288
-#define INCREMENT 289
-#define UNARY 290
-#define ARROW 291
-#define BLOCKNAME 292
+#define COMPLETE 265
+#define NAME_OR_INT 266
+#define TRUE_KEYWORD 267
+#define FALSE_KEYWORD 268
+#define STRUCT_KEYWORD 269
+#define INTERFACE_KEYWORD 270
+#define TYPE_KEYWORD 271
+#define CHAN_KEYWORD 272
+#define SIZEOF_KEYWORD 273
+#define LEN_KEYWORD 274
+#define CAP_KEYWORD 275
+#define NEW_KEYWORD 276
+#define IOTA_KEYWORD 277
+#define NIL_KEYWORD 278
+#define CONST_KEYWORD 279
+#define DOTDOTDOT 280
+#define ENTRY 281
+#define ERROR 282
+#define BYTE_KEYWORD 283
+#define DOLLAR_VARIABLE 284
+#define ASSIGN_MODIFY 285
+#define ABOVE_COMMA 286
+#define OROR 287
+#define ANDAND 288
+#define ANDNOT 289
+#define NOTEQUAL 290
+#define EQUAL 291
+#define GEQ 292
+#define LEQ 293
+#define RSH 294
+#define LSH 295
+#define DECREMENT 296
+#define INCREMENT 297
+#define UNARY 298
+#define LEFT_ARROW 299
/* Copy the first part of user declarations. */
-#line 44 "p-exp.y"
+#line 52 "go-exp.y"
#include "defs.h"
@@ -140,10 +154,12 @@
#include "value.h"
#include "parser-defs.h"
#include "language.h"
-#include "p-lang.h"
+#include "c-lang.h"
+#include "go-lang.h"
#include "bfd.h" /* Required by objfiles.h. */
#include "symfile.h" /* Required by objfiles.h. */
-#include "objfiles.h" /* For have_full_symbols and have_partial_symbols. */
+#include "objfiles.h" /* For have_full_symbols and have_partial_symbols */
+#include "charset.h"
#include "block.h"
#define parse_type builtin_type (parse_gdbarch)
@@ -155,46 +171,46 @@
additional global names that conflict at link time, then those parser
generators need to be fixed instead of adding those names to this list. */
-#define yymaxdepth pascal_maxdepth
-#define yyparse pascal_parse
-#define yylex pascal_lex
-#define yyerror pascal_error
-#define yylval pascal_lval
-#define yychar pascal_char
-#define yydebug pascal_debug
-#define yypact pascal_pact
-#define yyr1 pascal_r1
-#define yyr2 pascal_r2
-#define yydef pascal_def
-#define yychk pascal_chk
-#define yypgo pascal_pgo
-#define yyact pascal_act
-#define yyexca pascal_exca
-#define yyerrflag pascal_errflag
-#define yynerrs pascal_nerrs
-#define yyps pascal_ps
-#define yypv pascal_pv
-#define yys pascal_s
-#define yy_yys pascal_yys
-#define yystate pascal_state
-#define yytmp pascal_tmp
-#define yyv pascal_v
-#define yy_yyv pascal_yyv
-#define yyval pascal_val
-#define yylloc pascal_lloc
-#define yyreds pascal_reds /* With YYDEBUG defined */
-#define yytoks pascal_toks /* With YYDEBUG defined */
-#define yyname pascal_name /* With YYDEBUG defined */
-#define yyrule pascal_rule /* With YYDEBUG defined */
-#define yylhs pascal_yylhs
-#define yylen pascal_yylen
-#define yydefred pascal_yydefred
-#define yydgoto pascal_yydgoto
-#define yysindex pascal_yysindex
-#define yyrindex pascal_yyrindex
-#define yygindex pascal_yygindex
-#define yytable pascal_yytable
-#define yycheck pascal_yycheck
+#define yymaxdepth go_maxdepth
+#define yyparse go_parse_internal
+#define yylex go_lex
+#define yyerror go_error
+#define yylval go_lval
+#define yychar go_char
+#define yydebug go_debug
+#define yypact go_pact
+#define yyr1 go_r1
+#define yyr2 go_r2
+#define yydef go_def
+#define yychk go_chk
+#define yypgo go_pgo
+#define yyact go_act
+#define yyexca go_exca
+#define yyerrflag go_errflag
+#define yynerrs go_nerrs
+#define yyps go_ps
+#define yypv go_pv
+#define yys go_s
+#define yy_yys go_yys
+#define yystate go_state
+#define yytmp go_tmp
+#define yyv go_v
+#define yy_yyv go_yyv
+#define yyval go_val
+#define yylloc go_lloc
+#define yyreds go_reds /* With YYDEBUG defined */
+#define yytoks go_toks /* With YYDEBUG defined */
+#define yyname go_name /* With YYDEBUG defined */
+#define yyrule go_rule /* With YYDEBUG defined */
+#define yylhs go_yylhs
+#define yylen go_yylen
+#define yydefred go_yydefred
+#define yydgoto go_yydgoto
+#define yysindex go_yysindex
+#define yyrindex go_yyrindex
+#define yygindex go_yygindex
+#define yytable go_yytable
+#define yycheck go_yycheck
#ifndef YYDEBUG
#define YYDEBUG 1 /* Default to yydebug support */
@@ -208,7 +224,6 @@ static int yylex (void);
void yyerror (char *);
-static char * uptok (char *, int);
/* Enabling traces. */
@@ -225,7 +240,7 @@ static char * uptok (char *, int);
#endif
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
-#line 129 "p-exp.y"
+#line 138 "go-exp.y"
typedef union YYSTYPE {
LONGEST lval;
struct {
@@ -236,21 +251,18 @@ typedef union YYSTYPE {
DOUBLEST dval;
struct type *type;
} typed_val_float;
- struct symbol *sym;
- struct type *tval;
struct stoken sval;
- struct ttype tsym;
struct symtoken ssym;
+ struct type *tval;
+ struct typed_stoken tsval;
+ struct ttype tsym;
int voidval;
- struct block *bval;
enum exp_opcode opcode;
struct internalvar *ivar;
-
- struct type **tvec;
- int *ivec;
+ struct stoken_vector svec;
} YYSTYPE;
/* Line 191 of yacc.c. */
-#line 254 "p-exp.c"
+#line 266 "go-exp.c"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1
@@ -259,21 +271,16 @@ typedef union YYSTYPE {
/* Copy the second part of user declarations. */
-#line 153 "p-exp.y"
+#line 159 "go-exp.y"
-/* YYSTYPE gets defined by %union */
+/* YYSTYPE gets defined by %union. */
static int parse_number (char *, int, int, YYSTYPE *);
-
-static struct type *current_type;
-static struct internalvar *intvar;
-static int leftdiv_is_integer;
-static void push_current_type (void);
-static void pop_current_type (void);
-static int search_field;
+static int parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
+ DOUBLEST *d, struct type **t);
/* Line 214 of yacc.c. */
-#line 277 "p-exp.c"
+#line 284 "go-exp.c"
#if ! defined (yyoverflow) || YYERROR_VERBOSE
@@ -377,22 +384,22 @@ union yyalloc
#endif
/* YYFINAL -- State number of the termination state. */
-#define YYFINAL 3
+#define YYFINAL 40
/* YYLAST -- Last index in YYTABLE. */
-#define YYLAST 382
+#define YYLAST 443
/* YYNTOKENS -- Number of terminals. */
-#define YYNTOKENS 53
+#define YYNTOKENS 68
/* YYNNTS -- Number of nonterminals. */
-#define YYNNTS 20
+#define YYNNTS 13
/* YYNRULES -- Number of rules. */
-#define YYNRULES 76
+#define YYNRULES 69
/* YYNRULES -- Number of states. */
-#define YYNSTATES 125
+#define YYNSTATES 122
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
#define YYUNDEFTOK 2
-#define YYMAXUTOK 292
+#define YYMAXUTOK 299
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -403,16 +410,16 @@ static const unsigned char yytranslate[] =
0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 62, 2, 2, 2, 54, 39, 2,
+ 60, 64, 52, 50, 31, 51, 58, 53, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 67, 2,
+ 43, 33, 44, 34, 49, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 47, 51, 40, 38, 20, 39, 45, 41, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 29, 27, 30, 2, 37, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 46, 2, 52, 49, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 59, 2, 63, 38, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 65, 37, 66, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
@@ -427,9 +434,9 @@ static const unsigned char yytranslate[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
- 15, 16, 17, 18, 19, 21, 22, 23, 24, 25,
- 26, 28, 31, 32, 33, 34, 35, 36, 42, 43,
- 44, 48, 50
+ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
+ 25, 26, 27, 28, 29, 30, 32, 35, 36, 40,
+ 41, 42, 45, 46, 47, 48, 55, 56, 57, 61
};
#if YYDEBUG
@@ -437,56 +444,53 @@ static const unsigned char yytranslate[] =
YYRHS. */
static const unsigned char yyprhs[] =
{
- 0, 0, 3, 4, 7, 9, 11, 13, 15, 19,
- 22, 25, 28, 31, 36, 41, 44, 47, 50, 53,
- 54, 60, 61, 67, 68, 70, 74, 79, 83, 87,
- 88, 93, 97, 101, 105, 109, 113, 117, 121, 125,
- 129, 133, 137, 141, 145, 149, 153, 157, 159, 161,
- 163, 165, 167, 169, 171, 176, 181, 183, 185, 187,
- 191, 195, 199, 201, 204, 206, 208, 210, 213, 215,
- 218, 221, 223, 225, 227, 229, 231
+ 0, 0, 3, 5, 7, 9, 11, 15, 18, 21,
+ 24, 27, 30, 33, 36, 39, 43, 48, 52, 57,
+ 58, 64, 66, 67, 69, 73, 75, 80, 85, 89,
+ 93, 97, 101, 105, 109, 113, 117, 121, 125, 129,
+ 133, 137, 141, 145, 149, 153, 157, 161, 165, 171,
+ 175, 179, 181, 183, 185, 187, 189, 191, 196, 201,
+ 203, 207, 209, 211, 213, 216, 218, 221, 223, 225
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
static const yysigned_char yyrhs[] =
{
- 54, 0, -1, -1, 55, 56, -1, 58, -1, 57,
- -1, 69, -1, 59, -1, 58, 20, 59, -1, 59,
- 49, -1, 37, 59, -1, 39, 59, -1, 23, 59,
- -1, 43, 47, 59, 51, -1, 42, 47, 59, 51,
- -1, 59, 45, -1, 60, 6, -1, 60, 71, -1,
- 60, 7, -1, -1, 59, 46, 61, 58, 52, -1,
- -1, 59, 47, 62, 63, 51, -1, -1, 59, -1,
- 63, 20, 59, -1, 69, 47, 59, 51, -1, 47,
- 58, 51, -1, 59, 40, 59, -1, -1, 59, 41,
- 64, 59, -1, 59, 34, 59, -1, 59, 33, 59,
- -1, 59, 38, 59, -1, 59, 39, 59, -1, 59,
- 36, 59, -1, 59, 35, 59, -1, 59, 27, 59,
- -1, 59, 28, 59, -1, 59, 32, 59, -1, 59,
- 31, 59, -1, 59, 29, 59, -1, 59, 30, 59,
- -1, 59, 26, 59, -1, 59, 25, 59, -1, 59,
- 24, 59, -1, 59, 22, 59, -1, 18, -1, 19,
- -1, 3, -1, 10, -1, 4, -1, 66, -1, 16,
- -1, 13, 47, 69, 51, -1, 13, 47, 59, 51,
- -1, 5, -1, 17, -1, 50, -1, 65, 14, 71,
- -1, 65, 14, 71, -1, 70, 14, 71, -1, 67,
- -1, 14, 71, -1, 72, -1, 70, -1, 68, -1,
- 49, 70, -1, 9, -1, 11, 71, -1, 12, 71,
- -1, 8, -1, 50, -1, 9, -1, 10, -1, 8,
- -1, 50, -1
+ 69, 0, -1, 71, -1, 70, -1, 79, -1, 72,
+ -1, 71, 31, 72, -1, 52, 72, -1, 39, 72,
+ -1, 51, 72, -1, 50, 72, -1, 62, 72, -1,
+ 38, 72, -1, 72, 56, -1, 72, 55, -1, 72,
+ 58, 80, -1, 72, 58, 80, 10, -1, 72, 58,
+ 10, -1, 72, 59, 71, 63, -1, -1, 72, 60,
+ 73, 75, 64, -1, 65, -1, -1, 72, -1, 75,
+ 31, 72, -1, 66, -1, 74, 79, 76, 72, -1,
+ 79, 60, 72, 64, -1, 60, 71, 64, -1, 72,
+ 49, 72, -1, 72, 52, 72, -1, 72, 53, 72,
+ -1, 72, 54, 72, -1, 72, 50, 72, -1, 72,
+ 51, 72, -1, 72, 48, 72, -1, 72, 47, 72,
+ -1, 72, 42, 72, -1, 72, 41, 72, -1, 72,
+ 46, 72, -1, 72, 45, 72, -1, 72, 43, 72,
+ -1, 72, 44, 72, -1, 72, 39, 72, -1, 72,
+ 38, 72, -1, 72, 37, 72, -1, 72, 36, 72,
+ -1, 72, 35, 72, -1, 72, 34, 72, 67, 72,
+ -1, 72, 33, 72, -1, 72, 30, 72, -1, 3,
+ -1, 7, -1, 11, -1, 4, -1, 78, -1, 29,
+ -1, 18, 60, 79, 64, -1, 18, 60, 72, 64,
+ -1, 6, -1, 77, 50, 6, -1, 77, -1, 12,
+ -1, 13, -1, 80, 26, -1, 80, -1, 52, 79,
+ -1, 9, -1, 28, -1, 8, -1
};
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const unsigned short yyrline[] =
{
- 0, 234, 234, 234, 243, 244, 247, 254, 255, 260,
- 266, 272, 276, 280, 284, 289, 293, 311, 329, 341,
- 339, 369, 366, 381, 382, 384, 388, 403, 409, 413,
- 413, 433, 437, 441, 445, 449, 453, 457, 463, 469,
- 475, 481, 487, 493, 497, 501, 505, 509, 516, 523,
- 531, 545, 553, 556, 571, 579, 582, 607, 634, 652,
- 662, 677, 692, 693, 724, 795, 806, 810, 812, 814,
- 817, 825, 826, 827, 828, 831, 832
+ 0, 237, 237, 238, 241, 248, 249, 254, 258, 262,
+ 266, 270, 274, 278, 282, 288, 294, 301, 311, 318,
+ 315, 325, 329, 332, 336, 340, 344, 350, 356, 362,
+ 366, 370, 374, 378, 382, 386, 390, 394, 398, 402,
+ 406, 410, 414, 418, 422, 426, 430, 434, 438, 442,
+ 446, 452, 459, 468, 481, 488, 491, 497, 509, 516,
+ 533, 551, 562, 568, 574, 590, 645, 647, 654, 667
};
#endif
@@ -495,17 +499,19 @@ static const unsigned short yyrline[] =
First, the terminals, then, starting at YYNTOKENS, nonterminals. */
static const char *const yytname[] =
{
- "$end", "error", "$undefined", "INT", "FLOAT", "STRING", "FIELDNAME",
- "COMPLETE", "NAME", "TYPENAME", "NAME_OR_INT", "STRUCT", "CLASS",
- "SIZEOF", "COLONCOLON", "ERROR", "VARIABLE", "THIS", "TRUEKEYWORD",
- "FALSEKEYWORD", "','", "ABOVE_COMMA", "ASSIGN", "NOT", "OR", "XOR",
- "ANDAND", "'='", "NOTEQUAL", "'<'", "'>'", "GEQ", "LEQ", "MOD", "DIV",
- "RSH", "LSH", "'@'", "'+'", "'-'", "'*'", "'/'", "DECREMENT",
- "INCREMENT", "UNARY", "'.'", "'['", "'('", "ARROW", "'^'", "BLOCKNAME",
- "')'", "']'", "$accept", "start", "@1", "normal_start", "type_exp",
- "exp1", "exp", "field_exp", "@2", "@3", "arglist", "@4", "block",
- "variable", "qualified_name", "ptype", "type", "typebase", "name",
- "name_not_typename", 0
+ "$end", "error", "$undefined", "INT", "FLOAT", "RAW_STRING", "STRING",
+ "CHAR", "NAME", "TYPENAME", "COMPLETE", "NAME_OR_INT", "TRUE_KEYWORD",
+ "FALSE_KEYWORD", "STRUCT_KEYWORD", "INTERFACE_KEYWORD", "TYPE_KEYWORD",
+ "CHAN_KEYWORD", "SIZEOF_KEYWORD", "LEN_KEYWORD", "CAP_KEYWORD",
+ "NEW_KEYWORD", "IOTA_KEYWORD", "NIL_KEYWORD", "CONST_KEYWORD",
+ "DOTDOTDOT", "ENTRY", "ERROR", "BYTE_KEYWORD", "DOLLAR_VARIABLE",
+ "ASSIGN_MODIFY", "','", "ABOVE_COMMA", "'='", "'?'", "OROR", "ANDAND",
+ "'|'", "'^'", "'&'", "ANDNOT", "NOTEQUAL", "EQUAL", "'<'", "'>'", "GEQ",
+ "LEQ", "RSH", "LSH", "'@'", "'+'", "'-'", "'*'", "'/'", "'%'",
+ "DECREMENT", "INCREMENT", "UNARY", "'.'", "'['", "'('", "LEFT_ARROW",
+ "'!'", "']'", "')'", "'{'", "'}'", "':'", "$accept", "start", "type_exp",
+ "exp1", "exp", "@1", "lcurly", "arglist", "rcurly", "string_exp",
+ "variable", "type", "name_not_typename", 0
};
#endif
@@ -516,37 +522,36 @@ static const unsigned short yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
- 44, 275, 276, 277, 278, 279, 280, 61, 281, 60,
- 62, 282, 283, 284, 285, 286, 287, 64, 43, 45,
- 42, 47, 288, 289, 290, 46, 91, 40, 291, 94,
- 292, 41, 93
+ 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
+ 285, 44, 286, 61, 63, 287, 288, 124, 94, 38,
+ 289, 290, 291, 60, 62, 292, 293, 294, 295, 64,
+ 43, 45, 42, 47, 37, 296, 297, 298, 46, 91,
+ 40, 299, 33, 93, 41, 123, 125, 58
};
# endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const unsigned char yyr1[] =
{
- 0, 53, 55, 54, 56, 56, 57, 58, 58, 59,
- 59, 59, 59, 59, 59, 60, 59, 59, 59, 61,
- 59, 62, 59, 63, 63, 63, 59, 59, 59, 64,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 65, 65,
- 66, 67, 66, 66, 66, 68, 69, 70, 70, 70,
- 70, 71, 71, 71, 71, 72, 72
+ 0, 68, 69, 69, 70, 71, 71, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 73,
+ 72, 74, 75, 75, 75, 76, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 77,
+ 77, 72, 72, 72, 78, 78, 79, 79, 79, 80
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
static const unsigned char yyr2[] =
{
- 0, 2, 0, 2, 1, 1, 1, 1, 3, 2,
- 2, 2, 2, 4, 4, 2, 2, 2, 2, 0,
- 5, 0, 5, 0, 1, 3, 4, 3, 3, 0,
- 4, 3, 3, 3, 3, 3, 3, 3, 3, 3,
- 3, 3, 3, 3, 3, 3, 3, 1, 1, 1,
- 1, 1, 1, 1, 4, 4, 1, 1, 1, 3,
- 3, 3, 1, 2, 1, 1, 1, 2, 1, 2,
- 2, 1, 1, 1, 1, 1, 1
+ 0, 2, 1, 1, 1, 1, 3, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 4, 3, 4, 0,
+ 5, 1, 0, 1, 3, 1, 4, 4, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 5, 3,
+ 3, 1, 1, 1, 1, 1, 1, 4, 4, 1,
+ 3, 1, 1, 1, 2, 1, 2, 1, 1, 1
};
/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
@@ -554,163 +559,175 @@ static const unsigned char yyr2[] =
means the default is an error. */
static const unsigned char yydefact[] =
{
- 2, 0, 0, 1, 49, 51, 56, 75, 68, 50,
- 0, 0, 0, 0, 53, 57, 47, 48, 0, 0,
- 0, 0, 0, 0, 0, 76, 3, 5, 4, 7,
- 0, 0, 52, 62, 66, 6, 65, 64, 71, 73,
- 74, 72, 69, 70, 0, 63, 12, 0, 10, 11,
- 0, 0, 0, 67, 0, 0, 0, 0, 0, 0,
+ 0, 51, 54, 59, 52, 69, 67, 53, 62, 63,
+ 0, 68, 56, 0, 0, 0, 0, 0, 0, 0,
+ 21, 0, 3, 2, 5, 0, 61, 55, 4, 65,
+ 0, 12, 0, 8, 10, 9, 7, 66, 0, 11,
+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 29, 15, 19, 21, 9, 16, 18, 17,
- 0, 0, 0, 0, 0, 0, 0, 27, 8, 46,
- 45, 44, 43, 37, 38, 41, 42, 40, 39, 32,
- 31, 36, 35, 33, 34, 28, 0, 0, 23, 60,
- 0, 61, 55, 54, 14, 13, 30, 0, 24, 0,
- 26, 20, 0, 22, 25
+ 0, 0, 0, 0, 14, 13, 0, 0, 19, 0,
+ 0, 0, 0, 64, 0, 0, 28, 6, 50, 49,
+ 0, 47, 46, 45, 44, 43, 38, 37, 41, 42,
+ 40, 39, 36, 35, 29, 33, 34, 30, 31, 32,
+ 17, 15, 0, 22, 66, 25, 0, 60, 0, 58,
+ 57, 0, 16, 18, 23, 0, 26, 27, 48, 0,
+ 20, 24
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yysigned_char yydefgoto[] =
{
- -1, 1, 2, 26, 27, 28, 29, 30, 107, 108,
- 119, 106, 31, 32, 33, 34, 47, 36, 42, 37
+ -1, 21, 22, 23, 24, 103, 25, 115, 106, 26,
+ 27, 32, 29
};
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
-#define YYPACT_NINF -43
+#define YYPACT_NINF -56
static const short yypact[] =
{
- -43, 8, 89, -43, -43, -43, -43, -43, -43, -43,
- 7, 7, -40, 7, -43, -43, -43, -43, 89, 89,
- 89, -27, -23, 89, 10, 13, -43, -43, 14, 230,
- 4, 21, -43, -43, -43, -19, 41, -43, -43, -43,
- -43, -43, -43, -43, 89, -43, 36, -19, 36, 36,
- 89, 89, 5, -43, 89, 89, 89, 89, 89, 89,
- 89, 89, 89, 89, 89, 89, 89, 89, 89, 89,
- 89, 89, -43, -43, -43, -43, -43, -43, -43, -43,
- 7, 89, 7, 118, -42, 146, 174, -43, 230, 230,
- 255, 279, 302, 323, 323, 31, 31, 31, 31, 75,
- 75, 75, 75, 333, 333, 36, 89, 89, 89, 44,
- 202, -43, -43, -43, -43, -43, 36, 9, 230, 11,
- -43, -43, 89, -43, 230
+ 49, -56, -56, -56, -56, -56, -56, -56, -56, -56,
+ -44, -56, -56, 49, 49, 49, 49, 49, 49, 49,
+ -56, 23, -56, 34, 187, 45, -23, -56, 6, 46,
+ 49, -48, 6, -48, -48, -48, -48, 6, 38, -48,
+ -56, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, 49, 49, 49, 49, 49, 49,
+ 49, 49, 49, 49, -56, -56, 5, 49, -56, 45,
+ 8, 65, 49, -56, 123, -55, -56, 187, 187, 187,
+ 88, 239, 263, 286, 308, 328, 346, 346, 360, 360,
+ 360, 360, 372, 372, 383, -34, -34, -48, -48, -48,
+ -56, 69, 33, 49, -56, -56, 49, -56, 155, -56,
+ -56, 49, -56, -56, 187, 39, -48, -56, 214, 49,
+ -56, 187
};
/* YYPGOTO[NTERM-NUM]. */
static const yysigned_char yypgoto[] =
{
- -43, -43, -43, -43, -43, -20, -18, -43, -43, -43,
- -43, -43, -43, -43, -43, -43, 16, 6, -7, -43
+ -56, -56, -56, -4, -13, -56, -56, -56, -56, -56,
+ -56, 51, 9
};
/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
positive, shift that token. If negative, reduce the rule which
number is the opposite. If zero, do what YYDEFACT says.
If YYTABLE_NINF, syntax error. */
-#define YYTABLE_NINF -60
-static const yysigned_char yytable[] =
+#define YYTABLE_NINF -1
+static const unsigned char yytable[] =
{
- 46, 48, 49, 52, 43, 81, 45, 44, 3, 113,
- 77, 78, 38, 39, 40, 38, 39, 40, 35, 8,
- 50, 10, 11, 79, 51, 54, 83, -58, 81, 54,
- 53, 122, 85, 86, 54, 80, 88, 89, 90, 91,
- 92, 93, 94, 95, 96, 97, 98, 99, 100, 101,
- 102, 103, 104, 105, 41, 82, 87, 41, -59, 24,
- 84, 121, 123, 110, 65, 66, 67, 68, 0, 69,
- 70, 71, 72, 109, 0, 111, 73, 74, 75, 0,
- 76, 73, 74, 75, 0, 76, 0, 117, 116, 0,
- 118, 0, 4, 5, 6, 0, 0, 7, 8, 9,
- 10, 11, 12, 13, 124, 14, 15, 16, 17, 0,
- 0, 0, 18, 69, 70, 71, 72, 0, 0, 0,
- 73, 74, 75, 0, 76, 0, 19, 0, 20, 0,
- 0, 21, 22, 0, 0, 0, 23, 0, 24, 25,
- 55, 0, 56, 57, 58, 59, 60, 61, 62, 63,
- 64, 65, 66, 67, 68, 0, 69, 70, 71, 72,
- 0, 0, 0, 73, 74, 75, 0, 76, 55, 112,
+ 31, 33, 34, 35, 36, 72, 39, 64, 65, 110,
+ 66, 67, 68, 5, 38, 100, 30, 74, 61, 62,
+ 63, 64, 65, 40, 66, 67, 68, 71, 77, 78,
+ 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
+ 89, 90, 91, 92, 93, 94, 95, 96, 97, 98,
+ 99, 28, 1, 2, 6, 3, 4, 5, 6, 108,
+ 7, 8, 9, 102, 41, 41, 72, 10, 37, 41,
+ 119, 107, 73, 11, 105, 101, 70, 11, 12, 112,
+ 0, 75, 0, 0, 0, 0, 0, 13, 14, 0,
+ 114, 0, 0, 116, 0, 0, 113, 69, 118, 15,
+ 16, 17, 76, 120, 0, 0, 121, 0, 0, 18,
+ 0, 19, 0, 0, 20, 0, 0, 0, 42, 0,
+ 104, 43, 44, 45, 46, 47, 48, 49, 0, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 0, 66, 67, 68, 0,
+ 0, 0, 0, 42, 0, 111, 43, 44, 45, 46,
+ 47, 48, 49, 0, 50, 51, 52, 53, 54, 55,
56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
- 66, 67, 68, 0, 69, 70, 71, 72, 0, 0,
- 0, 73, 74, 75, 0, 76, 55, 114, 56, 57,
- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 68, 0, 69, 70, 71, 72, 0, 0, 0, 73,
- 74, 75, 0, 76, 55, 115, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 0,
- 69, 70, 71, 72, 0, 0, 0, 73, 74, 75,
- 0, 76, 55, 120, 56, 57, 58, 59, 60, 61,
- 62, 63, 64, 65, 66, 67, 68, 0, 69, 70,
- 71, 72, 0, 0, 0, 73, 74, 75, 0, 76,
- 57, 58, 59, 60, 61, 62, 63, 64, 65, 66,
- 67, 68, 0, 69, 70, 71, 72, 0, 0, 0,
- 73, 74, 75, 0, 76, 58, 59, 60, 61, 62,
- 63, 64, 65, 66, 67, 68, 0, 69, 70, 71,
- 72, 0, 0, 0, 73, 74, 75, 0, 76, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 0,
- 69, 70, 71, 72, 0, 0, 0, 73, 74, 75,
- 0, 76, 61, 62, 63, 64, 65, 66, 67, 68,
- 0, 69, 70, 71, 72, 0, 0, 0, 73, 74,
- 75, 0, 76, 71, 72, 0, 0, 0, 73, 74,
- 75, 0, 76
+ 0, 66, 67, 68, 0, 42, 0, 109, 43, 44,
+ 45, 46, 47, 48, 49, 0, 50, 51, 52, 53,
+ 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
+ 64, 65, 0, 66, 67, 68, 0, 42, 0, 117,
+ 43, 44, 45, 46, 47, 48, 49, 0, 50, 51,
+ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,
+ 62, 63, 64, 65, 0, 66, 67, 68, 44, 45,
+ 46, 47, 48, 49, 0, 50, 51, 52, 53, 54,
+ 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
+ 65, 0, 66, 67, 68, 46, 47, 48, 49, 0,
+ 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
+ 60, 61, 62, 63, 64, 65, 0, 66, 67, 68,
+ 47, 48, 49, 0, 50, 51, 52, 53, 54, 55,
+ 56, 57, 58, 59, 60, 61, 62, 63, 64, 65,
+ 0, 66, 67, 68, 48, 49, 0, 50, 51, 52,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 0, 66, 67, 68, 49, 0, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 0, 66, 67, 68, 50,
+ 51, 52, 53, 54, 55, 56, 57, 58, 59, 60,
+ 61, 62, 63, 64, 65, 0, 66, 67, 68, 52,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 64, 65, 0, 66, 67, 68, 56, 57, 58,
+ 59, 60, 61, 62, 63, 64, 65, 0, 66, 67,
+ 68, 58, 59, 60, 61, 62, 63, 64, 65, 0,
+ 66, 67, 68, 59, 60, 61, 62, 63, 64, 65,
+ 0, 66, 67, 68
};
static const yysigned_char yycheck[] =
{
- 18, 19, 20, 23, 11, 47, 13, 47, 0, 51,
- 6, 7, 8, 9, 10, 8, 9, 10, 2, 9,
- 47, 11, 12, 30, 47, 20, 44, 14, 47, 20,
- 24, 20, 50, 51, 20, 14, 54, 55, 56, 57,
- 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
- 68, 69, 70, 71, 50, 14, 51, 50, 14, 49,
- 44, 52, 51, 81, 33, 34, 35, 36, -1, 38,
- 39, 40, 41, 80, -1, 82, 45, 46, 47, -1,
- 49, 45, 46, 47, -1, 49, -1, 107, 106, -1,
- 108, -1, 3, 4, 5, -1, -1, 8, 9, 10,
- 11, 12, 13, 14, 122, 16, 17, 18, 19, -1,
- -1, -1, 23, 38, 39, 40, 41, -1, -1, -1,
- 45, 46, 47, -1, 49, -1, 37, -1, 39, -1,
- -1, 42, 43, -1, -1, -1, 47, -1, 49, 50,
- 22, -1, 24, 25, 26, 27, 28, 29, 30, 31,
- 32, 33, 34, 35, 36, -1, 38, 39, 40, 41,
- -1, -1, -1, 45, 46, 47, -1, 49, 22, 51,
- 24, 25, 26, 27, 28, 29, 30, 31, 32, 33,
- 34, 35, 36, -1, 38, 39, 40, 41, -1, -1,
- -1, 45, 46, 47, -1, 49, 22, 51, 24, 25,
- 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,
- 36, -1, 38, 39, 40, 41, -1, -1, -1, 45,
- 46, 47, -1, 49, 22, 51, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, -1,
- 38, 39, 40, 41, -1, -1, -1, 45, 46, 47,
- -1, 49, 22, 51, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, -1, 38, 39,
- 40, 41, -1, -1, -1, 45, 46, 47, -1, 49,
- 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
- 35, 36, -1, 38, 39, 40, 41, -1, -1, -1,
- 45, 46, 47, -1, 49, 26, 27, 28, 29, 30,
- 31, 32, 33, 34, 35, 36, -1, 38, 39, 40,
- 41, -1, -1, -1, 45, 46, 47, -1, 49, 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, -1,
- 38, 39, 40, 41, -1, -1, -1, 45, 46, 47,
- -1, 49, 29, 30, 31, 32, 33, 34, 35, 36,
- -1, 38, 39, 40, 41, -1, -1, -1, 45, 46,
- 47, -1, 49, 40, 41, -1, -1, -1, 45, 46,
- 47, -1, 49
+ 13, 14, 15, 16, 17, 60, 19, 55, 56, 64,
+ 58, 59, 60, 8, 18, 10, 60, 30, 52, 53,
+ 54, 55, 56, 0, 58, 59, 60, 50, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
+ 63, 0, 3, 4, 9, 6, 7, 8, 9, 72,
+ 11, 12, 13, 67, 31, 31, 60, 18, 17, 31,
+ 31, 6, 26, 28, 66, 66, 25, 28, 29, 10,
+ -1, 30, -1, -1, -1, -1, -1, 38, 39, -1,
+ 103, -1, -1, 106, -1, -1, 63, 52, 111, 50,
+ 51, 52, 64, 64, -1, -1, 119, -1, -1, 60,
+ -1, 62, -1, -1, 65, -1, -1, -1, 30, -1,
+ 69, 33, 34, 35, 36, 37, 38, 39, -1, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, -1,
+ -1, -1, -1, 30, -1, 67, 33, 34, 35, 36,
+ 37, 38, 39, -1, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, -1, 30, -1, 64, 33, 34,
+ 35, 36, 37, 38, 39, -1, 41, 42, 43, 44,
+ 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
+ 55, 56, -1, 58, 59, 60, -1, 30, -1, 64,
+ 33, 34, 35, 36, 37, 38, 39, -1, 41, 42,
+ 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
+ 53, 54, 55, 56, -1, 58, 59, 60, 34, 35,
+ 36, 37, 38, 39, -1, 41, 42, 43, 44, 45,
+ 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,
+ 56, -1, 58, 59, 60, 36, 37, 38, 39, -1,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, -1, 58, 59, 60,
+ 37, 38, 39, -1, 41, 42, 43, 44, 45, 46,
+ 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60, 38, 39, -1, 41, 42, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, 39, -1, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, 41,
+ 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,
+ 52, 53, 54, 55, 56, -1, 58, 59, 60, 43,
+ 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
+ 54, 55, 56, -1, 58, 59, 60, 47, 48, 49,
+ 50, 51, 52, 53, 54, 55, 56, -1, 58, 59,
+ 60, 49, 50, 51, 52, 53, 54, 55, 56, -1,
+ 58, 59, 60, 50, 51, 52, 53, 54, 55, 56,
+ -1, 58, 59, 60
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
static const unsigned char yystos[] =
{
- 0, 54, 55, 0, 3, 4, 5, 8, 9, 10,
- 11, 12, 13, 14, 16, 17, 18, 19, 23, 37,
- 39, 42, 43, 47, 49, 50, 56, 57, 58, 59,
- 60, 65, 66, 67, 68, 69, 70, 72, 8, 9,
- 10, 50, 71, 71, 47, 71, 59, 69, 59, 59,
- 47, 47, 58, 70, 20, 22, 24, 25, 26, 27,
- 28, 29, 30, 31, 32, 33, 34, 35, 36, 38,
- 39, 40, 41, 45, 46, 47, 49, 6, 7, 71,
- 14, 47, 14, 59, 69, 59, 59, 51, 59, 59,
- 59, 59, 59, 59, 59, 59, 59, 59, 59, 59,
- 59, 59, 59, 59, 59, 59, 64, 61, 62, 71,
- 59, 71, 51, 51, 51, 51, 59, 58, 59, 63,
- 51, 52, 20, 51, 59
+ 0, 3, 4, 6, 7, 8, 9, 11, 12, 13,
+ 18, 28, 29, 38, 39, 50, 51, 52, 60, 62,
+ 65, 69, 70, 71, 72, 74, 77, 78, 79, 80,
+ 60, 72, 79, 72, 72, 72, 72, 79, 71, 72,
+ 0, 31, 30, 33, 34, 35, 36, 37, 38, 39,
+ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
+ 51, 52, 53, 54, 55, 56, 58, 59, 60, 52,
+ 79, 50, 60, 26, 72, 79, 64, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 72, 72, 72, 72, 72, 72, 72, 72, 72, 72,
+ 10, 80, 71, 73, 79, 66, 76, 6, 72, 64,
+ 64, 67, 10, 63, 72, 75, 72, 64, 72, 31,
+ 64, 72
};
#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__)
@@ -1320,111 +1337,75 @@ yyreduce:
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
- case 2:
-#line 234 "p-exp.y"
- { current_type = NULL;
- intvar = NULL;
- search_field = 0;
- leftdiv_is_integer = 0;
- }
+ case 4:
+#line 242 "go-exp.y"
+ { write_exp_elt_opcode(OP_TYPE);
+ write_exp_elt_type(yyvsp[0].tval);
+ write_exp_elt_opcode(OP_TYPE); }
break;
- case 3:
-#line 239 "p-exp.y"
- {}
+ case 6:
+#line 250 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_COMMA); }
break;
- case 6:
-#line 248 "p-exp.y"
- { write_exp_elt_opcode(OP_TYPE);
- write_exp_elt_type(yyvsp[0].tval);
- write_exp_elt_opcode(OP_TYPE);
- current_type = yyvsp[0].tval; }
+ case 7:
+#line 255 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_IND); }
break;
case 8:
-#line 256 "p-exp.y"
- { write_exp_elt_opcode (BINOP_COMMA); }
+#line 259 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_ADDR); }
break;
case 9:
-#line 261 "p-exp.y"
- { write_exp_elt_opcode (UNOP_IND);
- if (current_type)
- current_type = TYPE_TARGET_TYPE (current_type); }
+#line 263 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_NEG); }
break;
case 10:
-#line 267 "p-exp.y"
- { write_exp_elt_opcode (UNOP_ADDR);
- if (current_type)
- current_type = TYPE_POINTER_TYPE (current_type); }
+#line 267 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_PLUS); }
break;
case 11:
-#line 273 "p-exp.y"
- { write_exp_elt_opcode (UNOP_NEG); }
+#line 271 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
break;
case 12:
-#line 277 "p-exp.y"
- { write_exp_elt_opcode (UNOP_LOGICAL_NOT); }
+#line 275 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_COMPLEMENT); }
break;
case 13:
-#line 281 "p-exp.y"
- { write_exp_elt_opcode (UNOP_PREINCREMENT); }
+#line 279 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_POSTINCREMENT); }
break;
case 14:
-#line 285 "p-exp.y"
- { write_exp_elt_opcode (UNOP_PREDECREMENT); }
+#line 283 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_POSTDECREMENT); }
break;
case 15:
-#line 290 "p-exp.y"
- { search_field = 1; }
- break;
-
- case 16:
-#line 294 "p-exp.y"
+#line 289 "go-exp.y"
{ write_exp_elt_opcode (STRUCTOP_STRUCT);
- write_exp_string (yyvsp[0].sval);
- write_exp_elt_opcode (STRUCTOP_STRUCT);
- search_field = 0;
- if (current_type)
- {
- while (TYPE_CODE (current_type)
- == TYPE_CODE_PTR)
- current_type =
- TYPE_TARGET_TYPE (current_type);
- current_type = lookup_struct_elt_type (
- current_type, yyvsp[0].sval.ptr, 0);
- }
- }
+ write_exp_string (yyvsp[0].ssym.stoken);
+ write_exp_elt_opcode (STRUCTOP_STRUCT); }
break;
- case 17:
-#line 312 "p-exp.y"
+ case 16:
+#line 295 "go-exp.y"
{ mark_struct_expression ();
write_exp_elt_opcode (STRUCTOP_STRUCT);
- write_exp_string (yyvsp[0].sval);
- write_exp_elt_opcode (STRUCTOP_STRUCT);
- search_field = 0;
- if (current_type)
- {
- while (TYPE_CODE (current_type)
- == TYPE_CODE_PTR)
- current_type =
- TYPE_TARGET_TYPE (current_type);
- current_type = lookup_struct_elt_type (
- current_type, yyvsp[0].sval.ptr, 0);
- }
- }
+ write_exp_string (yyvsp[-1].ssym.stoken);
+ write_exp_elt_opcode (STRUCTOP_STRUCT); }
break;
- case 18:
-#line 330 "p-exp.y"
+ case 17:
+#line 302 "go-exp.y"
{ struct stoken s;
mark_struct_expression ();
write_exp_elt_opcode (STRUCTOP_STRUCT);
@@ -1434,429 +1415,324 @@ yyreduce:
write_exp_elt_opcode (STRUCTOP_STRUCT); }
break;
+ case 18:
+#line 312 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_SUBSCRIPT); }
+ break;
+
case 19:
-#line 341 "p-exp.y"
- { char *arrayname;
- int arrayfieldindex;
- arrayfieldindex = is_pascal_string_type (
- current_type, NULL, NULL,
- NULL, NULL, &arrayname);
- if (arrayfieldindex)
- {
- struct stoken stringsval;
- stringsval.ptr = alloca (strlen (arrayname) + 1);
- stringsval.length = strlen (arrayname);
- strcpy (stringsval.ptr, arrayname);
- current_type = TYPE_FIELD_TYPE (current_type,
- arrayfieldindex - 1);
- write_exp_elt_opcode (STRUCTOP_STRUCT);
- write_exp_string (stringsval);
- write_exp_elt_opcode (STRUCTOP_STRUCT);
- }
- push_current_type (); }
+#line 318 "go-exp.y"
+ { start_arglist (); }
break;
case 20:
-#line 360 "p-exp.y"
- { pop_current_type ();
- write_exp_elt_opcode (BINOP_SUBSCRIPT);
- if (current_type)
- current_type = TYPE_TARGET_TYPE (current_type); }
+#line 320 "go-exp.y"
+ { write_exp_elt_opcode (OP_FUNCALL);
+ write_exp_elt_longcst ((LONGEST) end_arglist ());
+ write_exp_elt_opcode (OP_FUNCALL); }
break;
case 21:
-#line 369 "p-exp.y"
- { push_current_type ();
- start_arglist (); }
+#line 326 "go-exp.y"
+ { start_arglist (); }
break;
- case 22:
-#line 372 "p-exp.y"
- { write_exp_elt_opcode (OP_FUNCALL);
- write_exp_elt_longcst ((LONGEST) end_arglist ());
- write_exp_elt_opcode (OP_FUNCALL);
- pop_current_type ();
- if (current_type)
- current_type = TYPE_TARGET_TYPE (current_type);
- }
+ case 23:
+#line 333 "go-exp.y"
+ { arglist_len = 1; }
break;
case 24:
-#line 383 "p-exp.y"
- { arglist_len = 1; }
+#line 337 "go-exp.y"
+ { arglist_len++; }
break;
case 25:
-#line 385 "p-exp.y"
- { arglist_len++; }
+#line 341 "go-exp.y"
+ { yyval.lval = end_arglist () - 1; }
break;
case 26:
-#line 389 "p-exp.y"
- { if (current_type)
- {
- /* Allow automatic dereference of classes. */
- if ((TYPE_CODE (current_type) == TYPE_CODE_PTR)
- && (TYPE_CODE (TYPE_TARGET_TYPE (current_type)) == TYPE_CODE_CLASS)
- && (TYPE_CODE (yyvsp[-3].tval) == TYPE_CODE_CLASS))
- write_exp_elt_opcode (UNOP_IND);
- }
- write_exp_elt_opcode (UNOP_CAST);
- write_exp_elt_type (yyvsp[-3].tval);
- write_exp_elt_opcode (UNOP_CAST);
- current_type = yyvsp[-3].tval; }
+#line 345 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_MEMVAL);
+ write_exp_elt_type (yyvsp[-2].tval);
+ write_exp_elt_opcode (UNOP_MEMVAL); }
break;
case 27:
-#line 404 "p-exp.y"
- { }
+#line 351 "go-exp.y"
+ { write_exp_elt_opcode (UNOP_CAST);
+ write_exp_elt_type (yyvsp[-3].tval);
+ write_exp_elt_opcode (UNOP_CAST); }
break;
case 28:
-#line 410 "p-exp.y"
- { write_exp_elt_opcode (BINOP_MUL); }
+#line 357 "go-exp.y"
+ { }
break;
case 29:
-#line 413 "p-exp.y"
- {
- if (current_type && is_integral_type (current_type))
- leftdiv_is_integer = 1;
- }
+#line 363 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_REPEAT); }
break;
case 30:
-#line 418 "p-exp.y"
- {
- if (leftdiv_is_integer && current_type
- && is_integral_type (current_type))
- {
- write_exp_elt_opcode (UNOP_CAST);
- write_exp_elt_type (parse_type->builtin_long_double);
- current_type = parse_type->builtin_long_double;
- write_exp_elt_opcode (UNOP_CAST);
- leftdiv_is_integer = 0;
- }
-
- write_exp_elt_opcode (BINOP_DIV);
- }
+#line 367 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_MUL); }
break;
case 31:
-#line 434 "p-exp.y"
- { write_exp_elt_opcode (BINOP_INTDIV); }
+#line 371 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_DIV); }
break;
case 32:
-#line 438 "p-exp.y"
+#line 375 "go-exp.y"
{ write_exp_elt_opcode (BINOP_REM); }
break;
case 33:
-#line 442 "p-exp.y"
+#line 379 "go-exp.y"
{ write_exp_elt_opcode (BINOP_ADD); }
break;
case 34:
-#line 446 "p-exp.y"
+#line 383 "go-exp.y"
{ write_exp_elt_opcode (BINOP_SUB); }
break;
case 35:
-#line 450 "p-exp.y"
+#line 387 "go-exp.y"
{ write_exp_elt_opcode (BINOP_LSH); }
break;
case 36:
-#line 454 "p-exp.y"
+#line 391 "go-exp.y"
{ write_exp_elt_opcode (BINOP_RSH); }
break;
case 37:
-#line 458 "p-exp.y"
- { write_exp_elt_opcode (BINOP_EQUAL);
- current_type = parse_type->builtin_bool;
- }
+#line 395 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_EQUAL); }
break;
case 38:
-#line 464 "p-exp.y"
- { write_exp_elt_opcode (BINOP_NOTEQUAL);
- current_type = parse_type->builtin_bool;
- }
+#line 399 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_NOTEQUAL); }
break;
case 39:
-#line 470 "p-exp.y"
- { write_exp_elt_opcode (BINOP_LEQ);
- current_type = parse_type->builtin_bool;
- }
+#line 403 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_LEQ); }
break;
case 40:
-#line 476 "p-exp.y"
- { write_exp_elt_opcode (BINOP_GEQ);
- current_type = parse_type->builtin_bool;
- }
+#line 407 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_GEQ); }
break;
case 41:
-#line 482 "p-exp.y"
- { write_exp_elt_opcode (BINOP_LESS);
- current_type = parse_type->builtin_bool;
- }
+#line 411 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_LESS); }
break;
case 42:
-#line 488 "p-exp.y"
- { write_exp_elt_opcode (BINOP_GTR);
- current_type = parse_type->builtin_bool;
- }
+#line 415 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_GTR); }
break;
case 43:
-#line 494 "p-exp.y"
+#line 419 "go-exp.y"
{ write_exp_elt_opcode (BINOP_BITWISE_AND); }
break;
case 44:
-#line 498 "p-exp.y"
+#line 423 "go-exp.y"
{ write_exp_elt_opcode (BINOP_BITWISE_XOR); }
break;
case 45:
-#line 502 "p-exp.y"
+#line 427 "go-exp.y"
{ write_exp_elt_opcode (BINOP_BITWISE_IOR); }
break;
case 46:
-#line 506 "p-exp.y"
- { write_exp_elt_opcode (BINOP_ASSIGN); }
+#line 431 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_LOGICAL_AND); }
break;
case 47:
-#line 510 "p-exp.y"
- { write_exp_elt_opcode (OP_BOOL);
- write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
- current_type = parse_type->builtin_bool;
- write_exp_elt_opcode (OP_BOOL); }
+#line 435 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_LOGICAL_OR); }
break;
case 48:
-#line 517 "p-exp.y"
- { write_exp_elt_opcode (OP_BOOL);
- write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
- current_type = parse_type->builtin_bool;
- write_exp_elt_opcode (OP_BOOL); }
+#line 439 "go-exp.y"
+ { write_exp_elt_opcode (TERNOP_COND); }
break;
case 49:
-#line 524 "p-exp.y"
+#line 443 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_ASSIGN); }
+ break;
+
+ case 50:
+#line 447 "go-exp.y"
+ { write_exp_elt_opcode (BINOP_ASSIGN_MODIFY);
+ write_exp_elt_opcode (yyvsp[-1].opcode);
+ write_exp_elt_opcode (BINOP_ASSIGN_MODIFY); }
+ break;
+
+ case 51:
+#line 453 "go-exp.y"
{ write_exp_elt_opcode (OP_LONG);
write_exp_elt_type (yyvsp[0].typed_val_int.type);
- current_type = yyvsp[0].typed_val_int.type;
write_exp_elt_longcst ((LONGEST)(yyvsp[0].typed_val_int.val));
write_exp_elt_opcode (OP_LONG); }
break;
- case 50:
-#line 532 "p-exp.y"
+ case 52:
+#line 460 "go-exp.y"
+ {
+ struct stoken_vector vec;
+ vec.len = 1;
+ vec.tokens = &yyvsp[0].tsval;
+ write_exp_string_vector (yyvsp[0].tsval.type, &vec);
+ }
+ break;
+
+ case 53:
+#line 469 "go-exp.y"
{ YYSTYPE val;
- parse_number (yyvsp[0].ssym.stoken.ptr,
- yyvsp[0].ssym.stoken.length, 0, &val);
+ parse_number (yyvsp[0].ssym.stoken.ptr, yyvsp[0].ssym.stoken.length,
+ 0, &val);
write_exp_elt_opcode (OP_LONG);
write_exp_elt_type (val.typed_val_int.type);
- current_type = val.typed_val_int.type;
write_exp_elt_longcst ((LONGEST)
val.typed_val_int.val);
write_exp_elt_opcode (OP_LONG);
}
break;
- case 51:
-#line 546 "p-exp.y"
+ case 54:
+#line 482 "go-exp.y"
{ write_exp_elt_opcode (OP_DOUBLE);
write_exp_elt_type (yyvsp[0].typed_val_float.type);
- current_type = yyvsp[0].typed_val_float.type;
write_exp_elt_dblcst (yyvsp[0].typed_val_float.dval);
write_exp_elt_opcode (OP_DOUBLE); }
break;
- case 53:
-#line 559 "p-exp.y"
- { if (intvar) {
- struct value * val, * mark;
-
- mark = value_mark ();
- val = value_of_internalvar (parse_gdbarch,
- intvar);
- current_type = value_type (val);
- value_release_to_mark (mark);
- }
- }
- break;
-
- case 54:
-#line 572 "p-exp.y"
- { write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (parse_type->builtin_int);
- CHECK_TYPEDEF (yyvsp[-1].tval);
- write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval));
- write_exp_elt_opcode (OP_LONG); }
- break;
-
- case 55:
-#line 580 "p-exp.y"
- { write_exp_elt_opcode (UNOP_SIZEOF); }
- break;
-
case 56:
-#line 583 "p-exp.y"
- { /* C strings are converted into array constants with
- an explicit null byte added at the end. Thus
- the array upper bound is the string length.
- There is no such thing in C as a completely empty
- string. */
- char *sp = yyvsp[0].sval.ptr; int count = yyvsp[0].sval.length;
- while (count-- > 0)
- {
- write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (parse_type->builtin_char);
- write_exp_elt_longcst ((LONGEST)(*sp++));
- write_exp_elt_opcode (OP_LONG);
- }
- write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (parse_type->builtin_char);
- write_exp_elt_longcst ((LONGEST)'\0');
- write_exp_elt_opcode (OP_LONG);
- write_exp_elt_opcode (OP_ARRAY);
- write_exp_elt_longcst ((LONGEST) 0);
- write_exp_elt_longcst ((LONGEST) (yyvsp[0].sval.length));
- write_exp_elt_opcode (OP_ARRAY); }
+#line 492 "go-exp.y"
+ {
+ write_dollar_variable (yyvsp[0].sval);
+ }
break;
case 57:
-#line 608 "p-exp.y"
+#line 498 "go-exp.y"
{
- struct value * this_val;
- struct type * this_type;
- write_exp_elt_opcode (OP_THIS);
- write_exp_elt_opcode (OP_THIS);
- /* We need type of this. */
- this_val = value_of_this_silent (parse_language);
- if (this_val)
- this_type = value_type (this_val);
- else
- this_type = NULL;
- if (this_type)
- {
- if (TYPE_CODE (this_type) == TYPE_CODE_PTR)
- {
- this_type = TYPE_TARGET_TYPE (this_type);
- write_exp_elt_opcode (UNOP_IND);
- }
- }
-
- current_type = this_type;
+ /* TODO(dje): Go objects in structs. */
+ write_exp_elt_opcode (OP_LONG);
+ /* TODO(dje): What's the right type here? */
+ write_exp_elt_type (parse_type->builtin_unsigned_int);
+ CHECK_TYPEDEF (yyvsp[-1].tval);
+ write_exp_elt_longcst ((LONGEST) TYPE_LENGTH (yyvsp[-1].tval));
+ write_exp_elt_opcode (OP_LONG);
}
break;
case 58:
-#line 635 "p-exp.y"
+#line 510 "go-exp.y"
{
- if (yyvsp[0].ssym.sym != 0)
- yyval.bval = SYMBOL_BLOCK_VALUE (yyvsp[0].ssym.sym);
- else
- {
- struct symtab *tem =
- lookup_symtab (copy_name (yyvsp[0].ssym.stoken));
- if (tem)
- yyval.bval = BLOCKVECTOR_BLOCK (BLOCKVECTOR (tem),
- STATIC_BLOCK);
- else
- error (_("No file or function \"%s\"."),
- copy_name (yyvsp[0].ssym.stoken));
- }
+ /* TODO(dje): Go objects in structs. */
+ write_exp_elt_opcode (UNOP_SIZEOF);
}
break;
case 59:
-#line 653 "p-exp.y"
- { struct symbol *tem
- = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval,
- VAR_DOMAIN, (int *) NULL);
- if (!tem || SYMBOL_CLASS (tem) != LOC_BLOCK)
- error (_("No function \"%s\" in specified context."),
- copy_name (yyvsp[0].sval));
- yyval.bval = SYMBOL_BLOCK_VALUE (tem); }
+#line 517 "go-exp.y"
+ {
+ /* We copy the string here, and not in the
+ lexer, to guarantee that we do not leak a
+ string. */
+ /* Note that we NUL-terminate here, but just
+ for convenience. */
+ struct typed_stoken *vec = XNEW (struct typed_stoken);
+ yyval.svec.len = 1;
+ yyval.svec.tokens = vec;
+
+ vec->type = yyvsp[0].tsval.type;
+ vec->length = yyvsp[0].tsval.length;
+ vec->ptr = xmalloc (yyvsp[0].tsval.length + 1);
+ memcpy (vec->ptr, yyvsp[0].tsval.ptr, yyvsp[0].tsval.length + 1);
+ }
break;
case 60:
-#line 663 "p-exp.y"
- { struct symbol *sym;
- sym = lookup_symbol (copy_name (yyvsp[0].sval), yyvsp[-2].bval,
- VAR_DOMAIN, (int *) NULL);
- if (sym == 0)
- error (_("No symbol \"%s\" in specified context."),
- copy_name (yyvsp[0].sval));
-
- write_exp_elt_opcode (OP_VAR_VALUE);
- /* block_found is set by lookup_symbol. */
- write_exp_elt_block (block_found);
- write_exp_elt_sym (sym);
- write_exp_elt_opcode (OP_VAR_VALUE); }
+#line 534 "go-exp.y"
+ {
+ /* Note that we NUL-terminate here, but just
+ for convenience. */
+ char *p;
+ ++yyval.svec.len;
+ yyval.svec.tokens = xrealloc (yyval.svec.tokens,
+ yyval.svec.len * sizeof (struct typed_stoken));
+
+ p = xmalloc (yyvsp[0].tsval.length + 1);
+ memcpy (p, yyvsp[0].tsval.ptr, yyvsp[0].tsval.length + 1);
+
+ yyval.svec.tokens[yyval.svec.len - 1].type = yyvsp[0].tsval.type;
+ yyval.svec.tokens[yyval.svec.len - 1].length = yyvsp[0].tsval.length;
+ yyval.svec.tokens[yyval.svec.len - 1].ptr = p;
+ }
break;
case 61:
-#line 678 "p-exp.y"
+#line 552 "go-exp.y"
{
- struct type *type = yyvsp[-2].tval;
- if (TYPE_CODE (type) != TYPE_CODE_STRUCT
- && TYPE_CODE (type) != TYPE_CODE_UNION)
- error (_("`%s' is not defined as an aggregate type."),
- TYPE_NAME (type));
-
- write_exp_elt_opcode (OP_SCOPE);
- write_exp_elt_type (type);
- write_exp_string (yyvsp[0].sval);
- write_exp_elt_opcode (OP_SCOPE);
+ int i;
+
+ write_exp_string_vector (0 /*always utf8*/, &yyvsp[0].svec);
+ for (i = 0; i < yyvsp[0].svec.len; ++i)
+ xfree (yyvsp[0].svec.tokens[i].ptr);
+ xfree (yyvsp[0].svec.tokens);
}
break;
+ case 62:
+#line 563 "go-exp.y"
+ { write_exp_elt_opcode (OP_BOOL);
+ write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
+ write_exp_elt_opcode (OP_BOOL); }
+ break;
+
case 63:
-#line 694 "p-exp.y"
- {
- char *name = copy_name (yyvsp[0].sval);
- struct symbol *sym;
- struct minimal_symbol *msymbol;
+#line 569 "go-exp.y"
+ { write_exp_elt_opcode (OP_BOOL);
+ write_exp_elt_longcst ((LONGEST) yyvsp[0].lval);
+ write_exp_elt_opcode (OP_BOOL); }
+ break;
- sym =
- lookup_symbol (name, (const struct block *) NULL,
- VAR_DOMAIN, (int *) NULL);
- if (sym)
- {
- write_exp_elt_opcode (OP_VAR_VALUE);
- write_exp_elt_block (NULL);
- write_exp_elt_sym (sym);
- write_exp_elt_opcode (OP_VAR_VALUE);
- break;
- }
+ case 64:
+#line 575 "go-exp.y"
+ { struct symbol *sym = yyvsp[-1].ssym.sym;
- msymbol = lookup_minimal_symbol (name, NULL, NULL);
- if (msymbol != NULL)
- write_exp_msymbol (msymbol);
- else if (!have_full_symbols ()
- && !have_partial_symbols ())
- error (_("No symbol table is loaded. "
- "Use the \"file\" command."));
- else
- error (_("No symbol \"%s\" in current context."),
- name);
+ if (sym == NULL
+ || !SYMBOL_IS_ARGUMENT (sym)
+ || !symbol_read_needs_frame (sym))
+ error (_("@entry can be used only for function "
+ "parameters, not for \"%s\""),
+ copy_name (yyvsp[-1].ssym.stoken));
+
+ write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
+ write_exp_elt_sym (sym);
+ write_exp_elt_opcode (OP_VAR_ENTRY_VALUE);
}
break;
- case 64:
-#line 725 "p-exp.y"
+ case 65:
+#line 591 "go-exp.y"
{ struct symbol *sym = yyvsp[0].ssym.sym;
if (sym)
@@ -1876,35 +1752,12 @@ yyreduce:
write_exp_elt_block (NULL);
write_exp_elt_sym (sym);
write_exp_elt_opcode (OP_VAR_VALUE);
- current_type = sym->type; }
+ }
else if (yyvsp[0].ssym.is_a_field_of_this)
{
- struct value * this_val;
- struct type * this_type;
- /* Object pascal: it hangs off of `this'. Must
- not inadvertently convert from a method call
- to data ref. */
- if (innermost_block == 0
- || contained_in (block_found,
- innermost_block))
- innermost_block = block_found;
- write_exp_elt_opcode (OP_THIS);
- write_exp_elt_opcode (OP_THIS);
- write_exp_elt_opcode (STRUCTOP_PTR);
- write_exp_string (yyvsp[0].ssym.stoken);
- write_exp_elt_opcode (STRUCTOP_PTR);
- /* We need type of this. */
- this_val = value_of_this_silent (parse_language);
- if (this_val)
- this_type = value_type (this_val);
- else
- this_type = NULL;
- if (this_type)
- current_type = lookup_struct_elt_type (
- this_type,
- copy_name (yyvsp[0].ssym.stoken), 0);
- else
- current_type = NULL;
+ /* TODO(dje): Can we get here?
+ E.g., via a mix of c++ and go? */
+ gdb_assert_not_reached ("go with `this' field");
}
else
{
@@ -1926,53 +1779,27 @@ yyreduce:
}
break;
- case 67:
-#line 811 "p-exp.y"
+ case 66:
+#line 646 "go-exp.y"
{ yyval.tval = lookup_pointer_type (yyvsp[0].tval); }
break;
- case 68:
-#line 813 "p-exp.y"
+ case 67:
+#line 648 "go-exp.y"
{ yyval.tval = yyvsp[0].tsym.type; }
break;
- case 69:
-#line 815 "p-exp.y"
- { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval),
- expression_context_block); }
- break;
-
- case 70:
-#line 818 "p-exp.y"
- { yyval.tval = lookup_struct (copy_name (yyvsp[0].sval),
- expression_context_block); }
- break;
-
- case 71:
-#line 825 "p-exp.y"
- { yyval.sval = yyvsp[0].ssym.stoken; }
- break;
-
- case 72:
-#line 826 "p-exp.y"
- { yyval.sval = yyvsp[0].ssym.stoken; }
- break;
-
- case 73:
-#line 827 "p-exp.y"
- { yyval.sval = yyvsp[0].tsym.stoken; }
- break;
-
- case 74:
-#line 828 "p-exp.y"
- { yyval.sval = yyvsp[0].ssym.stoken; }
+ case 68:
+#line 655 "go-exp.y"
+ { yyval.tval = builtin_go_type (parse_gdbarch)
+ ->builtin_uint8; }
break;
}
/* Line 1000 of yacc.c. */
-#line 1976 "p-exp.c"
+#line 1803 "go-exp.c"
yyvsp -= yylen;
yyssp -= yylen;
@@ -2197,14 +2024,35 @@ yyreturn:
}
-#line 842 "p-exp.y"
+#line 677 "go-exp.y"
+
+/* Wrapper on parse_c_float to get the type right for Go. */
+
+static int
+parse_go_float (struct gdbarch *gdbarch, const char *p, int len,
+ DOUBLEST *d, struct type **t)
+{
+ int result = parse_c_float (gdbarch, p, len, d, t);
+ const struct builtin_type *builtin_types = builtin_type (gdbarch);
+ const struct builtin_go_type *builtin_go_types = builtin_go_type (gdbarch);
+
+ if (*t == builtin_types->builtin_float)
+ *t = builtin_go_types->builtin_float32;
+ else if (*t == builtin_types->builtin_double)
+ *t = builtin_go_types->builtin_float64;
+
+ return result;
+}
/* Take care of parsing a number (anything that starts with a digit).
Set yylval and return the token type; update lexptr.
LEN is the number of characters in it. */
-/*** Needs some error checking for the float case ***/
+/* FIXME: Needs some error checking for the float case. */
+/* FIXME(dje): IWBN to use c-exp.y's parse_number if we could.
+ That will require moving the guts into a function that we both call
+ as our YYSTYPE is different than c-exp.y's */
static int
parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
@@ -2232,9 +2080,9 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
if (parsed_float)
{
- if (! parse_c_float (parse_gdbarch, p, len,
- &putithere->typed_val_float.dval,
- &putithere->typed_val_float.type))
+ if (! parse_go_float (parse_gdbarch, p, len,
+ &putithere->typed_val_float.dval,
+ &putithere->typed_val_float.type))
return ERROR;
return FLOAT;
}
@@ -2253,6 +2101,16 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
}
break;
+ case 'b':
+ case 'B':
+ if (len >= 3)
+ {
+ p += 2;
+ base = 2;
+ len -= 2;
+ }
+ break;
+
case 't':
case 'T':
case 'd':
@@ -2389,36 +2247,81 @@ parse_number (char *p, int len, int parsed_float, YYSTYPE *putithere)
return INT;
}
+/* Temporary obstack used for holding strings. */
+static struct obstack tempbuf;
+static int tempbuf_init;
-struct type_push
+/* Parse a string or character literal from TOKPTR. The string or
+ character may be wide or unicode. *OUTPTR is set to just after the
+ end of the literal in the input string. The resulting token is
+ stored in VALUE. This returns a token value, either STRING or
+ CHAR, depending on what was parsed. *HOST_CHARS is set to the
+ number of host characters in the literal. */
+
+static int
+parse_string_or_char (char *tokptr, char **outptr, struct typed_stoken *value,
+ int *host_chars)
{
- struct type *stored;
- struct type_push *next;
-};
+ int quote;
+
+ /* Build the gdb internal form of the input string in tempbuf. Note
+ that the buffer is null byte terminated *only* for the
+ convenience of debugging gdb itself and printing the buffer
+ contents when the buffer contains no embedded nulls. Gdb does
+ not depend upon the buffer being null byte terminated, it uses
+ the length string instead. This allows gdb to handle C strings
+ (as well as strings in other languages) with embedded null
+ bytes */
+
+ if (!tempbuf_init)
+ tempbuf_init = 1;
+ else
+ obstack_free (&tempbuf, NULL);
+ obstack_init (&tempbuf);
-static struct type_push *tp_top = NULL;
+ /* Skip the quote. */
+ quote = *tokptr;
+ ++tokptr;
-static void
-push_current_type (void)
-{
- struct type_push *tpnew;
- tpnew = (struct type_push *) xmalloc (sizeof (struct type_push));
- tpnew->next = tp_top;
- tpnew->stored = current_type;
- current_type = NULL;
- tp_top = tpnew;
-}
+ *host_chars = 0;
-static void
-pop_current_type (void)
-{
- struct type_push *tp = tp_top;
- if (tp)
+ while (*tokptr)
{
- current_type = tp->stored;
- tp_top = tp->next;
- xfree (tp);
+ char c = *tokptr;
+ if (c == '\\')
+ {
+ ++tokptr;
+ *host_chars += c_parse_escape (&tokptr, &tempbuf);
+ }
+ else if (c == quote)
+ break;
+ else
+ {
+ obstack_1grow (&tempbuf, c);
+ ++tokptr;
+ /* FIXME: this does the wrong thing with multi-byte host
+ characters. We could use mbrlen here, but that would
+ make "set host-charset" a bit less useful. */
+ ++*host_chars;
+ }
}
+
+ if (*tokptr != quote)
+ {
+ if (quote == '"')
+ error (_("Unterminated string in expression."));
+ else
+ error (_("Unmatched single quote."));
+ }
+ ++tokptr;
+
+ value->type = C_STRING | (quote == '\'' ? C_CHAR : 0); /*FIXME*/
+ value->ptr = obstack_base (&tempbuf);
+ value->length = obstack_object_size (&tempbuf);
+
+ *outptr = tokptr;
+
+ return quote == '\'' ? CHAR : STRING;
}
struct token
@@ -2430,106 +2333,116 @@ struct token
static const struct token tokentab3[] =
{
- {"shr", RSH, BINOP_END},
- {"shl", LSH, BINOP_END},
- {"and", ANDAND, BINOP_END},
- {"div", DIV, BINOP_END},
- {"not", NOT, BINOP_END},
- {"mod", MOD, BINOP_END},
- {"inc", INCREMENT, BINOP_END},
- {"dec", DECREMENT, BINOP_END},
- {"xor", XOR, BINOP_END}
+ {">>=", ASSIGN_MODIFY, BINOP_RSH},
+ {"<<=", ASSIGN_MODIFY, BINOP_LSH},
+ /*{"&^=", ASSIGN_MODIFY, BINOP_BITWISE_ANDNOT}, TODO */
+ {"...", DOTDOTDOT, OP_NULL},
};
static const struct token tokentab2[] =
{
- {"or", OR, BINOP_END},
- {"<>", NOTEQUAL, BINOP_END},
+ {"+=", ASSIGN_MODIFY, BINOP_ADD},
+ {"-=", ASSIGN_MODIFY, BINOP_SUB},
+ {"*=", ASSIGN_MODIFY, BINOP_MUL},
+ {"/=", ASSIGN_MODIFY, BINOP_DIV},
+ {"%=", ASSIGN_MODIFY, BINOP_REM},
+ {"|=", ASSIGN_MODIFY, BINOP_BITWISE_IOR},
+ {"&=", ASSIGN_MODIFY, BINOP_BITWISE_AND},
+ {"^=", ASSIGN_MODIFY, BINOP_BITWISE_XOR},
+ {"++", INCREMENT, BINOP_END},
+ {"--", DECREMENT, BINOP_END},
+ /*{"->", RIGHT_ARROW, BINOP_END}, Doesn't exist in Go. */
+ {"<-", LEFT_ARROW, BINOP_END},
+ {"&&", ANDAND, BINOP_END},
+ {"||", OROR, BINOP_END},
+ {"<<", LSH, BINOP_END},
+ {">>", RSH, BINOP_END},
+ {"==", EQUAL, BINOP_END},
+ {"!=", NOTEQUAL, BINOP_END},
{"<=", LEQ, BINOP_END},
{">=", GEQ, BINOP_END},
- {":=", ASSIGN, BINOP_END},
- {"::", COLONCOLON, BINOP_END} };
+ /*{"&^", ANDNOT, BINOP_END}, TODO */
+ };
-/* Allocate uppercased var: */
-/* make an uppercased copy of tokstart. */
-static char * uptok (tokstart, namelen)
- char *tokstart;
- int namelen;
-{
- int i;
- char *uptokstart = (char *)xmalloc(namelen+1);
- for (i = 0;i <= namelen;i++)
- {
- if ((tokstart[i]>='a' && tokstart[i]<='z'))
- uptokstart[i] = tokstart[i]-('a'-'A');
- else
- uptokstart[i] = tokstart[i];
- }
- uptokstart[namelen]='\0';
- return uptokstart;
-}
+/* Identifier-like tokens. */
+static const struct token ident_tokens[] =
+ {
+ {"true", TRUE_KEYWORD, OP_NULL},
+ {"false", FALSE_KEYWORD, OP_NULL},
+ {"nil", NIL_KEYWORD, OP_NULL},
+ {"const", CONST_KEYWORD, OP_NULL},
+ {"struct", STRUCT_KEYWORD, OP_NULL},
+ {"type", TYPE_KEYWORD, OP_NULL},
+ {"interface", INTERFACE_KEYWORD, OP_NULL},
+ {"chan", CHAN_KEYWORD, OP_NULL},
+ {"byte", BYTE_KEYWORD, OP_NULL}, /* An alias of uint8. */
+ {"len", LEN_KEYWORD, OP_NULL},
+ {"cap", CAP_KEYWORD, OP_NULL},
+ {"new", NEW_KEYWORD, OP_NULL},
+ {"iota", IOTA_KEYWORD, OP_NULL},
+ };
+
+/* This is set if a NAME token appeared at the very end of the input
+ string, with no whitespace separating the name from the EOF. This
+ is used only when parsing to do field name completion. */
+static int saw_name_at_eof;
/* This is set if the previously-returned token was a structure
- operator '.'. This is used only when parsing to
+ operator -- either '.' or ARROW. This is used only when parsing to
do field name completion. */
static int last_was_structop;
/* Read one token, getting characters through lexptr. */
static int
-yylex (void)
+lex_one_token (void)
{
int c;
int namelen;
unsigned int i;
char *tokstart;
- char *uptokstart;
- char *tokptr;
- int explen, tempbufindex;
- static char *tempbuf;
- static int tempbufsize;
int saw_structop = last_was_structop;
+ char *copy;
last_was_structop = 0;
+
retry:
prev_lexptr = lexptr;
tokstart = lexptr;
- explen = strlen (lexptr);
/* See if it is a special token of length 3. */
- if (explen > 2)
- for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
- if (strncasecmp (tokstart, tokentab3[i].operator, 3) == 0
- && (!isalpha (tokentab3[i].operator[0]) || explen == 3
- || (!isalpha (tokstart[3])
- && !isdigit (tokstart[3]) && tokstart[3] != '_')))
- {
- lexptr += 3;
- yylval.opcode = tokentab3[i].opcode;
- return tokentab3[i].token;
- }
+ for (i = 0; i < sizeof (tokentab3) / sizeof (tokentab3[0]); i++)
+ if (strncmp (tokstart, tokentab3[i].operator, 3) == 0)
+ {
+ lexptr += 3;
+ yylval.opcode = tokentab3[i].opcode;
+ return tokentab3[i].token;
+ }
/* See if it is a special token of length 2. */
- if (explen > 1)
for (i = 0; i < sizeof (tokentab2) / sizeof (tokentab2[0]); i++)
- if (strncasecmp (tokstart, tokentab2[i].operator, 2) == 0
- && (!isalpha (tokentab2[i].operator[0]) || explen == 2
- || (!isalpha (tokstart[2])
- && !isdigit (tokstart[2]) && tokstart[2] != '_')))
- {
- lexptr += 2;
- yylval.opcode = tokentab2[i].opcode;
- return tokentab2[i].token;
- }
+ if (strncmp (tokstart, tokentab2[i].operator, 2) == 0)
+ {
+ lexptr += 2;
+ yylval.opcode = tokentab2[i].opcode;
+ /* NOTE: -> doesn't exist in Go, so we don't need to watch for
+ setting last_was_structop here. */
+ return tokentab2[i].token;
+ }
switch (c = *tokstart)
{
case 0:
- if (saw_structop && search_field)
+ if (saw_name_at_eof)
+ {
+ saw_name_at_eof = 0;
+ return COMPLETE;
+ }
+ else if (saw_structop)
return COMPLETE;
else
- return 0;
+ return 0;
case ' ':
case '\t':
@@ -2537,43 +2450,13 @@ yylex (void)
lexptr++;
goto retry;
- case '\'':
- /* We either have a character constant ('0' or '\177' for example)
- or we have a quoted symbol reference ('foo(int,int)' in object pascal
- for example). */
- lexptr++;
- c = *lexptr++;
- if (c == '\\')
- c = parse_escape (parse_gdbarch, &lexptr);
- else if (c == '\'')
- error (_("Empty character constant."));
-
- yylval.typed_val_int.val = c;
- yylval.typed_val_int.type = parse_type->builtin_char;
-
- c = *lexptr++;
- if (c != '\'')
- {
- namelen = skip_quoted (tokstart) - tokstart;
- if (namelen > 2)
- {
- lexptr = tokstart + namelen;
- if (lexptr[-1] != '\'')
- error (_("Unmatched single quote."));
- namelen -= 2;
- tokstart++;
- uptokstart = uptok(tokstart,namelen);
- goto tryname;
- }
- error (_("Invalid character constant."));
- }
- return INT;
-
+ case '[':
case '(':
paren_depth++;
lexptr++;
return c;
+ case ']':
case ')':
if (paren_depth == 0)
return 0;
@@ -2582,7 +2465,8 @@ yylex (void)
return c;
case ',':
- if (comma_terminates && paren_depth == 0)
+ if (comma_terminates
+ && paren_depth == 0)
return 0;
lexptr++;
return c;
@@ -2593,9 +2477,8 @@ yylex (void)
{
if (in_parse_field)
last_was_structop = 1;
- goto symbol; /* Nope, must be a symbol. */
+ goto symbol; /* Nope, must be a symbol. */
}
-
/* FALL THRU into number case. */
case '0':
@@ -2619,12 +2502,6 @@ yylex (void)
p += 2;
hex = 1;
}
- else if (c == '0' && (p[1]=='t' || p[1]=='T'
- || p[1]=='d' || p[1]=='D'))
- {
- p += 2;
- hex = 0;
- }
for (;; ++p)
{
@@ -2649,8 +2526,7 @@ yylex (void)
&& (*p < 'A' || *p > 'Z')))
break;
}
- toktype = parse_number (tokstart,
- p - tokstart, got_dot | got_e, &yylval);
+ toktype = parse_number (tokstart, p - tokstart, got_dot|got_e, &yylval);
if (toktype == ERROR)
{
char *err_copy = (char *) alloca (p - tokstart + 1);
@@ -2663,20 +2539,33 @@ yylex (void)
return toktype;
}
+ case '@':
+ {
+ char *p = &tokstart[1];
+ size_t len = strlen ("entry");
+
+ while (isspace (*p))
+ p++;
+ if (strncmp (p, "entry", len) == 0 && !isalnum (p[len])
+ && p[len] != '_')
+ {
+ lexptr = &p[len];
+ return ENTRY;
+ }
+ }
+ /* FALLTHRU */
case '+':
case '-':
case '*':
case '/':
+ case '%':
case '|':
case '&':
case '^':
case '~':
case '!':
- case '@':
case '<':
case '>':
- case '[':
- case ']':
case '?':
case ':':
case '=':
@@ -2686,57 +2575,28 @@ yylex (void)
lexptr++;
return c;
+ case '\'':
case '"':
-
- /* Build the gdb internal form of the input string in tempbuf,
- translating any standard C escape forms seen. Note that the
- buffer is null byte terminated *only* for the convenience of
- debugging gdb itself and printing the buffer contents when
- the buffer contains no embedded nulls. Gdb does not depend
- upon the buffer being null byte terminated, it uses the length
- string instead. This allows gdb to handle C strings (as well
- as strings in other languages) with embedded null bytes. */
-
- tokptr = ++tokstart;
- tempbufindex = 0;
-
- do {
- /* Grow the static temp buffer if necessary, including allocating
- the first one on demand. */
- if (tempbufindex + 1 >= tempbufsize)
- {
- tempbuf = (char *) xrealloc (tempbuf, tempbufsize += 64);
- }
-
- switch (*tokptr)
+ case '`':
+ {
+ int host_len;
+ int result = parse_string_or_char (tokstart, &lexptr, &yylval.tsval,
+ &host_len);
+ if (result == CHAR)
{
- case '\0':
- case '"':
- /* Do nothing, loop will terminate. */
- break;
- case '\\':
- tokptr++;
- c = parse_escape (parse_gdbarch, &tokptr);
- if (c == -1)
+ if (host_len == 0)
+ error (_("Empty character constant."));
+ else if (host_len > 2 && c == '\'')
{
- continue;
+ ++tokstart;
+ namelen = lexptr - tokstart - 1;
+ goto tryname;
}
- tempbuf[tempbufindex++] = c;
- break;
- default:
- tempbuf[tempbufindex++] = *tokptr++;
- break;
+ else if (host_len > 1)
+ error (_("Invalid character constant."));
}
- } while ((*tokptr != '"') && (*tokptr != '\0'));
- if (*tokptr++ != '"')
- {
- error (_("Unterminated string in expression."));
- }
- tempbuf[tempbufindex] = '\0'; /* See note above. */
- yylval.sval.ptr = tempbuf;
- yylval.sval.length = tempbufindex;
- lexptr = tokptr;
- return (STRING);
+ return result;
+ }
}
if (!(c == '_' || c == '$'
@@ -2748,351 +2608,364 @@ yylex (void)
namelen = 0;
for (c = tokstart[namelen];
(c == '_' || c == '$' || (c >= '0' && c <= '9')
- || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || c == '<');)
+ || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'));)
{
- /* Template parameter lists are part of the name.
- FIXME: This mishandles `print $a<4&&$a>3'. */
- if (c == '<')
- {
- int i = namelen;
- int nesting_level = 1;
- while (tokstart[++i])
- {
- if (tokstart[i] == '<')
- nesting_level++;
- else if (tokstart[i] == '>')
- {
- if (--nesting_level == 0)
- break;
- }
- }
- if (tokstart[i] == '>')
- namelen = i;
- else
- break;
- }
-
- /* do NOT uppercase internals because of registers !!! */
c = tokstart[++namelen];
}
- uptokstart = uptok(tokstart,namelen);
-
- /* The token "if" terminates the expression and is NOT
- removed from the input stream. */
- if (namelen == 2 && uptokstart[0] == 'I' && uptokstart[1] == 'F')
+ /* The token "if" terminates the expression and is NOT removed from
+ the input stream. It doesn't count if it appears in the
+ expansion of a macro. */
+ if (namelen == 2
+ && tokstart[0] == 'i'
+ && tokstart[1] == 'f')
{
- xfree (uptokstart);
return 0;
}
+ /* For the same reason (breakpoint conditions), "thread N"
+ terminates the expression. "thread" could be an identifier, but
+ an identifier is never followed by a number without intervening
+ punctuation.
+ Handle abbreviations of these, similarly to
+ breakpoint.c:find_condition_and_thread.
+ TODO: Watch for "goroutine" here? */
+ if (namelen >= 1
+ && strncmp (tokstart, "thread", namelen) == 0
+ && (tokstart[namelen] == ' ' || tokstart[namelen] == '\t'))
+ {
+ char *p = tokstart + namelen + 1;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ if (*p >= '0' && *p <= '9')
+ return 0;
+ }
+
lexptr += namelen;
tryname:
- /* Catch specific keywords. Should be done with a data structure. */
- switch (namelen)
+ yylval.sval.ptr = tokstart;
+ yylval.sval.length = namelen;
+
+ /* Catch specific keywords. */
+ copy = copy_name (yylval.sval);
+ for (i = 0; i < sizeof (ident_tokens) / sizeof (ident_tokens[0]); i++)
+ if (strcmp (copy, ident_tokens[i].operator) == 0)
+ {
+ /* It is ok to always set this, even though we don't always
+ strictly need to. */
+ yylval.opcode = ident_tokens[i].opcode;
+ return ident_tokens[i].token;
+ }
+
+ if (*tokstart == '$')
+ return DOLLAR_VARIABLE;
+
+ if (in_parse_field && *lexptr == '\0')
+ saw_name_at_eof = 1;
+ return NAME;
+}
+
+/* An object of this type is pushed on a FIFO by the "outer" lexer. */
+typedef struct
+{
+ int token;
+ YYSTYPE value;
+} token_and_value;
+
+DEF_VEC_O (token_and_value);
+
+/* A FIFO of tokens that have been read but not yet returned to the
+ parser. */
+static VEC (token_and_value) *token_fifo;
+
+/* Non-zero if the lexer should return tokens from the FIFO. */
+static int popping;
+
+/* Temporary storage for yylex; this holds symbol names as they are
+ built up. */
+static struct obstack name_obstack;
+
+/* Build "package.name" in name_obstack.
+ For convenience of the caller, the name is NUL-terminated,
+ but the NUL is not included in the recorded length. */
+
+static struct stoken
+build_packaged_name (const char *package, int package_len,
+ const char *name, int name_len)
+{
+ struct stoken result;
+
+ obstack_free (&name_obstack, obstack_base (&name_obstack));
+ obstack_grow (&name_obstack, package, package_len);
+ obstack_grow_str (&name_obstack, ".");
+ obstack_grow (&name_obstack, name, name_len);
+ obstack_grow (&name_obstack, "", 1);
+ result.ptr = obstack_base (&name_obstack);
+ result.length = obstack_object_size (&name_obstack) - 1;
+
+ return result;
+}
+
+/* Return non-zero if NAME is a package name.
+ BLOCK is the scope in which to interpret NAME; this can be NULL
+ to mean the global scope. */
+
+static int
+package_name_p (const char *name, struct block *block)
+{
+ struct symbol *sym;
+ int is_a_field_of_this;
+
+ sym = lookup_symbol (name, block, STRUCT_DOMAIN, &is_a_field_of_this);
+
+ if (sym
+ && SYMBOL_CLASS (sym) == LOC_TYPEDEF
+ && TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_MODULE)
+ return 1;
+
+ return 0;
+}
+
+/* Classify a (potential) function in the "unsafe" package.
+ We fold these into "keywords" to keep things simple, at least until
+ something more complex is warranted. */
+
+static int
+classify_unsafe_function (struct stoken function_name)
+{
+ char *copy = copy_name (function_name);
+
+ if (strcmp (copy, "Sizeof") == 0)
{
- case 6:
- if (strcmp (uptokstart, "OBJECT") == 0)
- {
- xfree (uptokstart);
- return CLASS;
- }
- if (strcmp (uptokstart, "RECORD") == 0)
- {
- xfree (uptokstart);
- return STRUCT;
- }
- if (strcmp (uptokstart, "SIZEOF") == 0)
- {
- xfree (uptokstart);
- return SIZEOF;
- }
- break;
- case 5:
- if (strcmp (uptokstart, "CLASS") == 0)
- {
- xfree (uptokstart);
- return CLASS;
- }
- if (strcmp (uptokstart, "FALSE") == 0)
- {
- yylval.lval = 0;
- xfree (uptokstart);
- return FALSEKEYWORD;
- }
- break;
- case 4:
- if (strcmp (uptokstart, "TRUE") == 0)
- {
- yylval.lval = 1;
- xfree (uptokstart);
- return TRUEKEYWORD;
- }
- if (strcmp (uptokstart, "SELF") == 0)
- {
- /* Here we search for 'this' like
- inserted in FPC stabs debug info. */
- static const char this_name[] = "this";
+ yylval.sval = function_name;
+ return SIZEOF_KEYWORD;
+ }
- if (lookup_symbol (this_name, expression_context_block,
- VAR_DOMAIN, (int *) NULL))
- {
- xfree (uptokstart);
- return THIS;
- }
- }
- break;
- default:
- break;
+ error (_("Unknown function in `unsafe' package: %s"), copy);
+}
+
+/* Classify token(s) "name1.name2" where name1 is known to be a package.
+ The contents of the token are in `yylval'.
+ Updates yylval and returns the new token type.
+
+ The result is one of NAME, NAME_OR_INT, or TYPENAME. */
+
+static int
+classify_packaged_name (struct block *block)
+{
+ char *copy;
+ struct symbol *sym;
+ int is_a_field_of_this = 0;
+
+ copy = copy_name (yylval.sval);
+
+ sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
+
+ if (sym)
+ {
+ yylval.ssym.sym = sym;
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this;
}
- yylval.sval.ptr = tokstart;
- yylval.sval.length = namelen;
+ return NAME;
+}
- if (*tokstart == '$')
+/* Classify a NAME token.
+ The contents of the token are in `yylval'.
+ Updates yylval and returns the new token type.
+ BLOCK is the block in which lookups start; this can be NULL
+ to mean the global scope.
+
+ The result is one of NAME, NAME_OR_INT, or TYPENAME. */
+
+static int
+classify_name (struct block *block)
+{
+ struct type *type;
+ struct symbol *sym;
+ char *copy;
+ int is_a_field_of_this = 0;
+
+ copy = copy_name (yylval.sval);
+
+ /* Try primitive types first so they win over bad/weird debug info. */
+ type = language_lookup_primitive_type_by_name (parse_language,
+ parse_gdbarch, copy);
+ if (type != NULL)
{
- char c;
- /* $ is the normal prefix for pascal hexadecimal values
- but this conflicts with the GDB use for debugger variables
- so in expression to enter hexadecimal values
- we still need to use C syntax with 0xff */
- write_dollar_variable (yylval.sval);
- c = tokstart[namelen];
- tokstart[namelen] = 0;
- intvar = lookup_only_internalvar (++tokstart);
- --tokstart;
- tokstart[namelen] = c;
- xfree (uptokstart);
- return VARIABLE;
+ /* NOTE: We take advantage of the fact that yylval coming in was a
+ NAME, and that struct ttype is a compatible extension of struct
+ stoken, so yylval.tsym.stoken is already filled in. */
+ yylval.tsym.type = type;
+ return TYPENAME;
}
- /* Use token-type BLOCKNAME for symbols that happen to be defined as
- functions or symtabs. If this is not so, then ...
- Use token-type TYPENAME for symbols that happen to be defined
- currently as names of types; NAME for other symbols.
- The caller is not constrained to care about the distinction. */
- {
- char *tmp = copy_name (yylval.sval);
- struct symbol *sym;
- int is_a_field_of_this = 0;
- int is_a_field = 0;
- int hextype;
-
-
- if (search_field && current_type)
- is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
- if (is_a_field || in_parse_field)
- sym = NULL;
- else
- sym = lookup_symbol (tmp, expression_context_block,
- VAR_DOMAIN, &is_a_field_of_this);
- /* second chance uppercased (as Free Pascal does). */
- if (!sym && !is_a_field_of_this && !is_a_field)
- {
- for (i = 0; i <= namelen; i++)
- {
- if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
- tmp[i] -= ('a'-'A');
- }
- if (search_field && current_type)
- is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
- if (is_a_field || in_parse_field)
- sym = NULL;
- else
- sym = lookup_symbol (tmp, expression_context_block,
- VAR_DOMAIN, &is_a_field_of_this);
- if (sym || is_a_field_of_this || is_a_field)
- for (i = 0; i <= namelen; i++)
- {
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
- tokstart[i] -= ('a'-'A');
- }
- }
- /* Third chance Capitalized (as GPC does). */
- if (!sym && !is_a_field_of_this && !is_a_field)
- {
- for (i = 0; i <= namelen; i++)
- {
- if (i == 0)
- {
- if ((tmp[i] >= 'a' && tmp[i] <= 'z'))
- tmp[i] -= ('a'-'A');
- }
- else
- if ((tmp[i] >= 'A' && tmp[i] <= 'Z'))
- tmp[i] -= ('A'-'a');
- }
- if (search_field && current_type)
- is_a_field = (lookup_struct_elt_type (current_type, tmp, 1) != NULL);
- if (is_a_field || in_parse_field)
- sym = NULL;
- else
- sym = lookup_symbol (tmp, expression_context_block,
- VAR_DOMAIN, &is_a_field_of_this);
- if (sym || is_a_field_of_this || is_a_field)
- for (i = 0; i <= namelen; i++)
- {
- if (i == 0)
- {
- if ((tokstart[i] >= 'a' && tokstart[i] <= 'z'))
- tokstart[i] -= ('a'-'A');
- }
- else
- if ((tokstart[i] >= 'A' && tokstart[i] <= 'Z'))
- tokstart[i] -= ('A'-'a');
- }
- }
+ /* TODO: What about other types? */
- if (is_a_field)
- {
- tempbuf = (char *) xrealloc (tempbuf, namelen + 1);
- strncpy (tempbuf, tokstart, namelen); tempbuf [namelen] = 0;
- yylval.sval.ptr = tempbuf;
- yylval.sval.length = namelen;
- xfree (uptokstart);
- return FIELDNAME;
- }
- /* Call lookup_symtab, not lookup_partial_symtab, in case there are
- no psymtabs (coff, xcoff, or some future change to blow away the
- psymtabs once once symbols are read). */
- if ((sym && SYMBOL_CLASS (sym) == LOC_BLOCK)
- || lookup_symtab (tmp))
- {
- yylval.ssym.sym = sym;
- yylval.ssym.is_a_field_of_this = is_a_field_of_this;
- xfree (uptokstart);
- return BLOCKNAME;
- }
- if (sym && SYMBOL_CLASS (sym) == LOC_TYPEDEF)
- {
-#if 1
- /* Despite the following flaw, we need to keep this code enabled.
- Because we can get called from check_stub_method, if we don't
- handle nested types then it screws many operations in any
- program which uses nested types. */
- /* In "A::x", if x is a member function of A and there happens
- to be a type (nested or not, since the stabs don't make that
- distinction) named x, then this code incorrectly thinks we
- are dealing with nested types rather than a member function. */
-
- char *p;
- char *namestart;
- struct symbol *best_sym;
-
- /* Look ahead to detect nested types. This probably should be
- done in the grammar, but trying seemed to introduce a lot
- of shift/reduce and reduce/reduce conflicts. It's possible
- that it could be done, though. Or perhaps a non-grammar, but
- less ad hoc, approach would work well. */
-
- /* Since we do not currently have any way of distinguishing
- a nested type from a non-nested one (the stabs don't tell
- us whether a type is nested), we just ignore the
- containing type. */
-
- p = lexptr;
- best_sym = sym;
- while (1)
- {
- /* Skip whitespace. */
- while (*p == ' ' || *p == '\t' || *p == '\n')
- ++p;
- if (*p == ':' && p[1] == ':')
- {
- /* Skip the `::'. */
- p += 2;
- /* Skip whitespace. */
- while (*p == ' ' || *p == '\t' || *p == '\n')
- ++p;
- namestart = p;
- while (*p == '_' || *p == '$' || (*p >= '0' && *p <= '9')
- || (*p >= 'a' && *p <= 'z')
- || (*p >= 'A' && *p <= 'Z'))
- ++p;
- if (p != namestart)
- {
- struct symbol *cur_sym;
- /* As big as the whole rest of the expression, which is
- at least big enough. */
- char *ncopy = alloca (strlen (tmp)+strlen (namestart)+3);
- char *tmp1;
-
- tmp1 = ncopy;
- memcpy (tmp1, tmp, strlen (tmp));
- tmp1 += strlen (tmp);
- memcpy (tmp1, "::", 2);
- tmp1 += 2;
- memcpy (tmp1, namestart, p - namestart);
- tmp1[p - namestart] = '\0';
- cur_sym = lookup_symbol (ncopy, expression_context_block,
- VAR_DOMAIN, (int *) NULL);
- if (cur_sym)
- {
- if (SYMBOL_CLASS (cur_sym) == LOC_TYPEDEF)
- {
- best_sym = cur_sym;
- lexptr = p;
- }
- else
- break;
- }
- else
- break;
- }
- else
- break;
- }
- else
- break;
- }
+ sym = lookup_symbol (copy, block, VAR_DOMAIN, &is_a_field_of_this);
- yylval.tsym.type = SYMBOL_TYPE (best_sym);
-#else /* not 0 */
- yylval.tsym.type = SYMBOL_TYPE (sym);
-#endif /* not 0 */
- xfree (uptokstart);
- return TYPENAME;
- }
- yylval.tsym.type
- = language_lookup_primitive_type_by_name (parse_language,
- parse_gdbarch, tmp);
- if (yylval.tsym.type != NULL)
- {
- xfree (uptokstart);
- return TYPENAME;
- }
+ if (sym)
+ {
+ yylval.ssym.sym = sym;
+ yylval.ssym.is_a_field_of_this = is_a_field_of_this;
+ return NAME;
+ }
+
+ /* If we didn't find a symbol, look again in the current package.
+ This is to, e.g., make "p global_var" work without having to specify
+ the package name. We intentionally only looks for objects in the
+ current package. */
+
+ {
+ char *current_package_name = go_block_package_name (block);
- /* Input names that aren't symbols but ARE valid hex numbers,
- when the input radix permits them, can be names or numbers
- depending on the parse. Note we support radixes > 16 here. */
- if (!sym
- && ((tokstart[0] >= 'a' && tokstart[0] < 'a' + input_radix - 10)
- || (tokstart[0] >= 'A' && tokstart[0] < 'A' + input_radix - 10)))
+ if (current_package_name != NULL)
{
- YYSTYPE newlval; /* Its value is ignored. */
- hextype = parse_number (tokstart, namelen, 0, &newlval);
- if (hextype == INT)
+ struct stoken sval =
+ build_packaged_name (current_package_name,
+ strlen (current_package_name),
+ copy, strlen (copy));
+
+ xfree (current_package_name);
+ sym = lookup_symbol (sval.ptr, block, VAR_DOMAIN,
+ &is_a_field_of_this);
+ if (sym)
{
+ yylval.ssym.stoken = sval;
yylval.ssym.sym = sym;
yylval.ssym.is_a_field_of_this = is_a_field_of_this;
- xfree (uptokstart);
- return NAME_OR_INT;
+ return NAME;
}
}
-
- xfree(uptokstart);
- /* Any other kind of symbol. */
- yylval.ssym.sym = sym;
- yylval.ssym.is_a_field_of_this = is_a_field_of_this;
- return NAME;
}
+
+ /* Input names that aren't symbols but ARE valid hex numbers, when
+ the input radix permits them, can be names or numbers depending
+ on the parse. Note we support radixes > 16 here. */
+ if ((copy[0] >= 'a' && copy[0] < 'a' + input_radix - 10)
+ || (copy[0] >= 'A' && copy[0] < 'A' + input_radix - 10))
+ {
+ YYSTYPE newlval; /* Its value is ignored. */
+ int hextype = parse_number (copy, yylval.sval.length, 0, &newlval);
+ if (hextype == INT)
+ {
+ yylval.ssym.sym = NULL;
+ yylval.ssym.is_a_field_of_this = 0;
+ return NAME_OR_INT;
+ }
+ }
+
+ yylval.ssym.sym = NULL;
+ yylval.ssym.is_a_field_of_this = 0;
+ return NAME;
+}
+
+/* This is taken from c-exp.y mostly to get something working.
+ The basic structure has been kept because we may yet need some of it. */
+
+static int
+yylex (void)
+{
+ token_and_value current, next;
+
+ if (popping && !VEC_empty (token_and_value, token_fifo))
+ {
+ token_and_value tv = *VEC_index (token_and_value, token_fifo, 0);
+ VEC_ordered_remove (token_and_value, token_fifo, 0);
+ yylval = tv.value;
+ /* There's no need to fall through to handle package.name
+ as that can never happen here. In theory. */
+ return tv.token;
+ }
+ popping = 0;
+
+ current.token = lex_one_token ();
+
+ /* TODO: Need a way to force specifying name1 as a package.
+ .name1.name2 ? */
+
+ if (current.token != NAME)
+ return current.token;
+
+ /* See if we have "name1 . name2". */
+
+ current.value = yylval;
+ next.token = lex_one_token ();
+ next.value = yylval;
+
+ if (next.token == '.')
+ {
+ token_and_value name2;
+
+ name2.token = lex_one_token ();
+ name2.value = yylval;
+
+ if (name2.token == NAME)
+ {
+ /* Ok, we have "name1 . name2". */
+ char *copy;
+
+ copy = copy_name (current.value.sval);
+
+ if (strcmp (copy, "unsafe") == 0)
+ {
+ popping = 1;
+ return classify_unsafe_function (name2.value.sval);
+ }
+
+ if (package_name_p (copy, expression_context_block))
+ {
+ popping = 1;
+ yylval.sval = build_packaged_name (current.value.sval.ptr,
+ current.value.sval.length,
+ name2.value.sval.ptr,
+ name2.value.sval.length);
+ return classify_packaged_name (expression_context_block);
+ }
+ }
+
+ VEC_safe_push (token_and_value, token_fifo, &next);
+ VEC_safe_push (token_and_value, token_fifo, &name2);
+ }
+ else
+ {
+ VEC_safe_push (token_and_value, token_fifo, &next);
+ }
+
+ /* If we arrive here we don't have a package-qualified name. */
+
+ popping = 1;
+ yylval = current.value;
+ return classify_name (expression_context_block);
+}
+
+int
+go_parse (void)
+{
+ int result;
+ struct cleanup *back_to = make_cleanup (null_cleanup, NULL);
+
+ make_cleanup_restore_integer (&yydebug);
+ yydebug = parser_debug;
+
+ /* Initialize some state used by the lexer. */
+ last_was_structop = 0;
+ saw_name_at_eof = 0;
+
+ VEC_free (token_and_value, token_fifo);
+ popping = 0;
+ obstack_init (&name_obstack);
+ make_cleanup_obstack_free (&name_obstack);
+
+ result = yyparse ();
+ do_cleanups (back_to);
+ return result;
}
void
-yyerror (msg)
- char *msg;
+yyerror (char *msg)
{
if (prev_lexptr)
lexptr = prev_lexptr;
« no previous file with comments | « gdb/gnulib/wchar.in.h ('k') | gdb/go-exp.y » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698