Beispiel #1
0
 public static FunctionalParser <TInput, TSourceState, TResultState> Create <TInput, TSourceState, TResultState>(
     ParseFunc <TInput, TSourceState, TResultState> func,
     TInput lookAhead
     )
 {
     return(new FunctionalParser <TInput, TSourceState, TResultState>(func, lookAhead));
 }
Beispiel #2
0
        private IParser <T> ApplyOptionsAndGetValueTypeParserObject <T>(ParseFunc <T> parseFunc, TryParseFunc <T> tryParseFunc, MissingTryParseHandling missingTryParse)
            where T : struct
        {
            if (parseFunc is null)
            {
                return(new FunctorParserObject <T>(ParseThrowsNotSupportedException <T>, TryParseThrowsNotSupportedException));
            }

            ParseFunc <T>    valueTypeParseFunc    = parseFunc;       // Just keeping with the pattern.
            TryParseFunc <T> valueTypeTryParseFunc = tryParseFunc;

            if (tryParseFunc is null)
            {
                if (missingTryParse == MissingTryParseHandling.WrapParseInTryCatch)
                {
                    valueTypeTryParseFunc = CreateWrapperForTryParse(valueTypeParseFunc);
                }
                else if (missingTryParse == MissingTryParseHandling.ReturnFalse)
                {
                    valueTypeTryParseFunc = TryParseReturnsFalse;
                }
                else
                {
                    valueTypeTryParseFunc = TryParseThrowsNotSupportedException;
                }
            }

            return(new FunctorParserObject <T>(valueTypeParseFunc, valueTypeTryParseFunc));
        }
Beispiel #3
0
        /// <summary>
        /// 获取配置文件appSettings集合中指定索引的值
        /// </summary>
        /// <typeparam name="T">返回值类型参数</typeparam>
        /// <param name="key">索引键</param>
        /// <param name="parseValue">将指定索引键的值转化为返回类型的值的委托方法</param>
        /// <param name="defaultValue">默认值</param>
        /// <returns></returns>
        private static T getValue <T>(string key, ParseFunc <string, T> parseValue, T?defaultValue) where T : struct
        {
            string value = appSettings[key];

            if (value != null)
            {
                T parsedValue = default(T);

                if (parseValue(value, out parsedValue))
                {
                    return(parsedValue);
                }
                else
                {
                    throw new ApplicationException(string.Format("Settings '{0}' was not a valid {1}", key, typeof(T).FullName));
                }
            }

            if (!defaultValue.HasValue)
            {
                throw new ApplicationException("在配置文件的appSettings节点集合中找不到key为" + key + "的子节点,且没有指定默认值");
            }
            else
            {
                return(defaultValue.Value);
            }
        }
Beispiel #4
0
 public Command(String device, String cmd, String apkPath,
                ParseFunc parse)
 {
     Device  = device;
     Cmd     = cmd;
     ApkPath = apkPath;
     Parse   = parse;
 }
Beispiel #5
0
        public LogIndex(string Name, ParseFunc Parse)
        {
            CsvIndex = -1;
            Index    = -1;

            this.Name  = Name;
            this.Parse = Parse;
        }
Beispiel #6
0
        private IParser <T> ApplyOptionsAndGetReferenceTypeParserObject <T>(ParseFunc <T> parseFunc, TryParseFunc <T> tryParseFunc, MissingTryParseHandling missingTryParse)
            where T : class
        {
            if (parseFunc is null)
            {
                return(new FunctorParserObject <T>(ParseThrowsNotSupportedException <T>, TryParseThrowsNotSupportedException));
            }

            ParseFunc <T>    referenceTypeParseFunc    = parseFunc;
            TryParseFunc <T> referenceTypeTryParseFunc = tryParseFunc;

            if (_referenceTypesParseNullToNull)
            {
                referenceTypeParseFunc = s =>
                {
                    if (s is null)
                    {
                        return(null);
                    }

                    return(parseFunc(s));
                };
            }

            if (tryParseFunc is null)
            {
                if (missingTryParse == MissingTryParseHandling.WrapParseInTryCatch)
                {
                    referenceTypeTryParseFunc = CreateWrapperForTryParse(referenceTypeParseFunc);
                }
                else if (missingTryParse == MissingTryParseHandling.ReturnFalse)
                {
                    referenceTypeTryParseFunc = TryParseReturnsFalse;
                }
                else
                {
                    referenceTypeTryParseFunc = TryParseThrowsNotSupportedException;
                }
            }
            else
            {
                if (_referenceTypesParseNullToNull)
                {
                    referenceTypeTryParseFunc = (string s, out T result) =>
                    {
                        if (s is null)
                        {
                            result = null;
                            return(true);
                        }

                        return(tryParseFunc(s, out result));
                    };
                }
            }

            return(new FunctorParserObject <T>(referenceTypeParseFunc, referenceTypeTryParseFunc));
        }
