Beispiel #1
0
        private string GetIgnoreEvents(FsmModel model, VarNames varNames)
        {
            // Build state switch
            var sb    = new System.Text.StringBuilder();
            int count = 0;

            foreach (var state in model.states)
            {
                if (state.ignoreEvents.Count == 0)
                {
                    continue;
                }

                count++;

                sb.Append(ignoreEventsStateCaseTemplate
                          .Replace("{{name}}", varNames.stateNameToEnum[state.name])
                          .Replace("{{ignoreevents}}", GetStateIgnoreEvents(model, state, varNames))
                          .Replace("{{defaultbreak}}", ""));
            }

            if (count == 0)
            {
                return(PostIndent(ignoreEventsNoneTemplate, options.padding));
            }

            return(PostIndent(ignoreEventsTemplate
                              .Replace("{{states}}", sb.ToString()),
                              options.padding));
        }
Beispiel #2
0
        public void Unpack(BinaryReader reader)
        {
            Id = reader.ReadUInt32();

            var num_varnames = reader.ReadUInt16();

            for (uint i = 0; i < num_varnames; i++)
            {
                VarNames.Add(reader.ReadUnicodeString());
            }

            var num_vars = reader.ReadUInt16();

            for (uint i = 0; i < num_vars; i++)
            {
                Vars.Add(reader.ReadUnicodeString());
            }

            var num_strings = reader.ReadUInt32();

            for (uint i = 0; i < num_strings; i++)
            {
                Strings.Add(reader.ReadUnicodeString());
            }

            var num_comments = reader.ReadUInt32();

            for (uint i = 0; i < num_comments; i++)
            {
                Comments.Add(reader.ReadUInt32());
            }

            Unknown = reader.ReadByte();
        }
Beispiel #3
0
 /// <summary>
 /// VarDecl -> Type IdentifierList ; VarDecl |
 ///            FinalT Type IdT = NumT ; VarDecl |
 ///            ε
 /// </summary>
 private void VarDecl()
 {
     if (Token == Tokens.FinalT)
     {
         Match(Tokens.FinalT);
         Type();
         TableEntry entry = symbolTable.CreateTableEntry();
         VarNames.Add(Lexeme);
         Match(Tokens.IdT);
         Match(Tokens.AssignOpT);
         BpOffsetName = $"_bp-{Offset}";
         symbolTable.ConvertEntryToConstant(entry);
         Match(Tokens.NumT);
         LocalVarsSize += Size;
         Offset        += Size;
         Match(Tokens.SemiT);
         VarDecl();
     }
     else if (Types.Contains(Token))
     {
         Type();
         IdentifierList();
         Match(Tokens.SemiT);
         VarDecl();
     }
 }
Beispiel #4
0
        private string GetImplementInterfaces(FsmModel model, VarNames varNames)
        {
            // This is gross, should add a list of interfaces and make it cleaner
            var  sb          = new System.Text.StringBuilder();
            bool addedPrefix = false;

            if (options.enableIntrospectionSupport)
            {
                addedPrefix = true;
                sb.Append(",\n");
                PreIndent(sb, options.padding);
                sb.Append("UnityFSMCodeGenerator.IFsmIntrospectionSupport");
            }

            if (options.enableDebugSupport)
            {
                if (!addedPrefix)
                {
                    sb.Append(",\n");
                }

                if (options.enableIntrospectionSupport)
                {
                    sb.Append(",\n");
                }

                PreIndent(sb, options.padding);
                sb.Append("UnityFSMCodeGenerator.IFsmDebugSupport");
            }

            return(sb.ToString());
        }
Beispiel #5
0
        private string MakeMethodCall(FsmDelegateMethod _delegate, VarNames varNames)
        {
            var sb = new System.Text.StringBuilder();

            sb.Append("context.");
            sb.Append(varNames.interfaceContextCall[_delegate._interface]);
            sb.Append(".");
            sb.Append(varNames.methodInvoke[_delegate.method]);
            return(sb.ToString());
        }
Beispiel #6
0
        private string GetIntrospectionSupport(FsmModel model, VarNames varNames)
        {
            if (!options.enableIntrospectionSupport)
            {
                return("");
            }

            var sb  = new System.Text.StringBuilder();
            var sb2 = new System.Text.StringBuilder();

            // Make two dictionary initializer entries for introspection lookup
            // { "Hung Up", "HungUp" },
            // { "Hung Up", (object)State.HungUp},
            //
            for (int i = 0; i < model.states.Count; i++)
            {
                var state = model.states[i];
                // { "Hung Up", "HungUp" },
                PreIndent(sb, options.padding);
                sb.Append("{ State.");
                sb.Append(varNames.stateNameToEnum[state.name]);
                sb.Append(", \"");
                sb.Append(state.name);
                sb.Append("\" },\n");

                // { "Hung Up", (object)State.HungUp},
                PreIndent(sb2, options.padding);
                sb2.Append("{ \"");
                sb2.Append(state.name);
                sb2.Append("\", ");
                sb2.Append("State.");
                sb2.Append(varNames.stateNameToEnum[state.name]);
                sb2.Append(" },\n");
            }

            var stateLookups      = sb.ToString();
            var stringToEnumState = sb2.ToString();

            // Make list initializer of state names
            sb = new System.Text.StringBuilder();
            for (int i = 0; i < model.states.Count; i++)
            {
                var state = model.states[i];
                PreIndent(sb, options.padding);
                sb.Append("\"");
                sb.Append(state.name);
                sb.Append("\",\n");
            }

            return(PostIndent(introspectionSupportTemplate
                              .Replace("{{statelookups}}", stateLookups)
                              .Replace("{{stateenumlookup}}", stringToEnumState)
                              .Replace("{{statelist}}", sb.ToString()),
                              options.padding));
        }
