コード例 #1
0
        public void Add_HasARegexConflict_ThrowsException()
        {
            var table = new ExpressionTable();
            var expr1 = new CustomExpression
            {
                Name                = "Test",
                RegexPattern        = "[0-9]",
                ExpressionFunction  = FakeFunc,
                ReplacementFunction = FakeReplaceFunc
            };

            table.Add(expr1);

            var expr2 = new CustomExpression
            {
                Name                = "Test1",
                RegexPattern        = "[0-9]",
                ExpressionFunction  = FakeFunc,
                ReplacementFunction = FakeReplaceFunc
            };

            Action add = () => table.Add(expr2);

            add.Should().Throw <ArgumentException>();
        }
コード例 #2
0
        // XXX: isPreset - what does this do when set?
        //
        protected void SetExpression(IDesignerSerializationManager manager, object instance, CodeExpression expression, bool isPreset)
        {
            if (manager == null)
            {
                throw new ArgumentNullException("manager");
            }
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }
            if (expression == null)
            {
                throw new ArgumentNullException("expression");
            }

            ExpressionTable expressions = manager.Context[typeof(ExpressionTable)] as ExpressionTable;

            if (expressions == null)
            {
                expressions = new ExpressionTable();
                manager.Context.Append(expressions);
            }

            expressions[instance] = expression;
        }
コード例 #3
0
        public void Execute_MixedFunctions(string expression, int minExpected, int maxExpected)
        {
            var table = new ExpressionTable();

            table.Add(new CustomExpression
            {
                Name                = "Roll",
                RegexPattern        = @"([0-9]+)?(d|D)([0-9]+)",
                ExpressionFunction  = RollFunction,
                ReplacementFunction = ReplaceRollCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Number",
                RegexPattern        = @"^?\b\w*[n|N]\w*\b$?",
                ExpressionFunction  = NumberFunction,
                ReplacementFunction = ReplaceNumberCall
            });

            var parser = new ExpressionParser(table);

            var result = parser.Execute(expression);

            result.Should().BeGreaterOrEqualTo(minExpected);
            result.Should().BeLessOrEqualTo(maxExpected);
        }
