The token "string_type" is used but not defined. Most, but not all, forms of *_dcl have a semicolon in their definition. (typedef_dcl does not.) Most, but not all, uses of *_dcl also have a semicolon. I think there should always be one, in one place or the other but not both.