private static void CreateOrUpdateAbstractNodeFromConcreteNode(
            ConcreteNode srcNode,
            Cluster cluster,
            ref int abstractNodeId,
            int level,
            Dictionary <Id <ConcreteNode>, AbstractNodeInfo> abstractNodes)
        {
            AbstractNodeInfo abstractNodeInfo;

            if (!abstractNodes.TryGetValue(srcNode.NodeId, out abstractNodeInfo))
            {
                cluster.AddEntrance(
                    Id <AbstractNode> .From(abstractNodeId),
                    new Position(srcNode.Info.Position.X - cluster.Origin.X, srcNode.Info.Position.Y - cluster.Origin.Y));

                abstractNodeInfo = new AbstractNodeInfo(
                    Id <AbstractNode> .From(abstractNodeId),
                    level,
                    cluster.Id,
                    new Position(srcNode.Info.Position.X, srcNode.Info.Position.Y),
                    srcNode.NodeId);
                abstractNodes[srcNode.NodeId] = abstractNodeInfo;

                abstractNodeId++;
            }
            else if (level > abstractNodeInfo.Level)
            {
                abstractNodeInfo.Level = level;
            }
        }
Esempio n. 2
0
        public void DetermineLevel_WhenOnEdgeOfLevel2Cluster_ReturnLevel2(Orientation orientation, int x, int y, int maxLevel, int expectedLevel)
        {
            var srcNode  = new ConcreteNode(Id <ConcreteNode> .From(1), new ConcreteNodeInfo(false, 1, new Position(x, y)));
            var entrance = new Entrance(Id <Entrance> .From(1), null, null, srcNode, null, orientation);

            Assert.AreEqual(expectedLevel, entrance.GetEntranceLevel(10, maxLevel));
        }
Esempio n. 3
0
    void Start()
    {
        m_concreteNodeContainer = transform.Find("ConcreteNodeContainer");
        m_clusterContainer      = transform.Find("ClusterContainer");

        m_levelChooser.onValueChanged.AddListener(OnChooseLevel);

        m_concreteMap = new ConcreteMap(m_width, m_height);
        int nodeId = 0;

        for (int y = 0; y < m_height; y++)
        {
            for (int x = 0; x < m_width; x++)
            {
                GameObject go = GameObject.Instantiate(m_concreteNodePrefab);
                go.name = $"ConcreteNode({x}, {y})";
                go.transform.SetParent(m_concreteNodeContainer);
                go.transform.localPosition = new Vector3(x, y, 0);

                ConcreteNode node = go.GetComponent <ConcreteNode>();
                node.Init(nodeId++, x, y);
                m_concreteMap.AddNode(x, y, node);
            }
        }

        m_startNode = m_concreteMap.GetNode(0, m_height / 2);
        m_startNode.SetSearchType(SearchType.Start);
        m_goalNode = m_concreteMap.GetNode(m_width - 1, m_height / 2);
        m_goalNode.SetSearchType(SearchType.Goal);
    }
Esempio n. 4
0
    public EntrancePoint AddEntrancePoint(int abstractId, ConcreteNode node)
    {
        EntrancePoint point = new EntrancePoint(abstractId, node);

        EntrancePoints.Add(point);
        return(point);
    }
Esempio n. 5
0
 public Entrance(Cluster cluster1, Cluster cluster2, ConcreteNode node1, ConcreteNode node2, Orientation orientation)
 {
     Cluster1    = cluster1;
     Cluster2    = cluster2;
     Node1       = node1;
     Node2       = node2;
     Orientation = orientation;
 }
Esempio n. 6
0
    private void RemoveObstacle()
    {
        ConcreteNode node = GetMouseOverNode();

        if (node != null && node != m_startNode && node != m_goalNode)
        {
            node.SetCost(Define.c_costGround);
        }
    }
Esempio n. 7
0
        public Entrance(Id <Entrance> id, Cluster cluster1, Cluster cluster2, ConcreteNode srcNode, ConcreteNode destNode, Orientation orientation)
        {
            Id       = id;
            Cluster1 = cluster1;
            Cluster2 = cluster2;

            SrcNode  = srcNode;
            DestNode = destNode;

            Orientation = orientation;
        }
Esempio n. 8
0
    private void DragGoalNode()
    {
        ConcreteNode node = GetMouseOverNode();

        if (node == null)
        {
            return;
        }

        m_goalNode.SetSearchType(SearchType.None, false);
        m_goalNode = node;
        m_goalNode.SetSearchType(SearchType.Goal);
    }