Beispiel #7
0
 private string GetStartState(FsmModel model, VarNames varNames)
 {
     foreach (var state in model.states)
     {
         if (state.isStart)
         {
             return("public const State START_STATE = State." + varNames.stateNameToEnum[state.name]);
         }
     }
     return("");
 }
Beispiel #8
0
        private string GetDebugSupport(FsmModel model, VarNames varNames)
        {
            if (!options.enableDebugSupport)
            {
                return("");
            }

            return(PostIndent(debugSupportTemplate,
                              //.Replace("{{statelookups}}", stateLookups)
                              options.padding));
        }
Beispiel #9
0
        private string GetDefaultContextInterfaces(FsmModel model, VarNames varNames)
        {
            var sb = new System.Text.StringBuilder();

            foreach (var kvp in varNames.interfaceArgs)
            {
                sb.Append("public ");
                sb.Append(kvp.Key.FullName);
                sb.Append(" ");
                sb.Append(varNames.interfaceContextCall[kvp.Key]);
                sb.Append(" { get; set; }\n");
            }
            return(PostIndent(sb.ToString(), options.padding * 2, false));
        }
Beispiel #10
0
        private string GetStateIgnoreEvents(FsmModel model, FsmStateModel state, VarNames varNames)
        {
            var sb    = new System.Text.StringBuilder();
            int count = 0;

            foreach (var ignore in state.ignoreEvents)
            {
                count++;

                sb.Append(PostIndent(ignoreEventTrue
                                     .Replace("{{event}}", varNames.eventNameToEnum[ignore.name]),
                                     options.padding * 2, false));
            }

            return(sb.ToString());
        }
Beispiel #11
0
        private string GetDispatchOnExit(FsmModel model, VarNames varNames)
        {
            // Build state switch
            var sb = new System.Text.StringBuilder();

            foreach (var state in model.states)
            {
                sb.Append(dispatchStateCaseTemplate
                          .Replace("{{name}}", varNames.stateNameToEnum[state.name])
                          .Replace("{{methodcalls}}", GetDispatchMethodCalls(model, state, varNames, state.onExit)));
            }

            return(PostIndent(dispatchOnExitTemplate
                              .Replace("{{states}}", sb.ToString()),
                              options.padding));
        }
Beispiel #12
0
        private string GetStateInternalActions(FsmModel model, FsmStateModel state, VarNames varNames)
        {
            var sb    = new System.Text.StringBuilder();
            int count = 0;

            foreach (var action in state.internalActions)
            {
                count++;

                sb.Append(PostIndent(internalActionsEventTemplate
                                     .Replace("{{event}}", varNames.eventNameToEnum[action.evt.name])
                                     .Replace("{{methodcall}}", MakeMethodCall(action._delegate, varNames)),
                                     options.padding * 2, false));
            }

            return(sb.ToString());
        }
Beispiel #13
0
 /// <summary>
 /// IdentifierList -> IdT IdentifierListTail
 /// </summary>
 private void IdentifierList()
 {
     if (Token == Tokens.IdT)
     {
         TableEntry entry = symbolTable.CreateTableEntry();
         BpOffsetName = $"_bp-{Offset}";
         symbolTable.ConvertEntryToVariable(entry);
         VarNames.Add(Lexeme);
         LocalVarsSize += Size;
         Offset        += Size;
         Match(Tokens.IdT);
         IdentifierListTail();
     }
     else
     {
         ErrorHandler.LogError($"expected an identifier, found \"{Lexeme}\"");
     }
 }
Beispiel #14
0
        private string GetSingleInternalSendEvent(FsmModel model, VarNames varNames)
        {
            // Build state switch
            var sb = new System.Text.StringBuilder();

            foreach (var state in model.states)
            {
                bool needDefaultBreak = false;
                sb.Append(sendInternalEventStateCaseTemplate
                          .Replace("{{name}}", varNames.stateNameToEnum[state.name])
                          .Replace("{{transitions}}", GetTransitions(model, state, varNames, out needDefaultBreak))
                          .Replace("{{defaultbreak}}", needDefaultBreak ? PostIndent(defaultBreakEventHandlerTemplate, options.padding * 2, false) : ""));
            }

            return(PostIndent(sendInternalEventBaseTemplate
                              .Replace("{{states}}", sb.ToString()),
                              options.padding));
        }
