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>(); }
// 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; }
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); }
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); }
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); }
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); }
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>(); }
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); }
/// <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); }
/// <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); } }
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); }
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); }
public ThirdGenScript(IReader reader, StructureValueCollection values, MetaAddressConverter addrConverter, IStringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo) { Load(reader, values, addrConverter, stringIDs, expressions, buildInfo); }
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; }
internal void ResolveReferences(ExpressionTable allExpressions) { if (_nextIndex.IsValid) Next = allExpressions.FindExpression(_nextIndex); }
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; }
public ThirdGenScript(IReader reader, StructureValueCollection values, FileSegmentGroup metaArea, StringIDSource stringIDs, ExpressionTable expressions, BuildInformation buildInfo) { Load(reader, values, metaArea, stringIDs, expressions, buildInfo); }
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; }
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; }