vppapigen: add support for empty options

Type: improvement
Signed-off-by: Ole Troan <ot@cisco.com>
Change-Id: I59323447bee7bb4f0563251a5df80cbefb9bd89e
Signed-off-by: Ole Troan <ot@cisco.com>
diff --git a/extras/scripts/tests/test_crcchecker.sh b/extras/scripts/tests/test_crcchecker.sh
index e275bd9..07b6bbf 100755
--- a/extras/scripts/tests/test_crcchecker.sh
+++ b/extras/scripts/tests/test_crcchecker.sh
@@ -59,7 +59,7 @@
 option version="1.0.0";
 autoreply define crccheck
 {
-  option deprecated="v20.11";
+  option deprecated;
   bool foo;
 };
 EOL
diff --git a/src/tools/vppapigen/test_vppapigen.py b/src/tools/vppapigen/test_vppapigen.py
index a8e5263..999addf 100755
--- a/src/tools/vppapigen/test_vppapigen.py
+++ b/src/tools/vppapigen/test_vppapigen.py
@@ -124,6 +124,16 @@
         with self.assertRaises(ParseError):
             self.parser.parse_string(test_string)
 
+    def test_options(self):
+        test_string = '''
+          define foo { option deprecated; u8 foo; };
+          define foo_reply {u32 context; i32 retval; };
+        '''
+        r = self.parser.parse_string(test_string)
+        self.assertIsNotNone(r)
+        s = self.parser.process(r)
+        self.assertIsNotNone(s)
+
 
 class TestService(unittest.TestCase):
     @classmethod
diff --git a/src/tools/vppapigen/vppapigen.py b/src/tools/vppapigen/vppapigen.py
index 8b6297e..e571f26 100755
--- a/src/tools/vppapigen/vppapigen.py
+++ b/src/tools/vppapigen/vppapigen.py
@@ -350,7 +350,7 @@
 
 
 class Option():
-    def __init__(self, option, value):
+    def __init__(self, option, value=None):
         self.type = 'Option'
         self.option = option
         self.value = value
@@ -686,8 +686,12 @@
         p[0] = Array(p[1], p[2], p[4])
 
     def p_option(self, p):
-        '''option : OPTION ID '=' assignee ';' '''
-        p[0] = Option(p[2], p[4])
+        '''option : OPTION ID '=' assignee ';'
+                  | OPTION ID ';' '''
+        if len(p) == 4:
+            p[0] = Option(p[2])
+        else:
+            p[0] = Option(p[2], p[4])
 
     def p_assignee(self, p):
         '''assignee : NUM