%%
program:
- /* empty */ {*ast = NULL; return 0;}
- | string {*ast = $1; return 0;}
- | exp {*ast = $1; return 0;}
+ /* empty */ {*ast = NULL; return 0;}
+ | string {*ast = $1; return 0;}
+ | exp {*ast = $1; return 0;}
| boolexp {*ast = $1; return 0;}
string: STRING_LITERAL {$$ = $1;}
| TITLE {$$ = mp_new_ast_leaf_node(TITLE);}
| ALBUM {$$ = mp_new_ast_leaf_node(ALBUM);}
| COMMENT {$$ = mp_new_ast_leaf_node(COMMENT);}
-;
exp: NUM {$$ = $1;}
- | exp '+' exp {$$ = ast_node_new_binary('+', $1, $3);}
- | exp '-' exp {$$ = ast_node_new_binary('-', $1, $3);}
- | exp '*' exp {$$ = ast_node_new_binary('*', $1, $3);}
- | exp '/' exp {$$ = ast_node_new_binary('/', $1, $3);}
- | '-' exp %prec NEG {$$ = ast_node_new_unary(NEG, $2);}
- | '(' exp ')' {$$ = $2;}
+ | exp '+' exp {$$ = ast_node_new_binary('+', $1, $3);}
+ | exp '-' exp {$$ = ast_node_new_binary('-', $1, $3);}
+ | exp '*' exp {$$ = ast_node_new_binary('*', $1, $3);}
+ | exp '/' exp {$$ = ast_node_new_binary('/', $1, $3);}
+ | '-' exp %prec NEG {$$ = ast_node_new_unary(NEG, $2);}
+ | '(' exp ')' {$$ = $2;}
| YEAR {$$ = mp_new_ast_leaf_node(YEAR);}
| NUM_ATTRIBUTES_SET {$$ = mp_new_ast_leaf_node(NUM_ATTRIBUTES_SET);}
| NUM_PLAYED {$$ = mp_new_ast_leaf_node(NUM_PLAYED);}
| FREQUENCY {$$ = mp_new_ast_leaf_node(FREQUENCY);}
| CHANNELS {$$ = mp_new_ast_leaf_node(CHANNELS);}
| DURATION {$$ = mp_new_ast_leaf_node(DURATION);}
-;
boolexp: IS_SET '(' STRING_LITERAL ')' {$$ = ast_node_new_unary(IS_SET, $3);}
| TRUE {$$ = mp_new_ast_leaf_node(TRUE);}
}
| string EQUAL string {$$ = ast_node_new_binary(EQUAL, $1, $3);}
| string NOT_EQUAL string {$$ = ast_node_new_binary(NOT_EQUAL, $1, $3);}
-;
%%
/* Called by yyparse() on error */