예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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;
            }
        }
예제 #3
0
        /// <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);
        }
예제 #4
0
        /// <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);
        }
예제 #5
0
 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);
     }
 }