summaryrefslogtreecommitdiffstats
path: root/src/CodeParser/CParser/ParseTree.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/CodeParser/CParser/ParseTree.ts')
-rw-r--r--src/CodeParser/CParser/ParseTree.ts133
1 files changed, 17 insertions, 116 deletions
diff --git a/src/CodeParser/CParser/ParseTree.ts b/src/CodeParser/CParser/ParseTree.ts
index 9090212..bec5b91 100644
--- a/src/CodeParser/CParser/ParseTree.ts
+++ b/src/CodeParser/CParser/ParseTree.ts
@@ -51,7 +51,7 @@ export class ParseTree {
.map((n) => n instanceof ParseTree && isNotCompact(n) ? n.nodes[0] : n);
}
- // Compact all nested parsetrees and filter out empty branches.
+ // Compact all nested parsetrees.
newTree.nodes = newTree.nodes
.map((n) => n instanceof ParseTree ? this.Compact(n) : n);
@@ -59,14 +59,26 @@ export class ParseTree {
}
/**
+ * Copy parsetree.
+ * @param tree The ParseTree to compact. Defaults to the current tree.
+ */
+ public Copy(tree: ParseTree = this): ParseTree {
+ const newTree: ParseTree = new ParseTree();
+ newTree.nodes = tree.nodes
+ .map((n) => n instanceof Token ? n : this.Copy(n));
+ return newTree;
+ }
+
+ /**
* Create string from the parsetree which is a representation of the original code.
+ * @param tree The ParseTree to compact. Defaults to the current tree.
*/
- public ToString(tree: ParseTree = this): string {
+ public Yield(tree: ParseTree = this): string {
let code: string = "";
for (const node of tree.nodes) {
if (node instanceof ParseTree) {
- code += "(" + this.ToString(node) + ")";
+ code += "(" + this.Yield(node) + ")";
continue;
}
@@ -87,13 +99,13 @@ export class ParseTree {
code += node.Value;
break;
case TokenType.Assignment:
- code += " " + node.Value + " ";
+ code += " " + node.Value;
break;
case TokenType.Comma:
code += node.Value;
break;
case TokenType.Arrow:
- code += " " + node.Value + " ";
+ code += " " + node.Value;
break;
case TokenType.Ellipsis:
code += node.Value;
@@ -106,115 +118,4 @@ export class ParseTree {
return code;
}
-
- /**
- * Get the tree for the return.
- */
- public GetReturnTree(): ParseTree {
- const returnTree: ParseTree = new ParseTree();
-
- const indexTrailingReturn: number = this.nodes
- .findIndex((t) => t instanceof Token ? t.Type === TokenType.Arrow : false);
-
- const isFuncPtr: boolean = this.nodes
- .slice(0, indexTrailingReturn === -1 ? this.nodes.length : indexTrailingReturn)
- .filter((n) => n instanceof ParseTree)
- .length === 2;
-
- if (isFuncPtr === true) {
- const trees: ParseTree[] = this.nodes
- .filter((n) => n instanceof ParseTree)
- .map((n) => n as ParseTree);
-
- // Add left most part to the return tokens.
- for (const node of this.nodes) {
- if (node instanceof ParseTree) {
- break;
- }
- returnTree.nodes.push(node);
- }
-
- // add left and right parse tree to return tokens
- const leftTree: ParseTree = new ParseTree();
- for (const node of trees[0].nodes) {
- if (node instanceof ParseTree) {
- break;
- }
- leftTree.nodes.push(node);
- }
-
- returnTree.nodes.push(leftTree);
- returnTree.nodes.push(trees[1]);
- } else if (indexTrailingReturn !== -1) {
- returnTree.nodes = this.nodes
- .slice(indexTrailingReturn + 1, this.nodes.length);
-
- // Don't include the auto so start from index 1.
- for (let i: number = 1; i < this.nodes.length; i++) {
- if (this.nodes[i] instanceof ParseTree) {
- break;
- }
- returnTree.nodes.push(this.nodes[i]);
- }
- } else {
- for (const node of this.nodes) {
- if (node instanceof ParseTree) {
- break;
- }
- returnTree.nodes.push(node);
- }
- }
-
- return returnTree;
- }
-
- /**
- * Get the arguments of the function and create a new ParseTree for each one.
- */
- public GetArgTrees(): ParseTree[] {
- const args: ParseTree[] = [];
-
- const indexTrailingReturn: number = this.nodes
- .findIndex((t) => t instanceof Token ? t.Type === TokenType.Arrow : false);
-
- const isFuncPtr: boolean = this.nodes
- .slice(0, indexTrailingReturn === -1 ? this.nodes.length : indexTrailingReturn)
- .filter((n) => n instanceof ParseTree)
- .length === 2;
-
- let argsTree: ParseTree = this.nodes
- .filter((n) => n instanceof ParseTree)
- .map((t) => t as ParseTree)[0];
-
- // If it is a func ptr get the nested tree.
- if (isFuncPtr === true) {
- argsTree = argsTree.nodes
- .filter((n) => n instanceof ParseTree)
- .map((t) => t as ParseTree)[0];
- }
-
- if (argsTree === undefined) {
- throw new Error("Couldn't find arguments tree");
- }
-
- // split args at command and create a tree for each one.
- let lastComma: number = 0;
- for (let i = 0; i < argsTree.nodes.length; i++) {
- const node = argsTree.nodes[i];
- if (node instanceof Token && node.Type === TokenType.Comma) {
- const tree: ParseTree = new ParseTree();
- tree.nodes = argsTree.nodes.slice(lastComma, i);
- args.push(tree);
- lastComma = i + 1;
- }
- }
-
- const lastArgTree: ParseTree = new ParseTree();
- lastArgTree.nodes = argsTree.nodes.slice(lastComma, argsTree.nodes.length);
- if (lastArgTree.nodes.length > 0) {
- args.push(lastArgTree);
- }
-
- return args;
- }
}