Esempio n. 9
0
    private ConcreteNode GetMouseOverNode()
    {
        ConcreteNode result = null;

        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        if (Physics.Raycast(ray, out RaycastHit hit))
        {
            result = hit.collider.GetComponent <ConcreteNode>();
        }

        return(result);
    }
    private void CreateEntranceImpl(List <ConcreteNode> prevNodes, List <ConcreteNode> curtNodes, Cluster prevCluster, Cluster curtCluster, Orientation orientation, List <Entrance> result)
    {
        int          size = 0;
        ConcreteNode prevBegin = null, curtBegin = null;

        for (int i = 0; i < prevNodes.Count; i++)
        {
            ConcreteNode prev = prevNodes[i];
            ConcreteNode curt = curtNodes[i];

            if (prevBegin == null)
            {
                prevBegin = prev;
                curtBegin = curt;
            }

            if (!prev.IsObstacle && !curt.IsObstacle)
            {
                size++;
            }

            if ((prev.IsObstacle || curt.IsObstacle || i == prevNodes.Count - 1) && size > 0)
            {
                if (size >= c_maxEntranceSize)
                {
                    //取两边
                    result.Add(new Entrance(prevCluster, curtCluster, prevBegin, curtBegin, orientation));
                    result.Add(new Entrance(prevCluster, curtCluster, prev, curt, orientation));
                }
                else
                {
                    //取中间
                    int          centerX    = (prevBegin.Pos.x + prev.Pos.x) / 2;
                    int          centerY    = (prevBegin.Pos.y + prev.Pos.y) / 2;
                    ConcreteNode prevCenter = m_concreteMap.GetNode(centerX, centerY);

                    centerX = (curtBegin.Pos.x + curt.Pos.x) / 2;
                    centerY = (curtBegin.Pos.y + curt.Pos.y) / 2;
                    ConcreteNode curtCenter = m_concreteMap.GetNode(centerX, centerY);

                    result.Add(new Entrance(prevCluster, curtCluster, prevCenter, curtCenter, orientation));
                }

                //清理
                prevBegin = curtBegin = null;
                size      = 0;
            }
        }
    }
Esempio n. 11
0
    private bool TryAddNode(Vector2Int curtPos, int dx, int dy, List <INode> result)
    {
        int          x    = curtPos.x + dx;
        int          y    = curtPos.y + dy;
        ConcreteNode node = GetNode(x, y);

        if (node != null && !node.IsObstacle)
        {
            result.Add(node);
            return(true);
        }
        else
        {
            return(false);
        }
    }
Esempio n. 12
0
        public IList <ConcreteNode> ParseChunk(IList <ScriptToken> tokens)
        {
            IList <ConcreteNode> nodes = new List <ConcreteNode>();
            ConcreteNode         node  = null;

            foreach (var token in tokens)
            {
                switch (token.type)
                {
                case Tokens.Variable:
                    node        = new ConcreteNode();
                    node.Token  = token.lexeme;
                    node.Type   = ConcreteNodeType.Variable;
                    node.File   = token.file;
                    node.Line   = token.line;
                    node.Parent = null;
                    break;

                case Tokens.Word:
                    node        = new ConcreteNode();
                    node.Token  = token.lexeme;
                    node.Type   = ConcreteNodeType.Word;
                    node.File   = token.file;
                    node.Line   = token.line;
                    node.Parent = null;
                    break;

                case Tokens.Quote:
                    node        = new ConcreteNode();
                    node.Token  = token.lexeme.Substring(1, token.lexeme.Length - 2);
                    node.Type   = ConcreteNodeType.Quote;
                    node.File   = token.file;
                    node.Line   = token.line;
                    node.Parent = null;
                    break;

                default:
                    throw new Exception(String.Format("unexpected token {0} at line {1}.", token.lexeme, token.line));
                }

                if (node != null)
                {
                    nodes.Add(node);
                }
            }
            return(nodes);
        }
