コード例 #1
0
        internal static void CreateFSMStmt(FSM fsm, CodeStatementCollection stmts)
        {
            string[]          strArrays = new string[] { "System.Int32", "Transitions" };
            CodeTypeReference typeRef   = CodeDomHelper.CreateGenericTypeReference("Dictionary", strArrays);

            stmts.Add(new CodeVariableDeclarationStatement(typeRef, "transitions", new CodeObjectCreateExpression(typeRef, new CodeExpression[0])));
            Set <int> visited = new Set <int>();

            FSMCodeDomHelper.AddTransitions(fsm, fsm.Start, stmts, visited);
            Set <int> reachableAccept = new Set <int>();

            foreach (int state in fsm.Accept)
            {
                if (visited.Contains(state))
                {
                    reachableAccept.Add(state);
                }
            }
            CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("validationStates");
            CodeTypeReference codeTypeReference = new CodeTypeReference("FSM");

            CodeExpression[] codePrimitiveExpression = new CodeExpression[] { new CodePrimitiveExpression((object)fsm.Start), FSMCodeDomHelper.CreateSetCreateExpression(reachableAccept), new CodeVariableReferenceExpression("transitions") };
            stmts.Add(new CodeAssignStatement(codeVariableReferenceExpression, new CodeObjectCreateExpression(codeTypeReference, codePrimitiveExpression)));
        }
コード例 #2
0
        internal static void CreateAddTransitionStmts(FSM fsm, CodeStatementCollection stmts, int state, Transitions currTrans, Set <int> visited)
        {
            Set <int> subStates = new Set <int>();

            CodeExpression[] initializers = new CodeExpression[currTrans.Count];
            int index = 0;

            if (currTrans.nameTransitions != null)
            {
                foreach (KeyValuePair <XName, int> s1Trans in currTrans.nameTransitions)
                {
                    int num = index;
                    index             = num + 1;
                    initializers[num] = FSMCodeDomHelper.CreateSingleTransitionExpr(FSMCodeDomHelper.CreateXNameExpr(s1Trans.Key), s1Trans.Value);
                    subStates.Add(s1Trans.Value);
                }
            }
            if (currTrans.wildCardTransitions != null)
            {
                foreach (KeyValuePair <WildCard, int> s1Trans in currTrans.wildCardTransitions)
                {
                    int num1 = index;
                    index = num1 + 1;
                    initializers[num1] = FSMCodeDomHelper.CreateSingleTransitionExpr(FSMCodeDomHelper.CreateWildCardExpr(s1Trans.Key), s1Trans.Value);
                    subStates.Add(s1Trans.Value);
                }
            }
            CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("transitions");

            CodeExpression[] codePrimitiveExpression = new CodeExpression[] { new CodePrimitiveExpression((object)state), new CodeObjectCreateExpression("Transitions", initializers) };
            stmts.Add(CodeDomHelper.CreateMethodCall(codeVariableReferenceExpression, "Add", codePrimitiveExpression));
            foreach (int s in subStates)
            {
                FSMCodeDomHelper.AddTransitions(fsm, s, stmts, visited);
            }
        }