Support array pointer in struct

This commit is contained in:
Ganesh Viswanathan 2019-01-15 17:55:38 -06:00
commit 11c896f82e
2 changed files with 31 additions and 12 deletions

View file

@ -33,15 +33,25 @@ proc saveNodeData(node: TSNode): bool =
if name in ["math_expression", "primitive_type", "sized_type_specifier"]:
val = val.getType()
if node.tsNodePrevNamedSibling().tsNodeIsNull() and
((node.isPName("pointer_declarator") and not node.isPPName("function_declarator")) or
(node.getPName() in ["function_declarator", "array_declarator"] and node.isPPName("pointer_declarator"))):
gStateRT.data.add(("pointer_declarator", ""))
let
pname = node.getPName()
ppname = node.tsNodeParent().getPName()
if node.tsNodePrevNamedSibling().tsNodeIsNull():
if pname == "pointer_declarator":
if ppname notin ["function_declarator", "array_declarator"]:
gStateRT.data.add(("pointer_declarator", ""))
elif ppname == "array_declarator":
gStateRT.data.add(("array_pointer_declarator", ""))
elif pname in ["function_declarator", "array_declarator"]:
if ppname == "pointer_declarator":
gStateRT.data.add(("pointer_declarator", ""))
gStateRT.data.add((name, val))
if node.tsNodeType() == "field_identifier" and node.isPName("pointer_declarator") and
node.isPPName("function_declarator"):
if node.tsNodeType() == "field_identifier" and
pname == "pointer_declarator" and
ppname == "function_declarator":
gStateRT.data.add(("function_declarator", ""))
elif name in ["abstract_pointer_declarator", "enumerator", "field_declaration", "function_declarator"]:

View file

@ -165,25 +165,31 @@ proc initGrammar() =
i = fstart
ftyp, fname: string
fptr = ""
aptr = ""
while i < gStateRT.data.len-fend:
fptr = ""
aptr = ""
if gStateRT.data[i].name == "field_declaration":
i += 1
continue
if gStateRT.data[i].name notin ["field_identifier", "pointer_declarator"]:
if gStateRT.data[i].name notin ["field_identifier", "pointer_declarator", "array_pointer_declarator"]:
ftyp = gStateRT.data[i].val.getType()
i += 1
if gStateRT.data[i].name == "pointer_declarator":
fptr = "ptr "
i += 1
case gStateRT.data[i].name:
of "pointer_declarator":
fptr = "ptr "
i += 1
of "array_pointer_declarator":
aptr = "ptr "
i += 1
fname = gStateRT.data[i].val.getIdentifier()
if i+1 < gStateRT.data.len-fend and gStateRT.data[i+1].name in ["identifier", "number_literal"]:
let
flen = gStateRT.data[i+1].val.getIdentifier()
gStateRT.typeStr &= &" {fname}*: array[{flen}, {fptr}{ftyp}]\n"
gStateRT.typeStr &= &" {fname}*: {aptr}array[{flen}, {fptr}{ftyp}]\n"
i += 2
elif i+1 < gStateRT.data.len-fend and gStateRT.data[i+1].name == "function_declarator":
var
@ -219,7 +225,10 @@ proc initGrammar() =
fieldGrammar = &"""
(field_identifier!)
(array_declarator!
(field_identifier)
(field_identifier!)
(pointer_declarator
(field_identifier)
)
(identifier|number_literal)
)
(function_declarator+