Esempio n. 13
0
 void Update()
 {
     if (Input.GetMouseButtonDown(0))
     {
         ConcreteNode node = GetMouseOverNode();
         if (node == m_startNode)
         {
             m_dragStartNode = true;
         }
         else if (node == m_goalNode)
         {
             m_dragGoalNode = true;
         }
     }
     else if (Input.GetMouseButtonUp(0))
     {
         m_dragStartNode = m_dragGoalNode = false;
     }
     else if (Input.GetMouseButton(0))
     {
         if (m_dragStartNode)
         {
             DragStartNode();
         }
         else if (m_dragGoalNode)
         {
             DragGoalNode();
         }
         else
         {
             AddObstacle();
         }
     }
     else if (Input.GetMouseButton(1))
     {
         RemoveObstacle();
     }
     else if (Input.GetKeyDown(KeyCode.Space))
     {
         Reset();
         Generate();
     }
 }
    private void CreateOrUpdateAbstractNode(ConcreteNode node, Cluster cluster, int level, Dictionary <Vector2Int, AbstractNode> abstractDict, ref int abstractId)
    {
        AbstractNode abstractNode;

        if (abstractDict.TryGetValue(node.Pos, out abstractNode))
        {
            if (level > abstractNode.Level)
            {
                abstractNode.Level = level;
            }
        }
        else
        {
            cluster.AddEntrancePoint(abstractId, node);
            abstractNode = HPADemo.Instance.CreateAbstractNode(level, node.Pos);
            abstractNode.Init(abstractId, level, cluster.Id, node.Pos);
            abstractDict[node.Pos] = abstractNode;
            abstractId++;
        }
    }
