diff options
author | Martin Mares <mj@ucw.cz> | 1998-11-27 21:32:45 +0000 |
---|---|---|
committer | Martin Mares <mj@ucw.cz> | 1998-11-27 21:32:45 +0000 |
commit | 0b62c3a7c7548cd447b4f18e0346cc9e74862ab3 (patch) | |
tree | b74b1a9ffa4f59b7d86765eac906c67827e83a12 /conf/confbase.Y | |
parent | c74c0e3cdf008988a8873d3f76c0d71b29ab8673 (diff) |
Trivial 15-line bison excercise: Implemented expressions including
user-defined numeric symbols. Whenever possible, use `expr' instead
of `NUM' to get full express ion power :-)
Diffstat (limited to 'conf/confbase.Y')
-rw-r--r-- | conf/confbase.Y | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/conf/confbase.Y b/conf/confbase.Y index b20986ae..db6d0214 100644 --- a/conf/confbase.Y +++ b/conf/confbase.Y @@ -30,8 +30,17 @@ CF_DECLS %token <s> SYM %token <t> TEXT +%type <i> expr + +%left '+' '-' +%left '*' '/' '%' + +CF_KEYWORDS(DEFINE) + CF_GRAMMAR +/* Basic config file structure */ + config: conf_entries END { return 0; } @@ -44,6 +53,28 @@ conf_entries: CF_ADDTO(conf, /* EMPTY */) +/* Expressions */ + +expr: + NUM + | expr '+' expr { $$ = $1 + $3; } + | expr '-' expr { $$ = $1 - $3; } + | expr '*' expr { $$ = $1 * $3; } + | expr '/' expr { if ($3) $$ = $1 / $3; else cf_error("Division by zero"); } + | expr '%' expr { if ($3) $$ = $1 % $3; else cf_error("Division by zero"); } + | '(' expr ')' { $$ = $2; } + | SYM { if ($1->class != SYM_NUMBER) cf_error("Number expected"); else $$ = $1->aux; } + ; + +CF_ADDTO(conf, definition) +definition: + DEFINE SYM '=' expr { + if ($2->class != SYM_VOID) cf_error("Symbol already defined"); + $2->class = SYM_NUMBER; + $2->aux = $4; + } + ; + CF_CODE CF_END |