예제 #1
0
 private static Value Parse(Lexer lexer)
 {
     try {
         var token = lexer.NextToken();
         if (token == "[")
         {
             var result = new ValueList();
             var next   = lexer.NextToken();
             while (next != "]")
             {
                 lexer.PutBackToken(next);
                 result.AddItem(Parse(lexer));
                 next = lexer.NextToken();
                 if (next != "]")
                 {
                     lexer.PutBackToken(next);
                     lexer.MatchToken(",");
                     next = lexer.NextToken();
                 }
             }
             return(result);
         }
         if (token == "{")
         {
             var result = new ValueMap();
             var next   = lexer.NextToken();
             while (next != "}")
             {
                 lexer.PutBackToken(next);
                 var key = lexer.NextToken();
                 if (!key.StartsWith("\""))
                 {
                     throw new Exception("Expected object key, but got " + key);
                 }
                 key = key.Substring(1, key.Length - 2);
                 lexer.MatchToken(":");
                 result.AddItem(new ValueString(key), Parse(lexer));
                 next = lexer.NextToken();
                 if (next != "}")
                 {
                     lexer.PutBackToken(next);
                     lexer.MatchToken(",");
                     next = lexer.NextToken();
                 }
             }
             return(result);
         }
         if (token.StartsWith("\""))
         {
             return(new ValueString(token.Substring(1, token.Length - 2)));
         }
         if (token == "true" || token == "false")
         {
             return(ValueBoolean.From(bool.Parse(token)));
         }
         if (token == "null")
         {
             return(ValueNull.NULL);
         }
         if (token.IndexOf('.') == -1)
         {
             return(new ValueInt(long.Parse(token)));
         }
         return(new ValueDecimal(decimal.Parse(token)));
     } catch (Exception) {
         return(null);
     }
 }
예제 #2
0
        public Value Evaluate(Environment environment)
        {
            Value value = this.expression.Evaluate(environment);
            Value start = this.start.Evaluate(environment);
            Value end   = this.end != null?this.end.Evaluate(environment) : null;

            if (value == ValueNull.NULL)
            {
                return(ValueNull.NULL);
            }
            if (value.IsString())
            {
                var s        = value.AsString().GetValue();
                int idxStart = (int)start.AsInt().GetValue();
                int idxEnd   = end == null ? s.Length : (int)end.AsInt().GetValue();
                if (idxStart < 0)
                {
                    idxStart = idxStart + s.Length;
                }
                if (idxEnd < 0)
                {
                    idxEnd = idxEnd + s.Length;
                }
                if (idxStart < 0)
                {
                    idxStart = 0;
                }
                if (idxEnd > s.Length)
                {
                    idxEnd = s.Length;
                }
                return(new ValueString(s.Substring(idxStart, idxEnd - idxStart)));
            }
            if (value.IsList())
            {
                var list     = value.AsList().GetValue();
                int idxStart = (int)start.AsInt().GetValue();
                int idxEnd   = end == null ? list.Count : (int)end.AsInt().GetValue();
                if (idxStart < 0)
                {
                    idxStart = idxStart + list.Count;
                }
                if (idxEnd < 0)
                {
                    idxEnd = idxEnd + list.Count;
                }
                if (idxStart < 0)
                {
                    idxStart = 0;
                }
                if (idxEnd > list.Count)
                {
                    idxEnd = list.Count;
                }
                var result = new ValueList();
                for (int i = idxStart; i < idxEnd; i++)
                {
                    result.AddItem(list[i]);
                }
                return(result);
            }
            throw new ControlErrorException(new ValueString("ERROR"), "Cannot slice value " + value, this.pos);
        }
예제 #3
0
        public override Value Execute(Args args, Environment environment, SourcePos pos)
        {
            var a = args.Get("a");
            var b = args.Get("b");

            if (a.IsNull() || b.IsNull())
            {
                return(ValueNull.NULL);
            }

            if (a.IsInt() && b.IsInt())
            {
                return(new ValueInt(a.AsInt().GetValue() - b.AsInt().GetValue()));
            }

            if (a.IsNumerical() && b.IsNumerical())
            {
                return(new ValueDecimal(a.AsDecimal().GetValue() - b.AsDecimal().GetValue()));
            }

            if (a.IsDate())
            {
                if (b.IsDate())
                {
                    return(new ValueInt(a.AsDate().GetValue().Subtract(b.AsDate().GetValue()).Days));
                }
                return(new ValueDate(a.AsDate().GetValue() - TimeSpan.FromDays((double)args.GetAsDecimal("b").GetValue())));
            }

            if (a.IsList())
            {
                var result = new ValueList();
                foreach (var item in a.AsList().GetValue())
                {
                    var add = true;
                    foreach (var val in args.GetAsList("b").GetValue())
                    {
                        if (!item.IsEquals(val))
                        {
                            continue;
                        }
                        add = false;
                        break;
                    }
                    if (add)
                    {
                        result.AddItem(item);
                    }
                }

                return(result);
            }

            if (a.IsSet())
            {
                var result = new ValueSet();
                var minus  = new SortedSet <Value>(new ComparerValue());
                if (b.IsSet())
                {
                    minus = new SortedSet <Value>(b.AsSet().GetValue(), new ComparerValue());
                }
                else if (b.IsList())
                {
                    foreach (var element in b.AsList().GetValue())
                    {
                        minus.Add(element);
                    }
                }
                else
                {
                    minus.Add(b);
                }
                foreach (var element in a.AsSet().GetValue())
                {
                    if (!minus.Contains(element))
                    {
                        result.AddItem(element);
                    }
                }
                return(result);
            }

            throw new ControlErrorException(new ValueString("ERROR"), "Cannot subtract " + b + " from " + a, pos);
        }