Esempio n. 15
0
		public IList<ConcreteNode> Parse( IList<ScriptToken> tokens )
		{
			var nodes = new List<ConcreteNode>();

			var state = ParserState.Ready;
			ScriptToken token;
			ConcreteNode parent = null, node = null;

			var iter = 0;
			var end = tokens.Count;

			while ( iter != end )
			{
				token = tokens[ iter ];
				switch ( state )
				{
						#region Ready

					case ParserState.Ready:
						switch ( token.type )
						{
								#region Word

							case Tokens.Word:
								switch ( token.lexeme )
								{
										#region "import"

									case "import":
										node = new ConcreteNode();
										node.Token = token.lexeme;
										node.File = token.file;
										node.Line = token.line;
										node.Type = ConcreteNodeType.Import;

										// The next token is the target
										iter++;
										if ( iter == end || ( tokens[ iter ].type != Tokens.Word && tokens[ iter ].type != Tokens.Quote ) )
										{
											throw new Exception( String.Format( "Expected import target at line {0}", node.Line ) );
										}

										var temp = new ConcreteNode();
										temp.Parent = node;
										temp.File = tokens[ iter ].file;
										temp.Line = tokens[ iter ].line;
										temp.Type = tokens[ iter ].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
										if ( temp.Type == ConcreteNodeType.Quote )
										{
											temp.Token = tokens[ iter ].lexeme.Substring( 1, token.lexeme.Length - 2 );
										}
										else
										{
											temp.Token = tokens[ iter ].lexeme;
										}
										node.Children.Add( temp );

										// The second-next token is the source
										iter++; // "from"
										iter++;
										if ( iter == end || ( tokens[ iter ].type != Tokens.Word && tokens[ iter ].type != Tokens.Quote ) )
										{
											throw new Exception( String.Format( "Expected import source at line {0}", node.Line ) );
										}

										temp = new ConcreteNode();
										temp.Parent = node;
										temp.File = tokens[ iter ].file;
										temp.Line = tokens[ iter ].line;
										temp.Type = tokens[ iter ].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
										if ( temp.Type == ConcreteNodeType.Quote )
										{
											temp.Token = tokens[ iter ].lexeme.Substring( 1, token.lexeme.Length - 2 );
										}
										else
										{
											temp.Token = tokens[ iter ].lexeme;
										}
										node.Children.Add( temp );

										// Consume all the newlines
										iter = SkipNewlines( tokens, iter, end );

										// Insert the node
										if ( parent != null )
										{
											node.Parent = parent;
											parent.Children.Add( node );
										}
										else
										{
											node.Parent = null;
											nodes.Add( node );
										}
										node = null;
										break;

										#endregion "import"

										#region "set"

									case "set":
										node = new ConcreteNode();
										node.Token = token.lexeme;
										node.File = token.file;
										node.Line = token.line;
										node.Type = ConcreteNodeType.VariableAssignment;

										// The next token is the variable
										++iter;
										if ( iter == end || tokens[ iter ].type != Tokens.Variable )
										{
											throw new Exception( string.Format( "expected variable name at line {0}", node.Line ) );
										}

										temp = new ConcreteNode();
										temp.Parent = node;
										temp.File = tokens[ iter ].file;
										temp.Line = tokens[ iter ].line;
										temp.Type = ConcreteNodeType.Variable;
										temp.Token = tokens[ iter ].lexeme;
										node.Children.Add( temp );

										// The next token is the assignment
										++iter;
										if ( iter == end || ( tokens[ iter ].type != Tokens.Word && tokens[ iter ].type != Tokens.Quote ) )
										{
											throw new Exception( string.Format( "expected variable name at line {0}", node.Line ) );
										}

										temp = new ConcreteNode();
										temp.Parent = node;
										temp.File = tokens[ iter ].file;
										temp.Line = tokens[ iter ].line;
										temp.Type = tokens[ iter ].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
										if ( temp.Type == ConcreteNodeType.Quote )
										{
											temp.Token = tokens[ iter ].lexeme.Substring( 1, tokens[ iter ].lexeme.Length - 2 );
										}
										else
										{
											temp.Token = tokens[ iter ].lexeme;
										}
										node.Children.Add( temp );

										// Consume all the newlines
										iter = SkipNewlines( tokens, iter, end );

										// Insert the node
										if ( parent != null )
										{
											node.Parent = parent;
											parent.Children.Add( node );
										}
										else
										{
											node.Parent = null;
											nodes.Add( node );
										}
										node = null;
										break;

										#endregion "set"

									default:
										node = new ConcreteNode();
										node.File = token.file;
										node.Line = token.line;
										node.Type = token.type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
										if ( node.Type == ConcreteNodeType.Quote )
										{
											node.Token = token.lexeme.Substring( 1, token.lexeme.Length - 2 );
										}
										else
										{
											node.Token = token.lexeme;
										}

										// Insert the node
										if ( parent != null )
										{
											node.Parent = parent;
											parent.Children.Add( node );
										}
										else
										{
											node.Parent = null;
											nodes.Add( node );
										}

										// Set the parent
										parent = node;

										// Switch states
										state = ParserState.Object;

										node = null;

										break;
								}
								break;

								#endregion Word

								#region RightBrace

							case Tokens.RightBrace:
								// Go up one level if we can
								if ( parent != null )
								{
									parent = parent.Parent;
								}

								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.RightBrace;

								// Consume all the newlines
								iter = SkipNewlines( tokens, iter, end );

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								// Move up another level
								if ( parent != null )
								{
									parent = parent.Parent;
								}

								node = null;

								break;

								#endregion RightBrace
						}
						break;

						#endregion Ready

						#region Object

					case ParserState.Object:
						switch ( token.type )
						{
								#region Newline

							case Tokens.Newline:
								// Look ahead to the next non-newline token and if it isn't an {, this was a property
								var next = SkipNewlines( tokens, iter, end );
								if ( next == end || tokens[ next ].type != Tokens.LeftBrace )
								{
									// Ended a property here
									if ( parent != null )
									{
										parent = parent.Parent;
									}
									state = ParserState.Ready;
								}
								node = null;
								break;

								#endregion Newline

								#region Colon

							case Tokens.Colon:
								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.Colon;

								// The following token are the parent objects (base classes).
								// Require at least one of them.

								var j = iter + 1;
								j = SkipNewlines( tokens, j, end );
								if ( j == end || ( tokens[ j ].type != Tokens.Word && tokens[ j ].type != Tokens.Quote ) )
								{
									throw new Exception( String.Format( "Expected object identifier at line {0}", node.Line ) );
								}

								while ( j != end && ( tokens[ j ].type == Tokens.Word || tokens[ j ].type == Tokens.Quote ) )
								{
									var tempNode = new ConcreteNode();
									tempNode.Token = tokens[ j ].lexeme;
									tempNode.File = tokens[ j ].file;
									tempNode.Line = tokens[ j ].line;
									tempNode.Type = tokens[ j ].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
									tempNode.Parent = node;
									node.Children.Add( tempNode );
									++j;
								}

								// Move it backwards once, since the end of the loop moves it forwards again anyway
								j--;
								iter = j;

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}
								node = null;
								break;

								#endregion Colon

								#region LeftBrace

							case Tokens.LeftBrace:
								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.LeftBrace;

								// Skip newlines
								iter = SkipNewlines( tokens, iter, end );

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								// Set the parent
								parent = node;

								// Change the state
								state = ParserState.Ready;

								node = null;
								break;

								#endregion LeftBrace

								#region RightBrace

							case Tokens.RightBrace:

								// Go up one level if we can
								if ( parent != null )
								{
									parent = parent.Parent;
								}

								// If the parent is currently a { then go up again
								if ( parent != null && parent.Type == ConcreteNodeType.LeftBrace && parent.Parent != null )
								{
									parent = parent.Parent;
								}

								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.RightBrace;

								// Skip newlines
								iter = SkipNewlines( tokens, iter, end );

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								//Move up another level
								if ( parent != null )
								{
									parent = parent.Parent;
								}

								node = null;
								state = ParserState.Ready;

								break;

								#endregion RightBrace

								#region Variable

							case Tokens.Variable:
								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.Variable;

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								node = null;
								break;

								#endregion Variable

								#region Quote

							case Tokens.Quote:
								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme.Substring( 1, token.lexeme.Length - 2 );
								node.Type = ConcreteNodeType.Quote;

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								node = null;
								break;

								#endregion Quote

								#region Word

							case Tokens.Word:
								node = new ConcreteNode();
								node.File = token.file;
								node.Line = token.line;
								node.Token = token.lexeme;
								node.Type = ConcreteNodeType.Word;

								// Insert the node
								if ( parent != null )
								{
									node.Parent = parent;
									parent.Children.Add( node );
								}
								else
								{
									node.Parent = null;
									nodes.Add( node );
								}

								node = null;
								break;

								#endregion Word
						}
						break;

						#endregion Object
				}
				iter++;
			}

			return nodes;
		}
