%{
#include "defs.h"
+#include <string.h>
#include "expression.h"
-#include "parser-defs.h"
#include "value.h"
+#include "parser-defs.h"
#include "language.h"
#include "f-lang.h"
#include "bfd.h" /* Required by objfiles.h. */
#define yylloc f_lloc
#define yyreds f_reds /* With YYDEBUG defined */
#define yytoks f_toks /* With YYDEBUG defined */
+#define yylhs f_yylhs
+#define yylen f_yylen
+#define yydefred f_yydefred
+#define yydgoto f_yydgoto
+#define yysindex f_yysindex
+#define yyrindex f_yyrindex
+#define yygindex f_yygindex
+#define yytable f_yytable
+#define yycheck f_yycheck
#ifndef YYDEBUG
#define YYDEBUG 1 /* Default to no yydebug support */
write_exp_elt_opcode(OP_TYPE); }
;
-
exp : '(' exp ')'
{ }
;
;
exp : '(' complexnum ')'
- { write_exp_elt_opcode(OP_F77_LITERAL_COMPLEX); }
+ { write_exp_elt_opcode(OP_COMPLEX); }
;
exp : '(' type ')' exp %prec UNARY
write_exp_elt_opcode (OP_LONG);
write_exp_elt_type (val.typed_val.type);
write_exp_elt_longcst ((LONGEST)val.typed_val.val);
- write_exp_elt_opcode (OP_LONG);
- }
+ write_exp_elt_opcode (OP_LONG); }
;
exp : FLOAT
;
exp : STRING_LITERAL
- { /* In F77, we encounter string literals
- basically in only one place:
- when we are setting up manual parameter
- lists to functions we call by hand or
- when setting string vars to manual values.
- These are character*N type variables.
- They are treated specially behind the
- scenes. Remember that the literal strings's
- OPs are being emitted in reverse order, thus
- we first have the elements and then
- the array descriptor itself. */
- char *sp = $1.ptr; int count = $1.length;
-
- while (count-- > 0)
- {
- write_exp_elt_opcode (OP_LONG);
- write_exp_elt_type (builtin_type_f_character);
- write_exp_elt_longcst ((LONGEST)(*sp++));
- write_exp_elt_opcode (OP_LONG);
- }
- write_exp_elt_opcode (OP_ARRAY);
- write_exp_elt_longcst ((LONGEST) 1);
- write_exp_elt_longcst ((LONGEST) ($1.length));
- write_exp_elt_opcode (OP_ARRAY);
+ {
+ write_exp_elt_opcode (OP_STRING);
+ write_exp_string ($1);
+ write_exp_elt_opcode (OP_STRING);
}
-
;
variable: name_not_typename
innermost_block = block_found;
}
write_exp_elt_opcode (OP_VAR_VALUE);
+ /* We want to use the selected frame, not
+ another more inner frame which happens to
+ be in the same block. */
+ write_exp_elt_block (NULL);
write_exp_elt_sym (sym);
write_exp_elt_opcode (OP_VAR_VALUE);
break;
struct minimal_symbol *msymbol;
register char *arg = copy_name ($1.stoken);
- msymbol = lookup_minimal_symbol (arg, NULL);
+ msymbol =
+ lookup_minimal_symbol (arg, NULL, NULL);
if (msymbol != NULL)
{
write_exp_msymbol (msymbol,
if (parsed_float)
{
/* It's a float since it contains a point or an exponent. */
- putithere->dval = atof (p);
+ /* [dD] is not understood as an exponent by atof, change it to 'e'. */
+ char *tmp, *tmp2;
+
+ tmp = strsave (p);
+ for (tmp2 = tmp; *tmp2; ++tmp2)
+ if (*tmp2 == 'd' || *tmp2 == 'D')
+ *tmp2 = 'e';
+ putithere->dval = atof (tmp);
+ free (tmp);
return FLOAT;
}
int namelen;
unsigned int i,token;
char *tokstart;
- char *tokptr;
- int tempbufindex;
- static char *tempbuf;
- static int tempbufsize;
retry:
if (*lexptr == '.')
{
- for (i=0;boolean_values[i].name != NULL;i++)
+ for (i = 0; boolean_values[i].name != NULL; i++)
{
- if STREQN(tokstart,boolean_values[i].name,
- strlen(boolean_values[i].name))
+ if STREQN (tokstart, boolean_values[i].name,
+ strlen (boolean_values[i].name))
{
- lexptr += strlen(boolean_values[i].name);
+ lexptr += strlen (boolean_values[i].name);
yylval.lval = boolean_values[i].value;
- return (BOOLEAN_LITERAL);
+ return BOOLEAN_LITERAL;
}
}
}
/* See if it is a special .foo. operator */
for (i = 0; dot_ops[i].operator != NULL; i++)
- if (STREQN(tokstart, dot_ops[i].operator,
- strlen(dot_ops[i].operator)))
+ if (STREQN (tokstart, dot_ops[i].operator, strlen (dot_ops[i].operator)))
{
- lexptr += strlen(dot_ops[i].operator);
+ lexptr += strlen (dot_ops[i].operator);
yylval.opcode = dot_ops[i].opcode;
return dot_ops[i].token;
}
{
if (!hex && !got_e && (*p == 'e' || *p == 'E'))
got_dot = got_e = 1;
- else if (!hex && !got_e && (*p == 'd' || *p == 'D'))
+ else if (!hex && !got_d && (*p == 'd' || *p == 'D'))
got_dot = got_d = 1;
else if (!hex && !got_dot && *p == '.')
got_dot = 1;
- else if ((got_e && (p[-1] == 'e' || p[-1] == 'E')
- || got_d && (p[-1] == 'd' || p[-1] == 'D'))
+ else if (((got_e && (p[-1] == 'e' || p[-1] == 'E'))
+ || (got_d && (p[-1] == 'd' || p[-1] == 'D')))
&& (*p == '-' || *p == '+'))
/* This is the sign of the exponent, not the end of the
number. */
and $$digits (equivalent to $<-digits> if you could type that).
Make token type LAST, and put the number (the digits) in yylval. */
- tryname:
if (*tokstart == '$')
{
register int negate = 0;