예제 #4
0
        public Value Evaluate(Environment environment)
        {
            var list = expression.Evaluate(environment);

            if (list.IsInput())
            {
                var    input  = list.AsInput();
                Value  result = ValueBoolean.TRUE;
                string line   = null;
                try
                {
                    line = input.ReadLine();
                    while (line != null)
                    {
                        var value = new ValueString(line);
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], value);
                        }
                        else
                        {
                            var vals = value.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                        line = input.ReadLine();
                    }
                    if (identifiers.Count == 1)
                    {
                        environment.Remove(identifiers[0]);
                    }
                    else
                    {
                        for (var i = 0; i < identifiers.Count; i++)
                        {
                            environment.Remove(identifiers[i]);
                        }
                    }
                }
                catch (IOException)
                {
                    throw new ControlErrorException(new ValueString("ERROR"), "Cannot read from input", pos);
                }
                return(result);
            }
            if (list.IsList())
            {
                Value result = ValueBoolean.TRUE;
                foreach (var value in list.AsList().GetValue())
                {
                    if (identifiers.Count == 1)
                    {
                        environment.Put(identifiers[0], value);
                    }
                    else
                    {
                        var vals = value.AsList().GetValue();
                        for (int i = 0; i < identifiers.Count; i++)
                        {
                            environment.Put(identifiers[i], vals[i]);
                        }
                    }
                    result = block.Evaluate(environment);
                    if (result.IsBreak())
                    {
                        result = ValueBoolean.TRUE;
                        break;
                    }

                    if (result.IsContinue())
                    {
                        result = ValueBoolean.TRUE;
                        // continue
                    }

                    if (result.IsReturn())
                    {
                        break;
                    }
                }
                if (identifiers.Count == 1)
                {
                    environment.Remove(identifiers[0]);
                }
                else
                {
                    for (var i = 0; i < identifiers.Count; i++)
                    {
                        environment.Remove(identifiers[i]);
                    }
                }
                return(result);
            }
            if (list.IsSet())
            {
                Value result = ValueBoolean.TRUE;
                foreach (var value in list.AsSet().GetValue())
                {
                    if (identifiers.Count == 1)
                    {
                        environment.Put(identifiers[0], value);
                    }
                    else
                    {
                        var vals = value.AsList().GetValue();
                        for (int i = 0; i < identifiers.Count; i++)
                        {
                            environment.Put(identifiers[i], vals[i]);
                        }
                    }
                    result = block.Evaluate(environment);
                    if (result.IsBreak())
                    {
                        result = ValueBoolean.TRUE;
                        break;
                    }

                    if (result.IsContinue())
                    {
                        result = ValueBoolean.TRUE;
                        // continue
                    }

                    if (result.IsReturn())
                    {
                        break;
                    }
                }
                if (identifiers.Count == 1)
                {
                    environment.Remove(identifiers[0]);
                }
                else
                {
                    for (var i = 0; i < identifiers.Count; i++)
                    {
                        environment.Remove(identifiers[i]);
                    }
                }
                return(result);
            }
            if (list.IsMap())
            {
                Value result = ValueBoolean.TRUE;
                if (what == "keys")
                {
                    foreach (var val in list.AsMap().GetValue().Keys.ToList())
                    {
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], val);
                        }
                        else
                        {
                            var vals = val.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                else if (what == "values")
                {
                    foreach (var val in list.AsMap().GetValue().Values.ToList())
                    {
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], val);
                        }
                        else
                        {
                            var vals = val.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                else if (what == "entries")
                {
                    foreach (var entry in list.AsMap().GetValue().ToList())
                    {
                        ValueList val = new ValueList();
                        val.AddItem(entry.Key);
                        val.AddItem(entry.Value);
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], val);
                        }
                        else
                        {
                            var vals = val.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                if (identifiers.Count == 1)
                {
                    environment.Remove(identifiers[0]);
                }
                else
                {
                    for (var i = 0; i < identifiers.Count; i++)
                    {
                        environment.Remove(identifiers[i]);
                    }
                }
                return(result);
            }
            if (list.IsObject())
            {
                Value result = ValueBoolean.TRUE;
                if (what == "keys")
                {
                    foreach (var key in list.AsObject().value.Keys.ToList())
                    {
                        Value val = new ValueString(key);
                        environment.Put(identifiers[0], val);
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                else if (what == "values")
                {
                    foreach (var val in list.AsObject().value.Values.ToList())
                    {
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], val);
                        }
                        else
                        {
                            var vals = val.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                else if (what == "entries")
                {
                    foreach (var entry in list.AsObject().value.ToList())
                    {
                        var val = new ValueList();
                        val.AddItem(new ValueString(entry.Key));
                        val.AddItem(entry.Value);
                        if (identifiers.Count == 1)
                        {
                            environment.Put(identifiers[0], val);
                        }
                        else
                        {
                            var vals = val.AsList().GetValue();
                            for (int i = 0; i < identifiers.Count; i++)
                            {
                                environment.Put(identifiers[i], vals[i]);
                            }
                        }
                        result = block.Evaluate(environment);
                        if (result.IsBreak())
                        {
                            result = ValueBoolean.TRUE;
                            break;
                        }

                        if (result.IsContinue())
                        {
                            result = ValueBoolean.TRUE;
                            // continue
                        }

                        if (result.IsReturn())
                        {
                            break;
                        }
                    }
                }
                if (identifiers.Count == 1)
                {
                    environment.Remove(identifiers[0]);
                }
                else
                {
                    for (var i = 0; i < identifiers.Count; i++)
                    {
                        environment.Remove(identifiers[i]);
                    }
                }
                return(result);
            }
            if (list.IsString())
            {
                var   str    = list.AsString().GetValue();
                Value result = ValueBoolean.TRUE;
                foreach (var value in str)
                {
                    environment.Put(identifiers[0], new ValueString(value.ToString()));
                    result = block.Evaluate(environment);
                    if (result.IsBreak())
                    {
                        result = ValueBoolean.TRUE;
                        break;
                    }

                    if (result.IsContinue())
                    {
                        result = ValueBoolean.TRUE;
                        // continue
                    }

                    if (result.IsReturn())
                    {
                        break;
                    }
                }
                environment.Remove(identifiers[0]);
                return(result);
            }
            throw new ControlErrorException(new ValueString("ERROR"), "Cannot iterate over " + list, pos);
        }
예제 #5
0
        private void CollectFiles(string dir, bool recursive, bool include_path, bool include_dirs, ValueList result)
        {
            var files = Directory.EnumerateFileSystemEntries(dir);

            foreach (var file in files)
            {
                var isDir = (File.GetAttributes(file) & FileAttributes.Directory) != 0;
                if (include_dirs || !isDir)
                {
                    result.AddItem(new ValueString(include_path ? file : Path.GetFileName(file)));
                }
                if (recursive && isDir)
                {
                    CollectFiles(file, recursive, include_path, include_dirs, result);
                }
            }
        }
예제 #6
0
 public ValueList(ValueList value)
 {
     ((List <Value>) this.value).AddRange(value.value);
 }
예제 #7
0
        public override Value Execute(Args args, Environment environment, SourcePos pos)
        {
            var a = args.Get("a");
            var b = args.Get("b");

            if (a.IsNull() || b.IsNull())
            {
                return(ValueNull.NULL);
            }

            if (a.IsInt() && b.IsInt())
            {
                return(new ValueInt(a.AsInt().GetValue() + b.AsInt().GetValue()));
            }

            if (a.IsNumerical() && b.IsNumerical())
            {
                return(new ValueDecimal(a.AsDecimal().GetValue() + b.AsDecimal().GetValue()));
            }

            if (a.IsList())
            {
                if (b.IsCollection())
                {
                    return(new ValueList(a.AsList().GetValue()).AddItems(b.AsList().GetValue()));
                }
                return(new ValueList(a.AsList().GetValue()).AddItem(b));
            }

            if (a.IsDate() && b.IsNumerical())
            {
                return(new ValueDate(a.AsDate().GetValue() + TimeSpan.FromDays((double)args.GetAsDecimal("b").GetValue())));
            }

            if (a.IsSet())
            {
                if (b.IsCollection())
                {
                    return(new ValueSet(a.AsSet().GetValue()).AddItems(b.AsSet().GetValue()));
                }
                return(new ValueSet(a.AsSet().GetValue()).AddItem(b));
            }

            if (b.IsList())
            {
                var result = new ValueList();
                result.AddItem(a);
                result.AddItems(b.AsList().GetValue());
                return(result);
            }

            if (b.IsSet())
            {
                var result = new ValueSet();
                result.AddItem(a);
                result.AddItems(b.AsSet().GetValue());
                return(result);
            }

            if (a.IsString() && b.IsAtomic() || a.IsAtomic() && b.IsString())
            {
                return(new ValueString(a.AsString().GetValue() + b.AsString().GetValue()));
            }

            throw new ControlErrorException(new ValueString("ERROR"), "Cannot add " + a + " and " + b, pos);
        }