diff options
| author | Joey Yakimowich-Payne <jyapayne@gmail.com> | 2020-04-23 16:15:40 -0600 |
|---|---|---|
| committer | Joey Yakimowich-Payne <jyapayne@gmail.com> | 2020-04-26 09:11:56 -0600 |
| commit | c0977fa8271f462c20a29f4bb0976c638a534b45 (patch) | |
| tree | 2d8f1be5febf4dc09922f4af5dbae9e8f7f4e59f | |
| parent | 8a0f7954ae3754258706796ccd018f79ddb0158d (diff) | |
| download | nimterop-c0977fa8271f462c20a29f4bb0976c638a534b45.tar.gz nimterop-c0977fa8271f462c20a29f4bb0976c638a534b45.zip | |
Update code with comments and add debug expr proc
| -rw-r--r-- | nimterop/exprparser.nim | 143 | ||||
| -rw-r--r-- | nimterop/getters.nim | 8 |
2 files changed, 144 insertions, 7 deletions
diff --git a/nimterop/exprparser.nim b/nimterop/exprparser.nim index 047a909..7acb375 100644 --- a/nimterop/exprparser.nim +++ b/nimterop/exprparser.nim @@ -35,6 +35,11 @@ type template val(node: TSNode): string = gState.currentExpr.getNodeVal(node) +proc printDebugExpr*(gState: State, node: TSNode) = + if gState.debug: + gecho ("Input => " & node.val).getCommented() + gecho gState.currentExpr.printLisp(node).getCommented() + proc getExprIdent*(gState: State, identName: string, kind = nskConst, parent = ""): PNode = ## Gets a cPlugin transformed identifier from `identName` ## @@ -187,10 +192,29 @@ proc processNumberLiteral(gState: State, node: TSNode): PNode = raise newException(ExprParseError, &"Could not find a number in number_literal: \"{nodeVal}\"") proc processCharacterLiteral(gState: State, node: TSNode): PNode = + # Input => 'G' + # + # (char_literal 1 1 3 "'G'") + # + # Output => 'G' + # + # nkCharLit("G") let val = node.val result = getCharLit(val[1 ..< val.len - 1]) proc processStringLiteral(gState: State, node: TSNode): PNode = + # Input => "\n\rfoobar\0\'" + # + # (string_literal 1 1 16 ""\n\rfoobar\0\'"" + # (escape_sequence 1 2 2 "\n") + # (escape_sequence 1 4 2 "\r") + # (escape_sequence 1 12 2 "\0") + # (escape_sequence 1 14 2 "\'") + # ) + # + # Output => "\n\cfoobar\x00\'" + # + # nkStrLit("\x0A\x0Dfoobar\x00\'") let nodeVal = node.val strVal = nodeVal[1 ..< nodeVal.len - 1] @@ -209,6 +233,26 @@ proc processStringLiteral(gState: State, node: TSNode): PNode = proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode proc processShiftExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = + # Input => a >> b + # + # (shift_expression 1 2 6 + # (identifier 1 2 1 "a") + # (identifier 1 7 1 "b") + # ) + # + # Output => a shr typeof(a)(b) + # + # nkInfix( + # nkIdent("shr"), + # nkIdent("a"), + # nkCall( + # nkCall( + # nkIdent("typeof"), + # nkIdent("a") + # ), + # nkIdent("b") + # ) + # ) result = newNode(nkInfix) let left = node[0] @@ -244,11 +288,56 @@ proc processShiftExpression(gState: State, node: TSNode, typeofNode: var PNode): ) proc processParenthesizedExpr(gState: State, node: TSNode, typeofNode: var PNode): PNode = + # Input => (a + b) + # + # (parenthesized_expression 1 1 7 + # (math_expression 1 2 5 + # (identifier 1 2 1 "a") + # (identifier 1 6 1 "b") + # ) + # ) + # + # Output => (typeof(a)(a + typeof(a)(b))) + # + # nkPar( + # nkCall( + # nkCall( + # nkIdent("typeof"), + # nkIdent("a") + # ), + # nkInfix( + # nkIdent("+"), + # nkIdent("a"), + # nkCall( + # nkCall( + # nkIdent("typeof"), + # nkIdent("a") + # ), + # nkIdent("b") + # ) + # ) + # ) + # ) result = newNode(nkPar) for i in 0 ..< node.len(): result.add(gState.processTSNode(node[i], typeofNode)) proc processCastExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = + # Input => (int)a + # + # (cast_expression 1 1 6 "(int)a" + # (type_descriptor 1 2 3 "int" + # (primitive_type 1 2 3 "int") + # ) + # (identifier 1 6 1 "a") + # ) + # + # Output => cast[cint](a) + # + # nkCast( + # nkIdent("cint"), + # nkIdent("a") + # ) result = nkCast.newTree( gState.processTSNode(node[0], typeofNode), gState.processTSNode(node[1], typeofNode) @@ -285,6 +374,27 @@ proc getNimBinarySym(csymbol: string): string = proc processBinaryExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = # Node has left and right children ie: (2 + 7) + # + # Input => a == b + # + # (equality_expression 1 1 6 + # (identifier 1 1 1 "a") + # (identifier 1 6 1 "b") + # ) + # + # Output => a == typeof(a)(b) + # + # nkInfix( + # nkIdent("=="), + # nkIdent("a"), + # nkCall( + # nkCall( + # nkIdent("typeof"), + # nkIdent("a") + # ), + # nkIdent("b") + # ) + # ) result = newNode(nkInfix) let @@ -311,6 +421,20 @@ proc processBinaryExpression(gState: State, node: TSNode, typeofNode: var PNode) ) proc processUnaryExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = + # Input => !a + # + # (logical_expression 1 1 2 "!a" + # (identifier 1 2 1 "a") + # ) + # + # Output => (not a) + # + # nkPar( + # nkPrefix( + # nkIdent("not"), + # nkIdent("a") + # ) + # ) result = newNode(nkPar) let @@ -342,6 +466,7 @@ proc processUnaryExpression(gState: State, node: TSNode, typeofNode: var PNode): ) proc processUnaryOrBinaryExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = + ## Processes both unary (-1, ~true, !something) and binary (a + b, c * d) expressions if node.len > 1: # Node has left and right children ie: (2 + 7) @@ -362,6 +487,20 @@ proc processUnaryOrBinaryExpression(gState: State, node: TSNode, typeofNode: var raise newException(ExprParseError, &"Invalid {node.getName()} \"{node.val}\"") proc processSizeofExpression(gState: State, node: TSNode, typeofNode: var PNode): PNode = + # Input => sizeof(int) + # + # (sizeof_expression 1 1 11 "sizeof(int)" + # (type_descriptor 1 8 3 "int" + # (primitive_type 1 8 3 "int") + # ) + # ) + # + # Output => sizeof(cint) + # + # nkCall( + # nkIdent("sizeof"), + # nkIdent("cint") + # ) result = nkCall.newTree( gState.getIdent("sizeof"), gState.processTSNode(node[0], typeofNode) @@ -385,8 +524,8 @@ proc processTSNode(gState: State, node: TSNode, typeofNode: var PNode): PNode = # Output -> "foo\0" result = gState.processStringLiteral(node) of "char_literal": - # Input -> 'F', '\034' // Octal, '\x5A' // Hex, '\r' // escape sequences - # Output -> + # Input -> 'F', '\060' // Octal, '\x5A' // Hex, '\r' // escape sequences + # Output -> 'F', '0', 'Z', '\r' result = gState.processCharacterLiteral(node) of "expression_statement", "ERROR", "translation_unit": # Note that we're parsing partial expressions, so the TSNode might contain diff --git a/nimterop/getters.nim b/nimterop/getters.nim index b7744ce..121c8d5 100644 --- a/nimterop/getters.nim +++ b/nimterop/getters.nim @@ -436,13 +436,13 @@ proc printTree*(gState: State, pnode: PNode, offset = ""): string = result &= "\n# " & offset & $pnode.kind & "(" case pnode.kind of nkCharLit: - result &= "'" & pnode.intVal.char & "')" + result &= ($pnode.intVal.char).escape & ")" of nkIntLit..nkUInt64Lit: result &= $pnode.intVal & ")" of nkFloatLit..nkFloat128Lit: result &= $pnode.floatVal & ")" of nkStrLit..nkTripleStrLit: - result &= "\"" & pnode.strVal & "\")" + result &= pnode.strVal.escape & ")" of nkSym: result &= $pnode.sym & ")" of nkIdent: @@ -460,16 +460,14 @@ proc printTree*(gState: State, pnode: PNode, offset = ""): string = result &= "\n" proc printDebug*(gState: State, node: TSNode) = - # This causes random segfaults for some reason on macOS Catalina if gState.debug: gecho ("Input => " & gState.getNodeVal(node)).getCommented() gecho gState.printLisp(node).getCommented() proc printDebug*(gState: State, pnode: PNode) = - # This causes random segfaults for some reason on macOS Catalina if gState.debug and pnode.kind != nkNone: gecho ("Output => " & $pnode).getCommented() - gecho gState.printTree(pnode).getCommented() + gecho gState.printTree(pnode) # Compiler shortcuts |
