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); } }