Esempio n. 16
0
		public IList<ConcreteNode> ParseChunk( IList<ScriptToken> tokens )
		{
			IList<ConcreteNode> nodes = new List<ConcreteNode>();
			ConcreteNode node = null;
			foreach ( var token in tokens )
			{
				switch ( token.type )
				{
					case Tokens.Variable:
						node = new ConcreteNode();
						node.Token = token.lexeme;
						node.Type = ConcreteNodeType.Variable;
						node.File = token.file;
						node.Line = token.line;
						node.Parent = null;
						break;

					case Tokens.Word:
						node = new ConcreteNode();
						node.Token = token.lexeme;
						node.Type = ConcreteNodeType.Word;
						node.File = token.file;
						node.Line = token.line;
						node.Parent = null;
						break;

					case Tokens.Quote:
						node = new ConcreteNode();
						node.Token = token.lexeme.Substring( 1, token.lexeme.Length - 2 );
						node.Type = ConcreteNodeType.Quote;
						node.File = token.file;
						node.Line = token.line;
						node.Parent = null;
						break;

					default:
						throw new Exception( String.Format( "unexpected token {0} at line {1}.", token.lexeme, token.line ) );
				}

				if ( node != null )
				{
					nodes.Add( node );
				}
			}
			return nodes;
		}
