parser: add padding syntax
diff --git a/loxi_front_end/frontend.py b/loxi_front_end/frontend.py
index fdcd286..6c7a153 100644
--- a/loxi_front_end/frontend.py
+++ b/loxi_front_end/frontend.py
@@ -46,7 +46,18 @@
for s in ast:
if s[0] == 'struct':
name = s[1]
- members = [dict(m_type=x[0], name=x[1]) for x in s[2]]
+ pad_count = 0
+ members = []
+ for x in s[2]:
+ if x[0] == 'pad':
+ # HACK until we have a real intermediate representation
+ m_name = 'pad%d' % pad_count
+ if m_name == 'pad0': m_name = 'pad'
+ members.append(dict(m_type='uint8_t[%d]' % x[1],
+ name=m_name))
+ pad_count += 1
+ else:
+ members.append(dict(m_type=x[0], name=x[1]))
ofinput.classes[name] = members
ofinput.ordered_classes.append(name)
if name in type_maps.inheritance_map:
diff --git a/loxi_front_end/parser.py b/loxi_front_end/parser.py
index 73135ff..5e994dc 100644
--- a/loxi_front_end/parser.py
+++ b/loxi_front_end/parser.py
@@ -50,9 +50,10 @@
any_type = (array_type | list_type | scalar_type).setName("type name")
# Structs
-struct_member = P.Group(any_type - identifier - s(';'))
+pad_member = P.Group(kw('pad') - s('(') - integer - s(')'))
+struct_member = pad_member | P.Group(any_type - identifier);
struct = kw('struct') - identifier - s('{') + \
- P.Group(P.ZeroOrMore(struct_member)) + \
+ P.Group(P.ZeroOrMore(struct_member - s(';'))) + \
s('}') - s(';')
# Enums
diff --git a/utest/test_parser.py b/utest/test_parser.py
index 749e530..da262a4 100755
--- a/utest/test_parser.py
+++ b/utest/test_parser.py
@@ -83,6 +83,16 @@
self.assertEquals(ast,
[['struct', 'foo', [['list(of_action_t)', 'bar']]]])
+ def test_pad_type(self):
+ src = """\
+struct foo {
+ pad(1);
+};
+"""
+ ast = parser.parse(src)
+ self.assertEquals(ast,
+ [['struct', 'foo', [['pad', 1]]]])
+
class EnumTests(unittest.TestCase):
def test_empty(self):
src = """\