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"]: if name in ["math_expression", "primitive_type", "sized_type_specifier"]:
val = val.getType() val = val.getType()
if node.tsNodePrevNamedSibling().tsNodeIsNull() and let
((node.isPName("pointer_declarator") and not node.isPPName("function_declarator")) or pname = node.getPName()
(node.getPName() in ["function_declarator", "array_declarator"] and node.isPPName("pointer_declarator"))): ppname = node.tsNodeParent().getPName()
gStateRT.data.add(("pointer_declarator", ""))
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)) gStateRT.data.add((name, val))
if node.tsNodeType() == "field_identifier" and node.isPName("pointer_declarator") and if node.tsNodeType() == "field_identifier" and
node.isPPName("function_declarator"): pname == "pointer_declarator" and
ppname == "function_declarator":
gStateRT.data.add(("function_declarator", "")) gStateRT.data.add(("function_declarator", ""))
elif name in ["abstract_pointer_declarator", "enumerator", "field_declaration", "function_declarator"]: elif name in ["abstract_pointer_declarator", "enumerator", "field_declaration", "function_declarator"]:

View file

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