Beispiel #15
0
        private string GetTransitions(FsmModel model, FsmStateModel state, VarNames varNames, out bool needDefaultBreak)
        {
            var sb    = new System.Text.StringBuilder();
            int count = 0;

            foreach (var transition in state.transitions)
            {
                count++;
                sb.Append(PostIndent(stateTransitionTemplate
                                     .Replace("{{event}}", varNames.eventNameToEnum[transition.evt.name])
                                     .Replace("{{tostate}}", varNames.stateNameToEnum[transition.to.name]),
                                     options.padding * 2, false));
            }

            needDefaultBreak = count != model.events.Count;

            return(sb.ToString());
        }
Beispiel #16
0
        /// <summary>
        /// IdentifierListTail -> , IdT IdentifierListTail | ε
        /// </summary>
        private void IdentifierListTail()
        {
            if (Token == Tokens.CommaT)
            {
                Match(Tokens.CommaT);
                TableEntry entry = symbolTable.CreateTableEntry();
                BpOffsetName = $"_bp-{Offset}";
                symbolTable.ConvertEntryToVariable(entry);
                VarNames.Add(Lexeme);
                LocalVarsSize += Size;
                Offset        += Size;
                Match(Tokens.IdT);

                if (Token == Tokens.IdT)
                {
                    ErrorHandler.LogError("expected \",\" before next identifier");
                }

                IdentifierListTail();
            }
        }
Beispiel #17
0
        private string GetNewDefaultContext(FsmModel model, VarNames varNames)
        {
            var sb    = new System.Text.StringBuilder();
            int count = 0;

            foreach (var kvp in varNames.interfaceArgs)
            {
                PreIndent(sb, options.padding);
                sb.Append(kvp.Key.FullName);
                sb.Append(" ");
                sb.Append(kvp.Value);
                if (count != varNames.interfaceArgs.Count - 1)
                {
                    sb.Append(",\n");
                }
                else
                {
                    sb.Append(",");
                }
                count++;
            }

            var _params = sb.ToString();

            sb = new System.Text.StringBuilder();
            foreach (var kvp in varNames.interfaceArgs)
            {
                sb.Append(varNames.interfaceContextCall[kvp.Key]);
                sb.Append(" = ");
                sb.Append(kvp.Value);
                sb.Append(", ");
            }

            var args = sb.ToString();

            return(PostIndent(newDefaultContextTemplate
                              .Replace("{{params}}", _params)
                              .Replace("{{args}}", args),
                              options.padding));
        }
Beispiel #18
0
        private string GetIContext(FsmModel model, VarNames varNames)
        {
            var sb = new System.Text.StringBuilder();

            for (int i = 0; i < model.context.requiredInterfaces.Count; i++)
            {
                var iface = model.context.requiredInterfaces[i];

                PreIndent(sb, options.padding * 2);

                sb.Append(iface.FullName);
                sb.Append(" ");
                sb.Append(varNames.interfaceContextCall[iface]);
                sb.Append(" { get; }");

                if (i + 1 != model.context.requiredInterfaces.Count)
                {
                    sb.Append("\n");
                }
            }
            return(sb.ToString());
        }
Beispiel #19
0
        private string GetHandleInternalActions(FsmModel model, VarNames varNames)
        {
            bool haveActions = false;

            foreach (var state in model.states)
            {
                if (state.internalActions.Count > 0)
                {
                    haveActions = true;
                    break;
                }
            }

            if (!haveActions)
            {
                return(PostIndent(noInternalActionsTemplate, options.padding));
            }

            // Build state switch
            var sb = new System.Text.StringBuilder();

            foreach (var state in model.states)
            {
                if (state.internalActions.Count == 0)
                {
                    continue;
                }

                sb.Append(internalActionsStateCaseTemplate
                          .Replace("{{name}}", varNames.stateNameToEnum[state.name])
                          .Replace("{{internalactions}}", GetStateInternalActions(model, state, varNames))
                          .Replace("{{defaultbreak}}", ""));
            }

            return(PostIndent(internalActionsTemplate
                              .Replace("{{states}}", sb.ToString()),
                              options.padding));
        }
Beispiel #20
0
        private string GetDispatchMethodCalls(FsmModel model, FsmStateModel state, VarNames varNames, List <FsmOnEnterExitModel> calls)
        {
            var sb = new System.Text.StringBuilder();

            if (calls.Count > 0)
            {
                sb.Append("\n");
            }
            for (int i = 0; i < calls.Count; i++)
            {
                var call = calls[i];
                PreIndent(sb, options.padding * 2);
                sb.Append("context.");
                sb.Append(varNames.interfaceContextCall[call._delegate._interface]);
                sb.Append(".");
                sb.Append(varNames.methodInvoke[call._delegate.method]);
                sb.Append(";");
                if (i != calls.Count - 1)
                {
                    sb.Append("\n");
                }
            }
            return(sb.ToString());
        }