diff options
author | Eli Bendersky <eliben@gmail.com> | 2014-01-25 06:30:53 -0800 |
---|---|---|
committer | Eli Bendersky <eliben@gmail.com> | 2014-01-25 06:30:53 -0800 |
commit | 8aad3186f39127ec9544f2b8c412de2bb7300fd4 (patch) | |
tree | 45152d3bced1a5344ba36c8839fd5a164ce52af3 /pycparser | |
parent | e7c55cfb19f420e2407c8ffbffd6b335a5d370dc (diff) | |
download | pycparser-8aad3186f39127ec9544f2b8c412de2bb7300fd4.tar.gz |
Fuller support for qualifiers in array dimensions.
Added a field to the ArrayDecl node and modified tests
Diffstat (limited to 'pycparser')
-rw-r--r-- | pycparser/_c_ast.cfg | 6 | ||||
-rw-r--r-- | pycparser/c_ast.py | 5 | ||||
-rw-r--r-- | pycparser/c_parser.py | 23 |
3 files changed, 27 insertions, 7 deletions
diff --git a/pycparser/_c_ast.cfg b/pycparser/_c_ast.cfg index 2596de6..b9fce05 100644 --- a/pycparser/_c_ast.cfg +++ b/pycparser/_c_ast.cfg @@ -13,7 +13,11 @@ # License: BSD #----------------------------------------------------------------- -ArrayDecl: [type*, dim*] +# ArrayDecl is a nested declaration of an array with the given type. +# dim: the dimension (for example, constant 42) +# dim_quals: list of dimension qualifiers, to support C99's allowing 'const' +# and 'static' within the array dimension in function declarations. +ArrayDecl: [type*, dim*, dim_quals] ArrayRef: [name*, subscript*] diff --git a/pycparser/c_ast.py b/pycparser/c_ast.py index e6c6574..212019a 100644 --- a/pycparser/c_ast.py +++ b/pycparser/c_ast.py @@ -127,9 +127,10 @@ class NodeVisitor(object): class ArrayDecl(Node): - def __init__(self, type, dim, coord=None): + def __init__(self, type, dim, dim_quals, coord=None): self.type = type self.dim = dim + self.dim_quals = dim_quals self.coord = coord def children(self): @@ -138,7 +139,7 @@ class ArrayDecl(Node): if self.dim is not None: nodelist.append(("dim", self.dim)) return tuple(nodelist) - attr_names = () + attr_names = ('dim_quals',) class ArrayRef(Node): def __init__(self, name, subscript, coord=None): diff --git a/pycparser/c_parser.py b/pycparser/c_parser.py index bd8e3e6..8ec3416 100644 --- a/pycparser/c_parser.py +++ b/pycparser/c_parser.py @@ -987,10 +987,20 @@ class CParser(PLYParser): | direct_declarator LBRACKET STATIC assignment_expression_opt RBRACKET | direct_declarator LBRACKET CONST assignment_expression_opt RBRACKET """ - arr = c_ast.ArrayDecl( - type=None, - dim=p[3] if len(p) == 5 else p[4], - coord=p[1].coord) + if len(p) > 5: + # Have dimension qualifiers + # Per C99 6.7.5.3 p7 + arr = c_ast.ArrayDecl( + type=None, + dim=p[4], + dim_quals=[p[3]], + coord=p[1].coord) + else: + arr = c_ast.ArrayDecl( + type=None, + dim=p[3], + dim_quals=[], + coord=p[1].coord) p[0] = self._type_modify_decl(decl=p[1], modifier=arr) @@ -1002,6 +1012,7 @@ class CParser(PLYParser): arr = c_ast.ArrayDecl( type=None, dim=c_ast.ID(p[3], self._coord(p.lineno(3))), + dim_quals=[], coord=p[1].coord) p[0] = self._type_modify_decl(decl=p[1], modifier=arr) @@ -1213,6 +1224,7 @@ class CParser(PLYParser): arr = c_ast.ArrayDecl( type=None, dim=p[3], + dim_quals=[], coord=p[1].coord) p[0] = self._type_modify_decl(decl=p[1], modifier=arr) @@ -1223,6 +1235,7 @@ class CParser(PLYParser): p[0] = c_ast.ArrayDecl( type=c_ast.TypeDecl(None, None, None), dim=p[2], + dim_quals=[], coord=self._coord(p.lineno(1))) def p_direct_abstract_declarator_4(self, p): @@ -1231,6 +1244,7 @@ class CParser(PLYParser): arr = c_ast.ArrayDecl( type=None, dim=c_ast.ID(p[3], self._coord(p.lineno(3))), + dim_quals=[], coord=p[1].coord) p[0] = self._type_modify_decl(decl=p[1], modifier=arr) @@ -1241,6 +1255,7 @@ class CParser(PLYParser): p[0] = c_ast.ArrayDecl( type=c_ast.TypeDecl(None, None, None), dim=c_ast.ID(p[3], self._coord(p.lineno(3))), + dim_quals=[], coord=self._coord(p.lineno(1))) def p_direct_abstract_declarator_6(self, p): |