diff options
Diffstat (limited to 'src/CodeParser/CParser/ParseTree.ts')
| -rw-r--r-- | src/CodeParser/CParser/ParseTree.ts | 133 |
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; - } } |