Beispiel #7
0
            SheetInfo CreateSheetInfo <K, V>(BuildFunc buildFunc, ParseFunc parseFunc = null) where V : AssetData <K>
            {
                var si = new SheetInfo();

                si.sheetname = typeof(V).Name;
                si.buildFunc = buildFunc;
                si.parseFunc = null != parseFunc ? parseFunc : this.ParseFromCsv <K, V>;
                return(si);
            }
Beispiel #8
0
 public void T_2()
 {
     var fp = new ParseFunc[]{
     ThrowSt.Singleton()
       };
       var input = @"throw new Exception(@""hoge"");";
       var expect = new String[]{
     @"throw new Exception(@""hoge"");",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #9
0
 public void T_06()
 {
     var fp = new ParseFunc[]{
     AssignSt.Singleton()
       };
       var input = @"x %= 1 + 4 + f(4, g());";
       var expect = new String[]{
     @"x %= 1 + 4 + f(4, g());",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #10
0
 public void T_3()
 {
     var fp = new ParseFunc[]{
     CaseSt.Singleton()
       };
       var input = @"  case   Hoge.Foo  :";
       var expect = new String[]{
     @"case Hoge.Foo:",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #11
0
 public void T_06()
 {
     var fp = new ParseFunc[]{
     ExprSt.Singleton()
       };
       var input = @"8 + (8 - 8);";
       var expect = new String[]{
     @"8 + (8 - 8);",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #12
0
 public void T_05()
 {
     var fp = new ParseFunc[]{
     ExprSt.Singleton()
       };
       var input = @"8 + 8 - 8 * 8 / 8 < 8 > 8 << 8 >> 8 % 8 & 8 && 8 || 8 | 8;";
       var expect = new String[]{
     @"8 + 8 - 8 * 8 / 8 < 8 > 8 << 8 >> 8 % 8 & 8 && 8 || 8 | 8;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #13
0
 public void T_endif()
 {
     var fp = new ParseFunc[]{
     DirectiveIfSt.Singleton()
       };
       var input = @"#endif";
       var expect = new String[]{
     @"#endif",
       };
       TestUtils.Eq(fp, input, expect);
 }
 public void T_06()
 {
     var fp = new ParseFunc[]{
     DefineLocalVariableSt.Singleton()
       };
       var input = @"List<String, List<String, List<String, String>>> a = new List<String, List<String, List<String, String>>>();";
       var expect = new String[]{
     @"List<String, List<String, List<String, String>>> a = new List<String, List<String, List<String, String>>>();",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #15
0
 public void T_2()
 {
     var fp = new ParseFunc[]{
     ReturnSt.Singleton()
       };
       var input = @"return new String[]{};";
       var expect = new String[]{
     @"return new String[]{};",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #16
0
 public void T_2()
 {
     var fp = new ParseFunc[]{
     BreakSt.Singleton()
       };
       var input = @"yield break;";
       var expect = new String[]{
     @"yield break;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #17
0
 public void T_1()
 {
     var fp = new ParseFunc[]{
     ThrowSt.Singleton()
       };
       var input = @"throw;";
       var expect = new String[]{
     @"throw;",
       };
       TestUtils.Eq(fp, input, expect);
 }
    public static List <T> ParseList <T>(ParseFunc <T> parse, string value)
    {
        List <T>      res    = new List <T>();
        List <string> values = ParseType(value);      //value.Split(";");

        for (int i = 0; i < values.Count; i++)
        {
            res.Add(parse(values[i]));
        }
        return(res);
    }
Beispiel #19
0
 public void T_Alias_2()
 {
     var fp = new ParseFunc[]{
     UsingSt.Singleton()
       };
       var input = @"   using A = NUnit.Framework;";
       var expect = new String[]{
     @"using A = NUnit.Framework;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #20
0
 public void T_Alias_3()
 {
     var fp = new ParseFunc[]{
     UsingSt.Singleton()
       };
       var input = @"   using A = System.IO.Path;";
       var expect = new String[]{
     @"using A = System.IO.Path;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #21
0
 public void T_05()
 {
     var fp = new ParseFunc[]{
     AttributeSt.Singleton()
       };
       var input = @"[assembly:DllImport(""msvcrt.dll"")]";
       var expect = new String[]{
     @"[assembly: DllImport(""msvcrt.dll"")]",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #22
0
 public void T1()
 {
     var fp = new ParseFunc[]{
     UsingSt.Singleton()
       };
       var input = @"    using System;";
       var expect = new String[]{
     @"using System;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #23
0
 public void T_04()
 {
     var fp = new ParseFunc[]{
     AttributeSt.Singleton()
       };
       var input = @"[Conditional(""DEBUG""),Conditional(""TEST"")]";
       var expect = new String[]{
     @"[Conditional(""DEBUG""), Conditional(""TEST"")]",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #24
0
 public void T_1()
 {
     var fp = new ParseFunc[]{
     DefaultSt.Singleton()
       };
       var input = @"default:";
       var expect = new String[]{
     @"default:",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #25
0
        private IParser <T> AltCreateParserObject <T>(ParseFunc <T> parseFunc, TryParseFunc <T> tryParseFunc, MissingTryParseHandling missingTryParse)
        {
            Type type = typeof(T);

            string     methodName    = type.GetTypeInfo().IsValueType ? nameof(ApplyOptionsAndGetValueTypeParserObject) : nameof(ApplyOptionsAndGetReferenceTypeParserObject);
            MethodInfo factoryMethod = ReflectionHelper.GetPrivateGenericMethod(typeof(ParserContainer), methodName, type);

            Func <ParseFunc <T>, TryParseFunc <T>, MissingTryParseHandling, IParser <T> > factory = factoryMethod.CreateDelegate <Func <ParseFunc <T>, TryParseFunc <T>, MissingTryParseHandling, IParser <T> > >(this);

            return(factory(parseFunc, tryParseFunc, missingTryParse));
        }
 public void T_04()
 {
     var fp = new ParseFunc[]{
     DefineLocalVariableSt.Singleton()
       };
       var input = @"var str = @""hi"";";
       var expect = new String[]{
     @"var str = @""hi"";",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #27
0
 public void T_02()
 {
     var fp = new ParseFunc[]{
     AttributeSt.Singleton()
       };
       var input = @"[return:0]";
       var expect = new String[]{
     @"[return: 0]",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #28
0
 public void T_3()
 {
     var fp = new ParseFunc[]{
     UsingBlockSt.Singleton()
       };
       var input = @" using (var a = new String[]{}  )  idx++; ";
       var expect = new String[]{
     @"using (var a = new String[]{})",
     @"  idx++;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #29
0
 public void T_3()
 {
     var fp = new ParseFunc[]{
     WhileSt.Singleton()
       };
       var input = @" while ( idx < 10 ) idx++; ";
       var expect = new String[]{
     @"while (idx < 10)",
     @"  idx++;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #30
0
 public static void Eq(ParseFunc[] pf, String input, String[] expect)
 {
     var psr = new Parser(Lexer.LexerString(input));
       var result = psr.Evalute(pf);
       var joinedExpect = @"";
       foreach (var line in expect)
       {
     joinedExpect += line + "\n";
       }
       Assert.AreEqual(result.Output, joinedExpect);
       Assert.True(result.Success);
 }
Beispiel #31
0
 public NumberParser(Type fieldType)
 {
     if (fieldType == typeof(int))
     {
         parseFunction  = (string input, out object value) => { int parsedVal; bool result = int.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (int)value1 == (int)value2;
     }
     else if (fieldType == typeof(uint))
     {
         parseFunction  = (string input, out object value) => { uint parsedVal; bool result = uint.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (uint)value1 == (uint)value2;
     }
     else if (fieldType == typeof(long))
     {
         parseFunction  = (string input, out object value) => { long parsedVal; bool result = long.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (long)value1 == (long)value2;
     }
     else if (fieldType == typeof(ulong))
     {
         parseFunction  = (string input, out object value) => { ulong parsedVal; bool result = ulong.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (ulong)value1 == (ulong)value2;
     }
     else if (fieldType == typeof(byte))
     {
         parseFunction  = (string input, out object value) => { byte parsedVal; bool result = byte.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (byte)value1 == (byte)value2;
     }
     else if (fieldType == typeof(sbyte))
     {
         parseFunction  = (string input, out object value) => { sbyte parsedVal; bool result = sbyte.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (sbyte)value1 == (sbyte)value2;
     }
     else if (fieldType == typeof(short))
     {
         parseFunction  = (string input, out object value) => { short parsedVal; bool result = short.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (short)value1 == (short)value2;
     }
     else if (fieldType == typeof(ushort))
     {
         parseFunction  = (string input, out object value) => { ushort parsedVal; bool result = ushort.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (ushort)value1 == (ushort)value2;
     }
     else if (fieldType == typeof(char))
     {
         parseFunction  = (string input, out object value) => { char parsedVal; bool result = char.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (char)value1 == (char)value2;
     }
     else
     {
         parseFunction  = null;
         equalsFunction = null;
     }
 }
Beispiel #32
0
 public void T_05()
 {
     var fp = new ParseFunc[]{
     ForSt.Singleton()
       };
       var input = @" for(; idx < 10;) idx++; ";
       var expect = new String[]{
     @"for (; idx < 10;)",
     @"  idx++;",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #33
0
 public void T_00()
 {
     var fp = new ParseFunc[]{
     ClassMethodSt.Singleton()
       };
       var input = @"private static void F([MarshalAs(UnmanagedType.LPStr)]Dictionary<List<String>,Tuple<List<String>,Int32>> ttt){}";
       var expect = new String[]{
     @"private static void F([MarshalAs(UnmanagedType.LPStr)] Dictionary<List<String>, Tuple<List<String>, Int32>> ttt)",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #34
0
 public static bool TryParse <T>(string value, ParseFunc <T> parser, out T result)
 {
     try
     {
         result = parser(value);
         return(true);
     }
     catch
     {
         result = default(T);
         return(false);
     }
 }
Beispiel #35
0
 public void T_2()
 {
     var fp = new ParseFunc[]{
     IfSt.Singleton()
       };
       var input = @" if(true  )  {} ";
       var expect = new String[]{
     @"if (true)",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #36
0
 public void T_03()
 {
     var fp = new ParseFunc[]{
     ForSt.Singleton()
       };
       var input = @" for( idx = 0; idx < 10;)  { } ";
       var expect = new String[]{
     @"for ( idx = 0; idx < 10;)",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #37
0
        protected TOut TryGetAttributeValue <TOut>(XmlElement element, string name, ParseFunc <TOut> tryParse, TOut defaultValue = default(TOut))
        {
            TOut result;

            var attrValue = element.GetAttribute(name);

            if (!string.IsNullOrEmpty(attrValue) && tryParse(attrValue, out result))
            {
                return(result);
            }

            return(defaultValue);
        }
Beispiel #38
0
 public void T_01()
 {
     var fp = new ParseFunc[]{
     ClassMethodSt.Singleton()
       };
       var input = @"private Dictionary<List<String>,Tuple<List<String>,Int32>> F(){}";
       var expect = new String[]{
     @"private Dictionary<List<String>, Tuple<List<String>, Int32>> F()",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #39
0
 public void T_04()
 {
     var fp = new ParseFunc[]{
     ClassMethodSt.Singleton()
       };
       var input = @"private String Hoge(Int32 a, Boolean b){}";
       var expect = new String[]{
     @"private String Hoge(Int32 a, Boolean b)",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #40
0
        // Check text of a TextBox by specified Double parser, and render color of the text.
        public static void TextBoxCheckByParserDouble(object sender, ParseFunc <string, Double> parser)
        {
            TextBox tb = sender as TextBox;

            if (parser(tb.Text, out _))
            {
                tb.ForeColor = Color.Black;
            }
            else
            {
                tb.ForeColor = Color.Red;
            }
        }
Beispiel #41
0
 public void T_1()
 {
     var fp = new ParseFunc[]{
     NamespaceSt.Singleton()
       };
       var input = @"  namespace    Hoge  .  Foo  {   }  ";
       var expect = new String[]{
     @"namespace Hoge.Foo",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #42
0
        private IParser <T> GetReferenceTypeParserObject <T>()
            where T : class
        {
            if (typeof(T) == typeof(string))
            {
                return((IParser <T>) new StringParser());
            }

            ParseFunc <T>    parseFunc    = GetDefaultParseFunc <T>();
            TryParseFunc <T> tryParseFunc = GetDefaultTryParseFunc <T>();

            return(ApplyOptionsAndGetReferenceTypeParserObject(parseFunc, tryParseFunc, _missingTryParse));
        }
Beispiel #43
0
 public void T_2()
 {
     var fp = new ParseFunc[]{
     UnsafeSt.Singleton()
       };
       var input = @"unsafe{}";
       var expect = new String[]{
     @"unsafe",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #44
0
 public void T_01()
 {
     var fp = new ParseFunc[]{
     EnumSt.Singleton()
       };
       var input = @"public enum Hoge{}";
       var expect = new String[]{
     @"public enum Hoge",
     @"{",
     @"}",
       };
       TestUtils.Eq(fp, input, expect);
 }
Beispiel #45
0
        private IParser <T?> GetNullableValueTypeParserObject <T>()
            where T : struct
        {
            IParser <T> valueTypeParser = (IParser <T>)ForInternal(typeof(T));

            ParseFunc <T?> parseFunc = s =>
            {
                if (s is null)
                {
                    if (_nullableValueTypesParseNullToNull)
                    {
                        return(null);
                    }
                }
                else if (s.Length == 0)
                {
                    if (_nullableValueTypesParseEmptyStringToNull)
                    {
                        return(null);
                    }
                }

                return(valueTypeParser.Parse(s));
            };

            TryParseFunc <T?> tryParseFunc = (string s, out T? result) =>
            {
                if (s is null)
                {
                    if (_nullableValueTypesParseNullToNull)
                    {
                        result = null;
                        return(true);
                    }
                }
                else if (s.Length == 0)
                {
                    if (_nullableValueTypesParseEmptyStringToNull)
                    {
                        result = null;
                        return(true);
                    }
                }

                bool returnValue = valueTypeParser.TryParse(s, out T temp);
                result = temp;
                return(returnValue);
            };

            return(new FunctorParserObject <T?>(parseFunc, tryParseFunc));
        }
Beispiel #46
0
        private IParser <T> GetValueTypeParserObject <T>()
            where T : struct
        {
            Type type = typeof(T);

            if (type.GetTypeInfo().IsEnum)
            {
                return(GetEnumTypeParserObject <T>());
            }

            ParseFunc <T>    parseFunc    = GetDefaultParseFunc <T>();
            TryParseFunc <T> tryParseFunc = GetDefaultTryParseFunc <T>();

            return(ApplyOptionsAndGetValueTypeParserObject(parseFunc, tryParseFunc, _missingTryParse));
        }
Beispiel #47
0
 private static TryParseFunc <T> CreateWrapperForTryParse <T>(ParseFunc <T> parseFunc)
 {
     return((string s, out T result) =>
     {
         try
         {
             result = parseFunc(s);
             return true;
         }
         catch
         {
             result = default(T);
             return false;
         }
     });
 }
Beispiel #48
0
        /// <summary>
        /// Create a Matrix by parsing the file. The MatrixFactory may try many different parsers to get a result.
        /// </summary>
        /// <param name="filename">The name of the file containing the matrix information.</param>
        /// <param name="missingValue">The special value that represents missing in the created matrix.</param>
        /// <param name="parallelOptions">A ParallelOptions instance that configures the multithreaded behavior of this operation.</param>
        /// <param name="result">The matrix created.</param>
        /// <returns>true, if some parse succeeds; otherwise, false</returns>
        public bool TryParse(string filename, TValue missingValue, ParallelOptions parallelOptions, out Matrix <TRowKey, TColKey, TValue> result)
        {
            result = null;
            TextWriter    origErrorWriter = Console.Error;
            MFErrorWriter mfErrorWriter   = new MFErrorWriter();

            Console.SetError(mfErrorWriter);

            if (_registeredParsers.Count == 0 && _builtInParsers.Count == 0)
            {
                Console.Error.WriteLine("No matching parsers found");
            }

            foreach (TryParseMatrixDelegate <TRowKey, TColKey, TValue> ParseFunc in _registeredParsers)
            {
                mfErrorWriter.SetLabel(ParseFunc.ToString());
                if (ParseFunc(filename, missingValue, parallelOptions, out result))
                {
                    ErrorMessages = mfErrorWriter.ToString();
                    Console.SetError(origErrorWriter);
                    return(true);
                }
            }
            object[] methodParams4 = new object[] { filename, missingValue, parallelOptions, result };
            object[] methodParams3 = new object[] { filename, missingValue, result };
            foreach (MethodInfo ParseFuncMemberInfo in _builtInParsers)
            {
                mfErrorWriter.SetLabel(ParseFuncMemberInfo.DeclaringType.Name + "." + ParseFuncMemberInfo.Name);
                int argCount = ParseFuncMemberInfo.GetParameters().Length;
                Helper.CheckCondition(argCount == 3 || argCount == 4, Properties.Resource.ExpectedArgCountOfThreeOrFour);
                object[] methodParams = (3 == argCount) ? methodParams3 : methodParams4;
                bool     success      = (bool)ParseFuncMemberInfo.Invoke(null, methodParams);
                if (success)
                {
                    result        = (Matrix <TRowKey, TColKey, TValue>)methodParams[argCount - 1];//!!!const
                    ErrorMessages = mfErrorWriter.ToString();
                    Console.SetError(origErrorWriter);
                    return(true);
                }
            }
            ErrorMessages = mfErrorWriter.ToString();
            Console.SetError(origErrorWriter);
            return(false);
        }
Beispiel #49
0
        ExpressionToken ParseBinary(List<ExpressionToken> toks, ref int pos, ParseFunc nextlevel, params TokenKind[] kinds)
        {
            var res = nextlevel(toks, ref pos);

            while (true)
            {
                var kind = GetKind(toks, pos);
                if (Array.IndexOf(kinds,kind)>=0)
                {
                    var newres = toks[pos];
                    newres.Tok1 = res;
                    pos++;
                    newres.Tok2 = nextlevel(toks, ref pos);
                    res = newres;
                }
                else break;
            }

            return res;
        }
 public NumberParser(Type fieldType)
 {
     if (fieldType == typeof(float))
     {
         parseFunction  = (string input, out object value) => { float parsedVal; bool result = float.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (float)value1 == (float)value2;
     }
     else if (fieldType == typeof(double))
     {
         parseFunction  = (string input, out object value) => { double parsedVal; bool result = double.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (double)value1 == (double)value2;
     }
     else if (fieldType == typeof(decimal))
     {
         parseFunction  = (string input, out object value) => { decimal parsedVal; bool result = decimal.TryParse(input, out parsedVal); value = parsedVal; return(result); };
         equalsFunction = (object value1, object value2) => (decimal)value1 == (decimal)value2;
     }
     else
     {
         parseFunction  = null;
         equalsFunction = null;
     }
 }
Beispiel #51
0
        /** Registers a parser hook.
         *
         * Hooks have the following format:
         *   <fmt>  ::= <name> [<type> <name>]* [?<type> <name>]*
         *   <type> ::= int | str | sym | rand | char
         * The first <name> is called the directive for this hook. Any other hooks with
         * the same directive are superseded by this hook. It is an error for a
         * mandatory field to follow an optional field. It is an error for any field to
         * follow a field of type `str`, since `str` fields are not delimited and will
         * consume the entire rest of the line.
         */
        public Error Register(string fmt, ParseFunc pf)
        {
            //Misc.assert(p); //if p (self) was null, we wouldn't be here
            Misc.assert(fmt != null);
            Misc.assert(pf != null);

            Parser_Hook h = new Parser_Hook();

            h.func = pf;

            /*h.next = p.hooks;
             * h.func = func;*/
            Error r = parse_specs(h, fmt);

            if (r != Error.NONE)
            {
                return(r);
            }

            hooks.Add(h);
            //p.hooks = h;
            //mem_free(cfmt);
            return(Error.NONE);
        }
Beispiel #52
0
        static ParseFunc <T> GetParseFunc <T>(params object[] additionalParameters)
        {
            var type = typeof(T);
            var additionalParameterTypes = additionalParameters.Select(ap => ap != null ? ap.GetType() : typeof(void))
                                           .ToArray();
            var lutHash = GetHashForTryParse(type, additionalParameterTypes);

            if (!tryParseLut.TryGetValue(lutHash, out var tryParseMethod))
            {
                tryParseMethod = type.GetTypeInfo().DeclaredMethods
                                 .Where(mi => {
                    if (mi.Name != "TryParse")
                    {
                        return(false);
                    }

                    // It needs to be static, we don't have a T instance.
                    if (!mi.IsStatic)
                    {
                        return(false);
                    }

                    // If it doesn't return bool, it's no good.
                    if (mi.ReturnType != typeof(bool))
                    {
                        return(false);
                    }

                    var parameters = mi.GetParameters();

                    // If it doesn't take a string, it's no good.
                    if (parameters[0].ParameterType != typeof(string))
                    {
                        return(false);
                    }

                    var lastParameter = parameters.Last();

                    // If the last parameter isn't T&, it's no good.
                    if (lastParameter.ParameterType != typeof(T).MakeByRefType())
                    {
                        return(false);
                    }

                    var parameterCount = parameters.Length;

                    // There's no way this matches, if it doesn't have the right
                    // number of parameters.
                    if (parameterCount < (2 + additionalParameters.Length))
                    {
                        return(false);
                    }

                    var additionalTypesMatch = true;
                    for (var i = 0; i < additionalParameterTypes.Length; i++)
                    {
                        // Skip the first parameter.
                        var additionalParameterType = additionalParameterTypes[i];
                        // Null was passed, so don't type-check it.
                        if (additionalParameterType == typeof(void))
                        {
                            continue;
                        }
                        var parameter         = parameters[i + 1];
                        additionalTypesMatch &= parameter.ParameterType == additionalParameterType;
                    }

                    // If the additional types don't match, it's not match.
                    if (!additionalTypesMatch)
                    {
                        return(false);
                    }

                    return(true);
                }).FirstOrDefault();

                tryParseLut.Add(lutHash, tryParseMethod);
            }

            if (tryParseMethod == null)
            {
                return(null);
            }

            ParseFunc <T> del = delegate(string s, object[] additionalParams, out T result) {
                result = default(T);
                var methodParams = new object[] { s }.Concat(additionalParams)
                .Concat(new object[] { null })
                .ToArray();
                var parsed = (bool)tryParseMethod.Invoke(null, methodParams);
                if (parsed)
                {
                    result = (T)methodParams.Last();
                }
                return(parsed);
            };

            return(del);
        }
 /// <summary>
 /// Configures parsing of <typeparamref name="T"/> to use the provided function.
 /// </summary>
 /// <typeparam name="T">The type for which to configure parsing.</typeparam>
 /// <param name="parseFunc">A function that implements Parse method functionality for <typeparamref name="T"/>.</param>
 public void UseFunc <T>(ParseFunc <T> parseFunc) => UseFunc(parseFunc, MissingTryParseHandling.ThrowNotSupportedException);
 /// <summary>
 /// Configures parsing of <typeparamref name="T"/> to use the provided function.
 /// </summary>
 /// <typeparam name="T">The type for which to configure parsing.</typeparam>
 /// <param name="parseFunc">A function that implements Parse method functionality for <typeparamref name="T"/>.</param>
 /// <param name="missingTryParse">A value indicating how to configure TryParse functionality if the type does not have a TryParse method</param>
 public abstract void UseFunc <T>(ParseFunc <T> parseFunc, MissingTryParseHandling missingTryParse);
Beispiel #55
0
 public ProxySimpleTypeParser(ParseFunc procParse)
 {
     ProcParse = procParse;
 }
 /// <summary>
 /// Configures parsing of <typeparamref name="T"/> to use the provided functions.
 /// </summary>
 /// <typeparam name="T">The type for which to configure parsing.</typeparam>
 /// <param name="parseFunc">A function that implements Parse method functionality for <typeparamref name="T"/>.</param>
 /// <param name="tryParseFunc">A function that implements the TryParse method functionality for <typeparamref name="T"/>.</param>
 public abstract void UseFunc <T>(ParseFunc <T> parseFunc, TryParseFunc <T> tryParseFunc);
 public FunctorParserObject(ParseFunc <T> parseFunc, TryParseFunc <T> tryParseFunc)
 {
     _parseFunc    = parseFunc;
     _tryParseFunc = tryParseFunc;
 }
Beispiel #58
0
    public NumberParser(Type fieldType)
    {
        // 整型
        if (fieldType == typeof(int))
        {
            parseFunction  = (string input, out object value) => { bool result = int.TryParse(input, out int parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (int)value1 == (int)value2;
        }
        else if (fieldType == typeof(uint))
        {
            parseFunction  = (string input, out object value) => { bool result = uint.TryParse(input, out uint parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (uint)value1 == (uint)value2;
        }
        else if (fieldType == typeof(long))
        {
            parseFunction  = (string input, out object value) => { bool result = long.TryParse(input, out long parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (long)value1 == (long)value2;
        }
        else if (fieldType == typeof(ulong))
        {
            parseFunction  = (string input, out object value) => { bool result = ulong.TryParse(input, out ulong parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (ulong)value1 == (ulong)value2;
        }
        else if (fieldType == typeof(byte))
        {
            parseFunction  = (string input, out object value) => { bool result = byte.TryParse(input, out byte parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (byte)value1 == (byte)value2;
        }
        else if (fieldType == typeof(sbyte))
        {
            parseFunction  = (string input, out object value) => { bool result = sbyte.TryParse(input, out sbyte parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (sbyte)value1 == (sbyte)value2;
        }
        else if (fieldType == typeof(short))
        {
            parseFunction  = (string input, out object value) => { bool result = short.TryParse(input, out short parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (short)value1 == (short)value2;
        }
        else if (fieldType == typeof(ushort))
        {
            parseFunction  = (string input, out object value) => { bool result = ushort.TryParse(input, out ushort parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (ushort)value1 == (ushort)value2;
        }
        else if (fieldType == typeof(char))
        {
            parseFunction  = (string input, out object value) => { bool result = char.TryParse(input, out char parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (char)value1 == (char)value2;
        }

        // 浮点型
        else if (fieldType == typeof(float))
        {
            parseFunction  = (string input, out object value) => { bool result = float.TryParse(input, out float parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (float)value1 == (float)value2;
        }
        else if (fieldType == typeof(double))
        {
            parseFunction  = (string input, out object value) => { bool result = double.TryParse(input, out double parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (double)value1 == (double)value2;
        }
        else if (fieldType == typeof(decimal))
        {
            parseFunction  = (string input, out object value) => { bool result = decimal.TryParse(input, out decimal parsedVal); value = parsedVal; return(result); };
            equalsFunction = (object value1, object value2) => (decimal)value1 == (decimal)value2;
        }
        else
        {
            throw new Exception("Type必须是数字类型");
        }
    }