Support for unsigned, function params with pointers

This commit is contained in:
Ganesh Viswanathan 2018-12-03 16:17:13 -06:00
commit ba8c57984b
3 changed files with 44 additions and 6 deletions

View file

@ -12,6 +12,7 @@ const gAtoms = @[
"number_literal", "number_literal",
"preproc_arg", "preproc_arg",
"primitive_type", "primitive_type",
"sized_type_specifier",
"type_identifier" "type_identifier"
] ]
@ -21,7 +22,10 @@ proc saveNodeData(node: TSNode): bool =
var var
val = node.getNodeVal() val = node.getNodeVal()
if name == "primitive_type": if name == "primitive_type" and node.tsNodeParent.tsNodeType() == "sized_type_specifier":
return true
if name in ["primitive_type", "sized_type_specifier"]:
val = val.getType() val = val.getType()
if node.tsNodeParent().tsNodeType() == "pointer_declarator": if node.tsNodeParent().tsNodeType() == "pointer_declarator":
@ -36,6 +40,8 @@ proc searchAstForNode(ast: ref Ast, node: TSNode): bool =
let let
childNames = node.getTSNodeNamedChildNames().join() childNames = node.getTSNodeNamedChildNames().join()
if ast.isNil:
return
if ast.children.len != 0: if ast.children.len != 0:
let let
rstr = ast.getRegexForAstChildren() rstr = ast.getRegexForAstChildren()

View file

@ -13,7 +13,12 @@ proc getIdentifier*(str: string): string =
result = str.strip(chars={'_'}) result = str.strip(chars={'_'})
proc getType*(str: string): string = proc getType*(str: string): string =
result = str.strip(chars={'_'}).replace(re"([u]?int[\d]+)_t", "$1").replace(re"^void$", "object") if str == "void":
return "object"
result = str.strip(chars={'_'}).
replace("unsigned ", "u").
replace(re"([u]?int[\d]+)_t", "$1")
proc getLit*(str: string): string = proc getLit*(str: string): string =
if str.contains(re"^[\-]?[\d]+$") or if str.contains(re"^[\-]?[\d]+$") or

View file

@ -15,7 +15,7 @@ proc initGrammar() =
name = gStateRT.data[0].val.getIdentifier() name = gStateRT.data[0].val.getIdentifier()
val = gStateRT.data[1].val val = gStateRT.data[1].val
if name notin gStateRT.consts: if name notin gStateRT.consts and val.nBl:
gStateRT.consts.add(name) gStateRT.consts.add(name)
gStateRT.constStr &= &" {name}* = {val}\n" gStateRT.constStr &= &" {name}* = {val}\n"
)) ))
@ -27,6 +27,9 @@ proc initGrammar() =
gStateRT.grammar.add((""" gStateRT.grammar.add(("""
(type_definition (type_definition
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
@ -66,6 +69,9 @@ proc initGrammar() =
(field_declaration_list (field_declaration_list
(field_declaration+ (field_declaration+
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
@ -88,6 +94,9 @@ proc initGrammar() =
(field_declaration_list (field_declaration_list
(field_declaration+ (field_declaration+
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
@ -163,6 +172,9 @@ proc initGrammar() =
gStateRT.grammar.add((""" gStateRT.grammar.add(("""
(declaration (declaration
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
@ -171,13 +183,19 @@ proc initGrammar() =
(parameter_list (parameter_list
(parameter_declaration* (parameter_declaration*
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
(enum_specifier? (enum_specifier?
(type_identifier) (type_identifier)
) )
(identifier) (identifier?)
(pointer_declarator?
(identifier)
)
) )
) )
) )
@ -187,13 +205,19 @@ proc initGrammar() =
(parameter_list (parameter_list
(parameter_declaration* (parameter_declaration*
(primitive_type|type_identifier?) (primitive_type|type_identifier?)
(sized_type_specifier?
(primitive_type)
)
(struct_specifier? (struct_specifier?
(type_identifier) (type_identifier)
) )
(enum_specifier? (enum_specifier?
(type_identifier) (type_identifier)
) )
(identifier) (identifier?)
(pointer_declarator?
(identifier)
)
) )
) )
) )
@ -220,7 +244,10 @@ proc initGrammar() =
if pout.len != 0 and pout[^1] == ',': if pout.len != 0 and pout[^1] == ',':
pout = pout[0 .. ^2] pout = pout[0 .. ^2]
gStateRT.procStr &= &"proc {fnname}({pout}): {ftyp} {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n" if ftyp != "object":
gStateRT.procStr &= &"proc {fnname}({pout}): {ftyp} {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n"
else:
gStateRT.procStr &= &"proc {fnname}({pout}) {{.importc: \"{fname}\", header: {gStateRT.currentHeader}.}}\n"
)) ))