diff options
| author | Ganesh Viswanathan <dev@genotrance.com> | 2019-01-15 17:55:38 -0600 |
|---|---|---|
| committer | Ganesh Viswanathan <dev@genotrance.com> | 2019-01-15 17:55:38 -0600 |
| commit | 11c896f82e00fce82e159d781243c2036346cc58 (patch) | |
| tree | a5a178a4e2b0b2e68fbba56965cb7c52e2dccf37 | |
| parent | 04d01a5f6ebf85f846ab54bd86011f733b42879c (diff) | |
| download | nimterop-11c896f82e00fce82e159d781243c2036346cc58.tar.gz nimterop-11c896f82e00fce82e159d781243c2036346cc58.zip | |
Support array pointer in struct
| -rw-r--r-- | nimterop/ast.nim | 22 | ||||
| -rw-r--r-- | nimterop/grammar.nim | 21 |
2 files changed, 31 insertions, 12 deletions
diff --git a/nimterop/ast.nim b/nimterop/ast.nim index 8f880da..8a61fe0 100644 --- a/nimterop/ast.nim +++ b/nimterop/ast.nim @@ -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"]: diff --git a/nimterop/grammar.nim b/nimterop/grammar.nim index ab80356..a72df53 100644 --- a/nimterop/grammar.nim +++ b/nimterop/grammar.nim @@ -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+ |
