[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Please help!....Strange Error
From: |
Tim Van Holder |
Subject: |
Re: Please help!....Strange Error |
Date: |
Mon, 14 Apr 2003 08:27:52 +0200 |
> %start exp_line
>
> %%
>
> exp_line : if_exp NEWLINE
> | '}' NEWLINE
> | PORTS NEWLINE
> | NEWLINE
> | '!' NEWLINE
> | error NEWLINE
> ;
Your start rule only matches the one line.
What you probably want is to add another rule:
%start commands
commands
: /* empty */
| commands exp_line
;
(if you expect at least one command, change the /* empty */ to exp_line).
Note that in cases like this it can help to #define YYERROR_VERBOSE, as
that will (in most cases) tell you what tokens were expected when there is
a parse error.
As an aside, you may want to consider the style I used above to keep your
bison files more readable. Consider:
if_exp
: exp
{
$$ = $1;
//printf("if_exp->$1: %d\n", $<y_int>1);
}
| var_exp '?' if_exp ':' if_exp
{
//$<y_tree>$ = make_op2_node(P_IF, $<y_tree>1,
// make_op2_node(P_CON, $<y_tree>3,
$<y_tree>5));
//$$ = new Tree(P_IF, $<y_tree>1, new Tree(P_CON, $<y_tree>3,
$<y_tree>5));
$$ = $1;
}
| var_exp '#' if_exp
{
//$<y_tree>$ = make_op2_node(P_ITER, $<y_tree>1, $<y_tree>3);
$$ = new Tree(ITER_OpCode, $1, $3);
}
| WHILE_DO var_exp ',' var_exp ')'
{
//$<y_tree>$ = make_op2_node(P_WHILE, $<y_tree>2, $<y_tree>4);
$$ = new Tree(WHILE_OpCode, $2, $4);
}
;
instead of
> if_exp : exp
> {
> $$ = $1;
> //printf("if_exp->$1: %d\n",$<y_int>1);
> }
> | var_exp '?' if_exp ':' if_exp
> {
> //$<y_tree>$ = make_op2_node(P_IF,$<y_tree>1,
> //
> make_op2_node(P_CON,$<y_tree>3,$<y_tree>5));
> // $$ = new Tree(P_IF,$<y_tree>1, new
> Tree(P_CON,$<y_tree>3,$<y_tree>5));
> $$ = $1;
> }
> | var_exp '#' if_exp
> {
> //$<y_tree>$ =
> make_op2_node(P_ITER,$<y_tree>1,$<y_tree>3);
> $$ = new Tree(ITER_OpCode,$1,$3);
> }
> | WHILE_DO var_exp ',' var_exp ')'
> {
> //$<y_tree>$ = make_op2_node(P_WHILE,$<y_tree>2,$<y_tree>4);
> $$ = new Tree(WHILE_OpCode,$2,$4);
> }
> ;
Also, you may want to consider typing your rules to avoid having to use
$<y_tree>n constructs.