This happens because you copied and pasted the text from the manual.
You can prove that by typing out the lines mentioned in your error
list. You may also try doing a find or replace on the characters
mentioned.
Graheme
On 26 Oct 2012, at 22:13, Marc Mendiola wrote:
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);
}
_______________________________________________
help-bison@gnu.org https://lists.gnu.org/mailman/listinfo/help-bison
_______________________________________________
help-bison@gnu.org https://lists.gnu.org/mailman/listinfo/help-bison