Exemplo n.º 1
0
        protected override void ImplementFSMMetaData()
        {
            Debug.Assert(this.clrTypeInfo.HasElementWildCard);
            if (this.fsmNameSource != null)
            {
                this.fsmNameSource.Reset();
            }
            else
            {
                this.fsmNameSource = new StateNameSource();
            }
            FSM fsm = this.clrTypeInfo.CreateFSM(this.fsmNameSource);

            this.decl.Members.Add(CodeDomHelper.CreateMemberField("validationStates", "FSM", MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.Assembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Private, false));
            CodeMemberMethod getFSM = CodeDomHelper.CreateInterfaceImplMethod("GetValidationStates", "IXMetaData", new CodeTypeReference("FSM"));

            getFSM.Statements.Add(new CodeMethodReturnStatement(new CodeFieldReferenceExpression(null, "validationStates")));
            this.decl.Members.Add(getFSM);
            CodeMemberMethod initFSM = CodeDomHelper.CreateMethod("InitFSM", MemberAttributes.Abstract | MemberAttributes.Final | MemberAttributes.Static | MemberAttributes.Assembly | MemberAttributes.FamilyOrAssembly | MemberAttributes.Private, new CodeTypeReference());

            FSMCodeDomHelper.CreateFSMStmt(fsm, initFSM.Statements);
            this.decl.Members.Add(initFSM);
            this.CreateStaticConstructor();
            this.declItemsInfo.staticConstructor.Statements.Add(CodeDomHelper.CreateMethodCall(null, "InitFSM", null));
        }
 internal static void AddTransitions(FSM fsm, int state, CodeStatementCollection stmts, Set <int> visited)
 {
     if (!visited.Contains(state))
     {
         visited.Add(state);
         Transitions currTrans = null;
         fsm.Trans.TryGetValue(state, out currTrans);
         if ((currTrans == null ? false : currTrans.Count != 0))
         {
             FSMCodeDomHelper.CreateAddTransitionStmts(fsm, stmts, state, currTrans, visited);
         }
     }
 }
        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)));
        }
        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);
            }
        }