]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Trivial 15-line bison excercise: Implemented expressions including
authorMartin Mares <mj@ucw.cz>
Fri, 27 Nov 1998 21:32:45 +0000 (21:32 +0000)
committerMartin Mares <mj@ucw.cz>
Fri, 27 Nov 1998 21:32:45 +0000 (21:32 +0000)
user-defined numeric symbols. Whenever possible, use `expr' instead
of `NUM' to get full express ion power :-)

TODO
bird.conf
conf/cf-lex.l
conf/conf.h
conf/confbase.Y
nest/config.Y

diff --git a/TODO b/TODO
index 37adde9cb2a648fab884b2672b5544ed8c26b5ad..ba760b881b280998d7d9778dbc39e99a9b782cb8 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,12 +1,14 @@
 Core
 ~~~~
 * right usage of DBG vs. debug
+* cleanup debugging calls!
 
 - TOS not supported by kernel -> automatically drop routes with TOS<>0
 
 - use -freg-struct-return ?
 
 - fake multipath?
+- replace all NUM's by expr's
 - config file: symbolic constants?
 - counters (according to SNMP MIB?)
 - generation of subnet mask ICMP's for v6?
@@ -14,7 +16,6 @@ Core
 - ifdef out some debugging code?
 - better memory allocators
 - default preferences of protocols: prefer BGP over OSPF/RIP external routes?
-- all internal tables are in host order
 - secondary addresses -> subinterfaces
 - check if all protocols set proper packet priorities and TTL's.
 
@@ -37,8 +38,6 @@ Core
 
 - Check incoming packets and log errors!!
 
-- implement snprintf etc. and clean up debugging and logging functions
-
 
 RIP
 ~~~
@@ -51,7 +50,6 @@ RIP
 
 OSPF
 ~~~~
-       - Dijkstra: use Fibonacci heaps?
        - point-to-point interface with address: advertise as stub network
        - static routes: stub networks?
        - modes: PtP, PtP-unnumbered, Broadcast, NBMA, point-to-multipoint
index 57df7ec72c26e2dee3fcf5a41518929113a11bbe..ea7edf8d1008b25387c1ca9cb514ddbead226f37 100644 (file)
--- a/bird.conf
+++ b/bird.conf
@@ -6,6 +6,8 @@
 
 router id 62.168.0.1
 
+define xyzzy = 120+10;
+
 protocol rip MyRIP_test {
-       preference 130
+       preference xyzzy;
 }
index f653bcad007118db46d3e17b445b0353b576f0c6..66f3038244ac96a12d44be77cd94296332fc90e6 100644 (file)
@@ -101,7 +101,7 @@ WHITE [ \t]
   return SYM;
 }
 
-[{}:;,] {
+[={}:;,()+*/%-] {
   return yytext[0];
 }
 
@@ -177,6 +177,7 @@ cf_find_sym(byte *c, unsigned int h0)
   sym_hash[h] = s;
   s->class = SYM_VOID;
   s->def = NULL;
+  s->aux = 0;
   strcpy(s->name, c);
   return s;
 }
index 0853ae8ed0eb5eef0722df3d98f5022f6f7119d5..6a0a328dc7a28b7b6dfbcd7182920efad9895387 100644 (file)
@@ -21,12 +21,14 @@ extern int (*cf_read_hook)(byte *buf, unsigned int max);
 struct symbol {
   struct symbol *next;
   int class;
+  int aux;
   void *def;
   char name[1];
 };
 
 #define SYM_VOID 0
 #define SYM_PROTO 1
+#define SYM_NUMBER 2
 
 void cf_lex_init_tables(void);
 int cf_lex(void);
index b20986aee30d7c12195f1c49848643c6da1ffe70..db6d02149cd268a7e9618134a1369b12e1febb92 100644 (file)
@@ -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
index 1de0446bbf780a6900965925f4274a25a1fae491..697d43ec01db2dfc25245a745885da1c2759e467 100644 (file)
@@ -54,9 +54,10 @@ proto_name:
 
 proto_item:
    /* EMPTY */
- | PREFERENCE NUM {
+ | PREFERENCE expr {
      if ($2 < 0 || $2 > 255) cf_error("Invalid preference");
      this_proto->preference = $2;
+die("pref=%d", $2);
    }
  ;