/// <summary> /// Analyzes while cycle. /// </summary> /// <param name="startPos">Start position of a cycle.</param> /// <param name="finishPos">End position of a cycle.</param> /// <param name="parentNode">Tree parent node of a cycle.</param> /// <returns></returns> private DTreeNode <string> processor_while(int startPos, int finishPos, DTreeNode <string> parentNode) { int braceStart, braceFinish = 0; braceStart = findMatchingBraces(startPos, 2, ref braceFinish); DTreeNode <string> node = parentNode.Nodes.Add(LexemTypeHelper.getTypedValue(2, valueOf(startPos))); processor_statement(braceStart + 1, braceFinish - 1, node); braceStart = findMatchingBraces(startPos, 1, ref braceFinish); processor_code(braceStart + 1, braceFinish, node); return(node); }
/// <summary> /// Processes argument list of a method. /// </summary> /// <param name="parentNode">Args parent node to add arguments.</param> /// <param name="curlyStart">Position of open round brace.</param> /// <param name="curlyFinish">Position of close round brace.</param> private void processor_args(DTreeNode <string> parentNode, int braceStart, int braceFinish) { int pos, prevPos = braceStart + 1; DTreeNode <string> node; while ((pos = findFirstIdentOccurence(prevPos)) != -1 && pos < braceFinish) { node = parentNode.Nodes.Add(LexemTypeHelper.getTypedValue(3, valueOf(pos))); for (int i = prevPos; i < pos; i++) { node.Nodes.Add(LexemTypeHelper.getTypedValue(2, valueOf(i))); } prevPos = pos + 2; } }
/// <summary> /// Analyzes variable declaration or using as left part of assignment operator. /// </summary> /// <param name="startPos">Start position of sequence.</param> /// <param name="finishPos">Position of a name of variable.</param> /// <param name="parentNode">Tree node that is a parent of current expression.</param> private DTreeNode <string> processor_variable(int startPos, int finishPos, DTreeNode <string> parentNode) { DTreeNode <string> node = null; int type = 0, value = 0; token.token(finishPos, ref type, ref value); if (type != 3) { error(startPos); } else { node = parentNode.Nodes.Add(LexemTypeHelper.getTypedValue(3, valueOf(finishPos))); for (int i = startPos; i < finishPos; i++) { node.Nodes.Add(LexemTypeHelper.getTypedValue(2, valueOf(i))); } } return(node); }
/// <summary> /// Processes a single method of a class. /// </summary> /// <param name="start">Token, that starts a method (it's name or modifiers).</param> /// <param name="namePos">Method name' position.</param> /// <param name="finish">Position of the close curly brace.</param> /// <param name="parentNode">Tree node "methods" of a wrapping class.</param> private void processor_method(int start, int namePos, int finish, DTreeNode <string> parentNode) { DTreeNode <string> curNode = tree.addNode(parentNode, LexemTypeHelper.getTypedValue(3, valueOf(namePos))); if (valueOf(namePos) == "main") { tree.setEntryPoint(curNode); } for (int i = start; i < namePos; i++) { tree.addNode(curNode, LexemTypeHelper.getTypedValue(2, valueOf(i))); } DTreeNode <string> args = tree.addNode(curNode, LexemTypeHelper.getTypedValue(6, "args")); int closeBrace = 0; findMatchingBraces(namePos, 2, ref closeBrace); processor_args(args, namePos + 1, closeBrace); processor_code(closeBrace + 2, finish, curNode); }
public void printSomeNodes(DTreeNode <string> node, ref int toPrint) { if (node.Nodes.Count > 0) { printSomeNodes(node.Nodes[0], ref toPrint); } Console.WriteLine(LexemTypeHelper.getParsedValue(node.Value)); if (toPrint < 1) { return; } toPrint--; if (toPrint < 1) { return; } if (node.Nodes.Count > 0) { printSomeNodes(node.Nodes[1], ref toPrint); } }