Support array pointer in struct
This commit is contained in:
parent
04d01a5f6e
commit
11c896f82e
2 changed files with 31 additions and 12 deletions
|
|
@ -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"]:
|
||||
|
|
|
|||
|
|
@ -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+
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue