To whom it may concern,
I am currently new to GNU Bison and thus, have only read the manual
briefly. I am trying to compile a working example of a parser in
order to help my understanding of the material. Therefore, I went
through the rpcalc example provided online. I copied the code
verbatim to a new file named "rpcalc.y." However, when I try to
generate the parser using "bison rpcalc.y," I receive the following
errors.
rpcalc.y:1.1: invalid character: `\377'
rpcalc.y:1.2: invalid character: `\376'
rpcalc.y:1.4: invalid character: `'
rpcalc.y:1.5: invalid character: `'
rpcalc.y:1.6: invalid character: `'
rpcalc.y:1.7: invalid character: `'
rpcalc.y:1.8: invalid character: `'
rpcalc.y:1.8: invalid character: `/'
rpcalc.y:1.9: invalid character: `'
rpcalc.y:1.9: invalid character: `*'
rpcalc.y:1.10: invalid character: `'
rpcalc.y:1.11: invalid character: `'
rpcalc.y:1.11: syntax error, unexpected identifier
Is this a problem with my installation of bison or the actual code?
As far as I know, I have installed bison correctly, but perhaps
there is a patch that I missed. For your reference, I'll paste the
contents of my file below. But again, it is copied almost word-for-
word from the manual. I would appreciate any help you can provide.
Thank you!
Best regards,
Marc
/* Reverse polish notation calculator. */
%{
#define YYSTYPE double
#include <math.h>
#include <ctype.h>
#include <stdio.h>
int yylex (void);
void yyerror (char const *);
%}
%token NUM
%% /* Grammar rules and actions follow. */
input:
/* empty */
| input line
;
line:
'\n'
| exp '\n' { printf ("%.10g\n", $1); }
;
exp:
NUM { $$ = $1; }
| exp exp '+' { $$ = $1 + $2; }
| exp exp '-' { $$ = $1 - $2; }
| exp exp '*' { $$ = $1 * $2; }
| exp exp '/' { $$ = $1 / $2; }
| exp exp '^' { $$ = pow ($1, $2); } /* Exponentiation */
| exp 'n' { $$ = -$1; } /* Unary minus */
;
%%
/* The lexical analyzer returns a double floating point
number on the stack and the token NUM, or the numeric code
of the character read if not a number. It skips all blanks
and tabs, and returns 0 for end-of-input. */
int
yylex (void)
{
int c;
/* Skip white space. */
while ((c = getchar ()) == ' ' || c == '\t')
continue;
/* Process numbers. */
if (c == '.' || isdigit (c))
{
ungetc (c, stdin);
scanf ("%lf", &yylval);
return NUM;
}
/* Return end-of-input. */
if (c == EOF)
return 0;
/* Return a single char. */
return c;
}
int
main (void)
{
return yyparse ();
}
/* Called by yyparse on error. */
void
yyerror (char const *s)
{
fprintf (stderr, "%s\n", s);
}
_______________________________________________
address@hidden https://lists.gnu.org/mailman/listinfo/help-bison