aboutsummaryrefslogtreecommitdiff
path: root/pycparser
diff options
context:
space:
mode:
authorEli Bendersky <eliben@gmail.com>2014-01-25 06:30:53 -0800
committerEli Bendersky <eliben@gmail.com>2014-01-25 06:30:53 -0800
commit8aad3186f39127ec9544f2b8c412de2bb7300fd4 (patch)
tree45152d3bced1a5344ba36c8839fd5a164ce52af3 /pycparser
parente7c55cfb19f420e2407c8ffbffd6b335a5d370dc (diff)
downloadpycparser-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.cfg6
-rw-r--r--pycparser/c_ast.py5
-rw-r--r--pycparser/c_parser.py23
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):