mirror of
https://gitlab.nic.cz/labs/bird.git
synced 2024-12-22 09:41:54 +00:00
Original expr' is back, filter expressions renamed to
term'.
In the future, we'll allow any filter term in place of `expr' and we'll just evaluate it immediately, but not now as we have no evaluation routines.
This commit is contained in:
parent
3169cf6991
commit
c9b6670608
@ -1,7 +1,7 @@
|
|||||||
/*
|
/*
|
||||||
* BIRD -- Configuration Parser Top
|
* BIRD -- Configuration Parser Top
|
||||||
*
|
*
|
||||||
* (c) 1998 Martin Mares <mj@ucw.cz>
|
* (c) 1998--1999 Martin Mares <mj@ucw.cz>
|
||||||
*
|
*
|
||||||
* Can be freely distributed and used under the terms of the GNU GPL.
|
* Can be freely distributed and used under the terms of the GNU GPL.
|
||||||
*/
|
*/
|
||||||
@ -34,7 +34,7 @@ CF_DECLS
|
|||||||
%token <s> SYM
|
%token <s> SYM
|
||||||
%token <t> TEXT
|
%token <t> TEXT
|
||||||
|
|
||||||
%type <i> cexpr bool pxlen
|
%type <i> expr bool pxlen
|
||||||
|
|
||||||
%left '+' '-'
|
%left '+' '-'
|
||||||
%left '*' '/' '%'
|
%left '*' '/' '%'
|
||||||
@ -59,20 +59,20 @@ CF_ADDTO(conf, /* EMPTY */)
|
|||||||
|
|
||||||
/* Constant expressions */
|
/* Constant expressions */
|
||||||
|
|
||||||
cexpr:
|
expr:
|
||||||
NUM
|
NUM
|
||||||
| cexpr '+' cexpr { $$ = $1 + $3; }
|
| expr '+' expr { $$ = $1 + $3; }
|
||||||
| cexpr '-' cexpr { $$ = $1 - $3; }
|
| expr '-' expr { $$ = $1 - $3; }
|
||||||
| cexpr '*' cexpr { $$ = $1 * $3; }
|
| expr '*' expr { $$ = $1 * $3; }
|
||||||
| cexpr '/' cexpr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
|
| expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); }
|
||||||
| cexpr '%' cexpr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
|
| expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); }
|
||||||
| '(' cexpr ')' { $$ = $2; }
|
| '(' expr ')' { $$ = $2; }
|
||||||
| SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
|
| SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; }
|
||||||
;
|
;
|
||||||
|
|
||||||
CF_ADDTO(conf, definition)
|
CF_ADDTO(conf, definition)
|
||||||
definition:
|
definition:
|
||||||
DEFINE SYM '=' cexpr {
|
DEFINE SYM '=' expr {
|
||||||
if ($2->class != SYM_VOID) cf_error("Symbol already defined");
|
if ($2->class != SYM_VOID) cf_error("Symbol already defined");
|
||||||
$2->class = SYM_NUMBER;
|
$2->class = SYM_NUMBER;
|
||||||
$2->aux = $4;
|
$2->aux = $4;
|
||||||
@ -82,7 +82,7 @@ definition:
|
|||||||
/* Switches */
|
/* Switches */
|
||||||
|
|
||||||
bool:
|
bool:
|
||||||
cexpr {$$ = !!$1; }
|
expr {$$ = !!$1; }
|
||||||
| ON { $$ = 1; }
|
| ON { $$ = 1; }
|
||||||
| YES { $$ = 1; }
|
| YES { $$ = 1; }
|
||||||
| OFF { $$ = 0; }
|
| OFF { $$ = 0; }
|
||||||
|
@ -21,7 +21,7 @@ CF_DECLS
|
|||||||
|
|
||||||
CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT)
|
CF_KEYWORDS(FUNCTION, FILTER, PRINTDEBUG, INT, PRINT)
|
||||||
|
|
||||||
%type <x> expr
|
%type <x> term
|
||||||
|
|
||||||
CF_GRAMMAR
|
CF_GRAMMAR
|
||||||
|
|
||||||
@ -38,7 +38,7 @@ program: /* EMPTY */
|
|||||||
|
|
||||||
CF_ADDTO(conf, function)
|
CF_ADDTO(conf, function)
|
||||||
function:
|
function:
|
||||||
FUNCTION SYM '(' ')' '{' expr '}' {
|
FUNCTION SYM '(' ')' '{' term '}' {
|
||||||
extern struct f_instruction *last_func;
|
extern struct f_instruction *last_func;
|
||||||
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
|
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
|
||||||
$2->class = SYM_FUNCTION;
|
$2->class = SYM_FUNCTION;
|
||||||
@ -50,7 +50,7 @@ function:
|
|||||||
|
|
||||||
CF_ADDTO(conf, filter)
|
CF_ADDTO(conf, filter)
|
||||||
filter:
|
filter:
|
||||||
FILTER SYM '{' expr '}' {
|
FILTER SYM '{' term '}' {
|
||||||
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
|
if ($2->class != SYM_VOID) cf_error("Symbol already defined" );
|
||||||
$2->class = SYM_FILTER;
|
$2->class = SYM_FILTER;
|
||||||
$2->aux = $4;
|
$2->aux = $4;
|
||||||
@ -60,8 +60,8 @@ filter:
|
|||||||
|
|
||||||
/* Programs */
|
/* Programs */
|
||||||
|
|
||||||
expr: /* EMPTY */ { $$ = NULL; }
|
term: /* EMPTY */ { $$ = NULL; }
|
||||||
| expr ';' expr {
|
| term ';' term {
|
||||||
$$ = cfg_alloc(sizeof(struct f_instruction));
|
$$ = cfg_alloc(sizeof(struct f_instruction));
|
||||||
printf( "We've got statement here\n" );
|
printf( "We've got statement here\n" );
|
||||||
$$->code = ',';
|
$$->code = ',';
|
||||||
@ -74,7 +74,7 @@ expr: /* EMPTY */ { $$ = NULL; }
|
|||||||
printf( "New variable\n" );
|
printf( "New variable\n" );
|
||||||
$$ = NULL;
|
$$ = NULL;
|
||||||
}
|
}
|
||||||
| SYM '=' cexpr {
|
| SYM '=' expr {
|
||||||
$$ = cfg_alloc(sizeof(struct f_instruction));
|
$$ = cfg_alloc(sizeof(struct f_instruction));
|
||||||
printf( "Ook, we'll set value\n" );
|
printf( "Ook, we'll set value\n" );
|
||||||
if ($1->class != SYM_VARIABLE_INT)
|
if ($1->class != SYM_VARIABLE_INT)
|
||||||
|
Loading…
Reference in New Issue
Block a user