コード例 #4
0
        protected CodeExpression GetExpression(IDesignerSerializationManager manager, object instance)
        {
            if (manager == null)
            {
                throw new ArgumentNullException("manager");
            }
            if (instance == null)
            {
                throw new ArgumentNullException("instance");
            }

            CodeExpression expression = null;

            ExpressionTable expressions = manager.Context[typeof(ExpressionTable)] as ExpressionTable;

            if (expressions != null)             // 1st try: ExpressionTable
            {
                expression = expressions [instance] as CodeExpression;
            }

            if (expression == null)               // 2nd try: RootContext
            {
                RootContext context = manager.Context[typeof(RootContext)] as RootContext;
                if (context != null && context.Value == instance)
                {
                    expression = context.Expression;
                }
            }

            if (expression == null)               // 3rd try: IReferenceService (instnace.property.property.property
            {
                string name = manager.GetName(instance);
                if (name == null || name.IndexOf(".") == -1)
                {
                    IReferenceService service = manager.GetService(typeof(IReferenceService)) as IReferenceService;
                    if (service != null)
                    {
                        name = service.GetName(instance);
                        if (name != null && name.IndexOf(".") != -1)
                        {
                            string[] parts = name.Split(new char[] { ',' });
                            instance = manager.GetInstance(parts[0]);
                            if (instance != null)
                            {
                                expression = SerializeToExpression(manager, instance);
                                if (expression != null)
                                {
                                    for (int i = 1; i < parts.Length; i++)
                                    {
                                        expression = new CodePropertyReferenceExpression(expression, parts[i]);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(expression);
        }
コード例 #5
0
ファイル: ThirdGenGlobal.cs プロジェクト: Chrisco93/Assembly
        public ThirdGenGlobal(StructureValueCollection values, ExpressionTable allExpressions)
        {
            Name = values.GetString("name");
            Type = (short)values.GetInteger("type");

            DatumIndex valueIndex = new DatumIndex(values.GetInteger("expression index"));
            if (valueIndex.IsValid)
                Value = allExpressions.FindExpression(valueIndex);
        }
コード例 #6
0
ファイル: ThirdGenScript.cs プロジェクト: Chrisco93/Assembly
        private void Load(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, StringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo)
        {
            Name = stringIDs.GetString(new StringID((int)values.GetInteger("name index")));
            ExecutionType = (short)values.GetInteger("execution type");
            ReturnType = (short)values.GetInteger("return type");
            DatumIndex rootExpr = new DatumIndex(values.GetInteger("first expression index"));
            if (rootExpr.IsValid)
                RootExpression = expressions.FindExpression(rootExpr);
            if (Name == null)
                Name = "script_" + rootExpr.Value.ToString("X8");

            Parameters = LoadParameters(reader, values, metaArea, buildInfo);
        }
コード例 #7
0
        public void Add_HasNoConflicts()
        {
            var table = new ExpressionTable();
            var expr  = new CustomExpression
            {
                Name                = "Test",
                RegexPattern        = "[0-9]",
                ExpressionFunction  = FakeFunc,
                ReplacementFunction = FakeReplaceFunc
            };

            Action add = () => table.Add(expr);

            add.Should().NotThrow <Exception>();
        }
コード例 #8
0
        public void Get_HasANameMatch_ReturnsValidResult()
        {
            var table = new ExpressionTable();
            var expr1 = new CustomExpression()
            {
                Name                = "Test",
                RegexPattern        = "[0-9]",
                ExpressionFunction  = FakeFunc,
                ReplacementFunction = FakeReplaceFunc
            };

            table.Add(expr1);

            table.Get("Test").Should().Be(expr1);
        }
コード例 #9
0
ファイル: Optimizer.cs プロジェクト: XXJUAN10XX/compi2018
        /// <summary>
        /// Funcion que optimiza el codigo.
        /// </summary>
        /// <param name="code">Codigo a optimizar</param>
        /// <returns>Codigo optimizado</returns>
        public static string run(string code)
        {
            int despl = 0;
            List <ExpressionTable> list = new List <ExpressionTable>();
            string remainingCode        = code;

            //Paso 1: Deteccion y computacion de expresiones.
            while (true)
            {
                //Encontramos las expresiones.
                ExpressionTable data = Optimizer.getBetween(remainingCode, "=", ";", 0);

                //Si no hay expresiones restantes entonces termina.
                if (data == null)
                {
                    break;
                }
                else
                {
                    //Si obtenemos una expresion la agregamos a la lista
                    //Y actualizamos el desplazamiento para obtener el codigo remanente a optimizar.
                    list.Add(data);
                    despl         = data.pos;
                    remainingCode = remainingCode.Substring(despl);
                }
            }

            //Paso 2: Reemplazo de las expresiones
            foreach (ExpressionTable item in list)
            {
                switch (item.type)
                {
                case EType.COMP:
                    //Reemplazo de expresion por constante.
                    code = code.Replace(item.expression, " " + item.result);
                    break;

                case EType.REDUC:
                    //A futuro: Implemental reduccion.
                    break;

                case EType.NCOMP:
                    //A futuro: Extender optimizacion.
                    break;
                }
            }
            return(code);
        }
コード例 #10
0
ファイル: Optimizer.cs プロジェクト: XXJUAN10XX/compi2018
        /// <summary>
        /// Metodo para obtener las expresiones en el codigo.
        /// </summary>
        /// <param name="strSource">Codigo a optimizar</param>
        /// <param name="strStart">Substring de inicio '=' </param>
        /// <param name="strEnd">Substring de fin ';'</param>
        /// <param name="desplazamiento">Posicion desde donde inspeccionar el stirng, 0.</param>
        /// <returns>Expresion detectada o null si ya no hay mas expresiones.</returns>
        public static ExpressionTable getBetween(string strSource, string strStart, string strEnd, int desplazamiento)
        {
            int Start, End;

            if (strSource.Contains(strStart) && strSource.Contains(strEnd))
            {
                Start = strSource.IndexOf(strStart, desplazamiento) + strStart.Length;
                End   = strSource.IndexOf(strEnd, Start);

                string expression = strSource.Substring(Start, End - Start);
                string auxexpr    = expression.Replace(" ", string.Empty);
                try
                {
                    DataTable       dt     = new DataTable();
                    int             answer = (int)dt.Compute(auxexpr, "");
                    ExpressionTable ET     = new ExpressionTable();
                    ET.result     = answer.ToString();
                    ET.expression = expression;
                    ET.pos        = End + 1;
                    ET.type       = EType.COMP;
                    return(ET);
                }
                catch (EvaluateException e)
                {
                    ExpressionTable ET = new ExpressionTable();
                    ET.expression = auxexpr;
                    ET.pos        = End + 1;
                    ET.result     = "Expresion";
                    ET.type       = EType.REDUC;
                    return(ET);
                }
                catch (SyntaxErrorException e)
                {
                    ExpressionTable ET = new ExpressionTable();
                    ET.expression = auxexpr;
                    ET.pos        = End + 1;
                    ET.result     = "No Computable";
                    ET.type       = EType.NCOMP;
                    return(ET);
                }
            }
            else
            {
                return(null);
            }
        }
コード例 #11
0
        public void Execute_StandardDiceFormat(string expression, int minExpected, int maxExpected)
        {
            var table = new ExpressionTable();

            table.Add(new CustomExpression
            {
                Name                = "Roll",
                RegexPattern        = @"([0-9]+)?(d|D)([0-9]+)",
                ExpressionFunction  = RollFunction,
                ReplacementFunction = ReplaceRollCall
            });

            var parser = new ExpressionParser(table);

            var result = parser.Execute(expression);

            result.Should().BeGreaterOrEqualTo(minExpected);
            result.Should().BeLessOrEqualTo(maxExpected);
        }
コード例 #12
0
        public static ExpressionTable GetExpressionTable()
        {
            var table = new ExpressionTable();

            table.Add(new CustomExpression
            {
                Name                = "Level",
                RegexPattern        = @"^?\b\w*[l|L]\w*\b$?",
                ExpressionFunction  = LevelFunction,
                ReplacementFunction = ReplaceLevelCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Health",
                RegexPattern        = @"^?\b\w*[h|H]\w*\b$?",
                ExpressionFunction  = HealthFunction,
                ReplacementFunction = ReplaceHealthCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Mana",
                RegexPattern        = @"^?\b\w*[m|M]\w*\b$?",
                ExpressionFunction  = ManaFunction,
                ReplacementFunction = ReplaceManaCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Movement",
                RegexPattern        = @"^?\b\w*[v|V]\w*\b$?",
                ExpressionFunction  = MovementFunction,
                ReplacementFunction = ReplaceMovementCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Strength",
                RegexPattern        = @"^?\b\w*[s|S]\w*\b$?",
                ExpressionFunction  = StrengthFunction,
                ReplacementFunction = ReplaceStrengthCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Intelligence",
                RegexPattern        = @"^?\b\w*[i|I]\w*\b$?",
                ExpressionFunction  = IntelligenceFunction,
                ReplacementFunction = ReplaceIntelligenceCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Wisdom",
                RegexPattern        = @"^?\b\w*[w|W]\w*\b$?",
                ExpressionFunction  = WisdomFunction,
                ReplacementFunction = ReplaceWisdomCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Dexterity",
                RegexPattern        = @"^?\b\w*[x|X]\w*\b$?",
                ExpressionFunction  = DexterityFunction,
                ReplacementFunction = ReplaceDexterityCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Constitution",
                RegexPattern        = @"^?\b\w*[c|C]\w*\b$?",
                ExpressionFunction  = ConstitutionFunction,
                ReplacementFunction = ReplaceConstitutionCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Charisma",
                RegexPattern        = @"^?\b\w*[a|A]\w*\b$?",
                ExpressionFunction  = CharismaFunction,
                ReplacementFunction = ReplaceCharismaCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Luck",
                RegexPattern        = @"^?\b\w*[u|U]\w*\b$?",
                ExpressionFunction  = LuckFunction,
                ReplacementFunction = ReplaceLuckCall
            });
            table.Add(new CustomExpression
            {
                Name                = "Age",
                RegexPattern        = @"^?\b\w*[y|Y]\w*\b$?",
                ExpressionFunction  = AgeFunction,
                ReplacementFunction = ReplaceAgeCall
            });

            return(table);
        }
コード例 #13
0
 public ThirdGenScript(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo)
 {
     Load(reader, values, addrConverter, stringIDs, expressions, buildInfo);
 }
コード例 #14
0
        private List<IGlobal> LoadScriptGlobals(StructureValueCollection values, IReader reader, MetaAddressConverter addrConverter, ExpressionTable expressions, StructureLayout entryLayout)
        {
            int globalsCount = (int)values.GetNumber("number of script globals");
            ScriptGlobalsLocation = new Pointer(values.GetNumber("script global table address"), addrConverter);

            List<IGlobal> result = new List<IGlobal>();
            reader.SeekTo(ScriptGlobalsLocation.AsOffset());
            for (int i = 0; i < globalsCount; i++)
            {
                StructureValueCollection globalValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobal(globalValues, expressions));
            }
            return result;
        }
コード例 #15
0
 internal void ResolveReferences(ExpressionTable allExpressions)
 {
     if (_nextIndex.IsValid)
         Next = allExpressions.FindExpression(_nextIndex);
 }
コード例 #16
0
        private List<IGlobal> LoadScriptGlobals(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, ExpressionTable expressions, StructureLayout entryLayout)
        {
            int globalsCount = (int)values.GetInteger("number of script globals");
            if (globalsCount == 0)
                return new List<IGlobal>();

            ScriptGlobalsLocation = SegmentPointer.FromPointer(values.GetInteger("script global table address"), metaArea);

            List<IGlobal> result = new List<IGlobal>();
            reader.SeekTo(ScriptGlobalsLocation.AsOffset());
            for (int i = 0; i < globalsCount; i++)
            {
                StructureValueCollection globalValues = StructureReader.ReadStructure(reader, entryLayout);
                result.Add(new ThirdGenGlobal(globalValues, expressions));
            }
            return result;
        }
コード例 #17
0
ファイル: ThirdGenScript.cs プロジェクト: Chrisco93/Assembly
 public ThirdGenScript(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, StringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo)
 {
     Load(reader, values, metaArea, stringIDs, expressions, buildInfo);
 }
コード例 #18
0
        private ExpressionTable LoadScriptExpressions(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, StringTableReader stringReader, StructureLayout entryLayout)
        {
            int exprCount = (int)values.GetInteger("number of script expressions");
            if (exprCount == 0)
                return new ExpressionTable();

            ScriptExpressionsLocation = SegmentPointer.FromPointer(values.GetInteger("script expression table address"), metaArea);

            ExpressionTable result = new ExpressionTable();
            reader.SeekTo(ScriptExpressionsLocation.AsOffset());
            for (int i = 0; i < exprCount; i++)
            {
                StructureValueCollection exprValues = StructureReader.ReadStructure(reader, entryLayout);
                result.AddExpression(new ThirdGenExpression(exprValues, (ushort)i, stringReader));
            }

            foreach (IExpression expr in result)
            {
                // FIXME: hax
                if (expr != null)
                    ((ThirdGenExpression)expr).ResolveReferences(result);
            }
            return result;
        }
コード例 #19
0
        private List<IScript> LoadScripts(StructureValueCollection values, IReader reader, FileSegmentGroup metaArea, StringIDSource stringIDs, ExpressionTable expressions, StructureLayout entryLayout, BuildInformation buildInfo)
        {
            int scriptCount = (int)values.GetInteger("number of scripts");
            if (scriptCount == 0)
                return new List<IScript>();

            ScriptsLocation = SegmentPointer.FromPointer(values.GetInteger("script table address"), metaArea);

            // Read all of the script entries first, then go back and create the objects
            // ThirdGenScript reads parameters from its constructor - this may or may not need cleaning up to make this more obvious
            reader.SeekTo(ScriptsLocation.AsOffset());
            List<StructureValueCollection> scriptData = new List<StructureValueCollection>();
            for (int i = 0; i < scriptCount; i++)
                scriptData.Add(StructureReader.ReadStructure(reader, entryLayout));

            List<IScript> result = new List<IScript>();
            foreach (StructureValueCollection scriptValues in scriptData)
                result.Add(new ThirdGenScript(reader, scriptValues, metaArea, stringIDs, expressions, buildInfo));
            return result;
        }