summaryrefslogtreecommitdiffstats
path: root/conf/confbase.Y
diff options
context:
space:
mode:
authorMartin Mares <mj@ucw.cz>1998-11-27 22:32:45 +0100
committerMartin Mares <mj@ucw.cz>1998-11-27 22:32:45 +0100
commit0b62c3a7c7548cd447b4f18e0346cc9e74862ab3 (patch)
treeb74b1a9ffa4f59b7d86765eac906c67827e83a12 /conf/confbase.Y
parentc74c0e3cdf008988a8873d3f76c0d71b29ab8673 (diff)
downloadbird-0b62c3a7c7548cd447b4f18e0346cc9e74862ab3.tar
bird-0b62c3a7c7548cd447b4f18e0346cc9e74862ab3.zip
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.Y31
1 files changed, 31 insertions, 0 deletions
diff --git a/conf/confbase.Y b/conf/confbase.Y
index b20986a..db6d021 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