Esempio n. 17
0
        public IList <ConcreteNode> Parse(IList <ScriptToken> tokens)
        {
            var nodes = new List <ConcreteNode>();

            var          state = ParserState.Ready;
            ScriptToken  token;
            ConcreteNode parent = null, node = null;

            var iter = 0;
            var end  = tokens.Count;

            while (iter != end)
            {
                token = tokens[iter];
                switch (state)
                {
                    #region Ready

                case ParserState.Ready:
                    switch (token.type)
                    {
                        #region Word

                    case Tokens.Word:
                        switch (token.lexeme)
                        {
                            #region "import"

                        case "import":
                            node       = new ConcreteNode();
                            node.Token = token.lexeme;
                            node.File  = token.file;
                            node.Line  = token.line;
                            node.Type  = ConcreteNodeType.Import;

                            // The next token is the target
                            iter++;
                            if (iter == end || (tokens[iter].type != Tokens.Word && tokens[iter].type != Tokens.Quote))
                            {
                                throw new Exception(String.Format("Expected import target at line {0}", node.Line));
                            }

                            var temp = new ConcreteNode();
                            temp.Parent = node;
                            temp.File   = tokens[iter].file;
                            temp.Line   = tokens[iter].line;
                            temp.Type   = tokens[iter].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
                            if (temp.Type == ConcreteNodeType.Quote)
                            {
                                temp.Token = tokens[iter].lexeme.Substring(1, token.lexeme.Length - 2);
                            }
                            else
                            {
                                temp.Token = tokens[iter].lexeme;
                            }
                            node.Children.Add(temp);

                            // The second-next token is the source
                            iter++;             // "from"
                            iter++;
                            if (iter == end || (tokens[iter].type != Tokens.Word && tokens[iter].type != Tokens.Quote))
                            {
                                throw new Exception(String.Format("Expected import source at line {0}", node.Line));
                            }

                            temp        = new ConcreteNode();
                            temp.Parent = node;
                            temp.File   = tokens[iter].file;
                            temp.Line   = tokens[iter].line;
                            temp.Type   = tokens[iter].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
                            if (temp.Type == ConcreteNodeType.Quote)
                            {
                                temp.Token = tokens[iter].lexeme.Substring(1, token.lexeme.Length - 2);
                            }
                            else
                            {
                                temp.Token = tokens[iter].lexeme;
                            }
                            node.Children.Add(temp);

                            // Consume all the newlines
                            iter = SkipNewlines(tokens, iter, end);

                            // Insert the node
                            if (parent != null)
                            {
                                node.Parent = parent;
                                parent.Children.Add(node);
                            }
                            else
                            {
                                node.Parent = null;
                                nodes.Add(node);
                            }
                            node = null;
                            break;

                            #endregion "import"

                            #region "set"

                        case "set":
                            node       = new ConcreteNode();
                            node.Token = token.lexeme;
                            node.File  = token.file;
                            node.Line  = token.line;
                            node.Type  = ConcreteNodeType.VariableAssignment;

                            // The next token is the variable
                            ++iter;
                            if (iter == end || tokens[iter].type != Tokens.Variable)
                            {
                                throw new Exception(string.Format("expected variable name at line {0}", node.Line));
                            }

                            temp        = new ConcreteNode();
                            temp.Parent = node;
                            temp.File   = tokens[iter].file;
                            temp.Line   = tokens[iter].line;
                            temp.Type   = ConcreteNodeType.Variable;
                            temp.Token  = tokens[iter].lexeme;
                            node.Children.Add(temp);

                            // The next token is the assignment
                            ++iter;
                            if (iter == end || (tokens[iter].type != Tokens.Word && tokens[iter].type != Tokens.Quote))
                            {
                                throw new Exception(string.Format("expected variable name at line {0}", node.Line));
                            }

                            temp        = new ConcreteNode();
                            temp.Parent = node;
                            temp.File   = tokens[iter].file;
                            temp.Line   = tokens[iter].line;
                            temp.Type   = tokens[iter].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
                            if (temp.Type == ConcreteNodeType.Quote)
                            {
                                temp.Token = tokens[iter].lexeme.Substring(1, tokens[iter].lexeme.Length - 2);
                            }
                            else
                            {
                                temp.Token = tokens[iter].lexeme;
                            }
                            node.Children.Add(temp);

                            // Consume all the newlines
                            iter = SkipNewlines(tokens, iter, end);

                            // Insert the node
                            if (parent != null)
                            {
                                node.Parent = parent;
                                parent.Children.Add(node);
                            }
                            else
                            {
                                node.Parent = null;
                                nodes.Add(node);
                            }
                            node = null;
                            break;

                            #endregion "set"

                        default:
                            node      = new ConcreteNode();
                            node.File = token.file;
                            node.Line = token.line;
                            node.Type = token.type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
                            if (node.Type == ConcreteNodeType.Quote)
                            {
                                node.Token = token.lexeme.Substring(1, token.lexeme.Length - 2);
                            }
                            else
                            {
                                node.Token = token.lexeme;
                            }

                            // Insert the node
                            if (parent != null)
                            {
                                node.Parent = parent;
                                parent.Children.Add(node);
                            }
                            else
                            {
                                node.Parent = null;
                                nodes.Add(node);
                            }

                            // Set the parent
                            parent = node;

                            // Switch states
                            state = ParserState.Object;

                            node = null;

                            break;
                        }
                        break;

                        #endregion Word

                        #region RightBrace

                    case Tokens.RightBrace:
                        // Go up one level if we can
                        if (parent != null)
                        {
                            parent = parent.Parent;
                        }

                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.RightBrace;

                        // Consume all the newlines
                        iter = SkipNewlines(tokens, iter, end);

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        // Move up another level
                        if (parent != null)
                        {
                            parent = parent.Parent;
                        }

                        node = null;

                        break;

                        #endregion RightBrace
                    }
                    break;

                    #endregion Ready

                    #region Object

                case ParserState.Object:
                    switch (token.type)
                    {
                        #region Newline

                    case Tokens.Newline:
                        // Look ahead to the next non-newline token and if it isn't an {, this was a property
                        var next = SkipNewlines(tokens, iter, end);
                        if (next == end || tokens[next].type != Tokens.LeftBrace)
                        {
                            // Ended a property here
                            if (parent != null)
                            {
                                parent = parent.Parent;
                            }
                            state = ParserState.Ready;
                        }
                        node = null;
                        break;

                        #endregion Newline

                        #region Colon

                    case Tokens.Colon:
                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.Colon;

                        // The following token are the parent objects (base classes).
                        // Require at least one of them.

                        var j = iter + 1;
                        j = SkipNewlines(tokens, j, end);
                        if (j == end || (tokens[j].type != Tokens.Word && tokens[j].type != Tokens.Quote))
                        {
                            throw new Exception(String.Format("Expected object identifier at line {0}", node.Line));
                        }

                        while (j != end && (tokens[j].type == Tokens.Word || tokens[j].type == Tokens.Quote))
                        {
                            var tempNode = new ConcreteNode();
                            tempNode.Token  = tokens[j].lexeme;
                            tempNode.File   = tokens[j].file;
                            tempNode.Line   = tokens[j].line;
                            tempNode.Type   = tokens[j].type == Tokens.Word ? ConcreteNodeType.Word : ConcreteNodeType.Quote;
                            tempNode.Parent = node;
                            node.Children.Add(tempNode);
                            ++j;
                        }

                        // Move it backwards once, since the end of the loop moves it forwards again anyway
                        j--;
                        iter = j;

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }
                        node = null;
                        break;

                        #endregion Colon

                        #region LeftBrace

                    case Tokens.LeftBrace:
                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.LeftBrace;

                        // Skip newlines
                        iter = SkipNewlines(tokens, iter, end);

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        // Set the parent
                        parent = node;

                        // Change the state
                        state = ParserState.Ready;

                        node = null;
                        break;

                        #endregion LeftBrace

                        #region RightBrace

                    case Tokens.RightBrace:

                        // Go up one level if we can
                        if (parent != null)
                        {
                            parent = parent.Parent;
                        }

                        // If the parent is currently a { then go up again
                        if (parent != null && parent.Type == ConcreteNodeType.LeftBrace && parent.Parent != null)
                        {
                            parent = parent.Parent;
                        }

                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.RightBrace;

                        // Skip newlines
                        iter = SkipNewlines(tokens, iter, end);

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        //Move up another level
                        if (parent != null)
                        {
                            parent = parent.Parent;
                        }

                        node  = null;
                        state = ParserState.Ready;

                        break;

                        #endregion RightBrace

                        #region Variable

                    case Tokens.Variable:
                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.Variable;

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        node = null;
                        break;

                        #endregion Variable

                        #region Quote

                    case Tokens.Quote:
                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme.Substring(1, token.lexeme.Length - 2);
                        node.Type  = ConcreteNodeType.Quote;

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        node = null;
                        break;

                        #endregion Quote

                        #region Word

                    case Tokens.Word:
                        node       = new ConcreteNode();
                        node.File  = token.file;
                        node.Line  = token.line;
                        node.Token = token.lexeme;
                        node.Type  = ConcreteNodeType.Word;

                        // Insert the node
                        if (parent != null)
                        {
                            node.Parent = parent;
                            parent.Children.Add(node);
                        }
                        else
                        {
                            node.Parent = null;
                            nodes.Add(node);
                        }

                        node = null;
                        break;

                        #endregion Word
                    }
                    break;

                    #endregion Object
                }
                iter++;
            }

            return(nodes);
        }
Esempio n. 18
0
 public EntrancePoint(int abstractId, ConcreteNode concreteNode)
 {
     AbstractId   = abstractId;
     ConcreteNode = concreteNode;
 }
Esempio n. 19
0
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(ConcreteNode obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
Esempio n. 20
0
 public void AddNode(int x, int y, ConcreteNode node)
 {
     m_nodes[y, x] = node;
 }
Esempio n. 21
0
 private bool NodesAreBlocked(ConcreteNode node1, ConcreteNode node2)
 {
     return(node1.Info.IsObstacle || node2.Info.IsObstacle);
 }