コード例 #1
0
ファイル: Serializer.cs プロジェクト: Nimaoth/OMCL
        public void Serialize(OMCLItem item)
        {
            switch (item.Type)
            {
            case OMCLItem.OMCLItemType.Object:
                Write(item.AsObject());
                break;

            case OMCLItem.OMCLItemType.Array:
                Write(item.AsArray());
                break;

            case OMCLItem.OMCLItemType.String:
                Write(item.AsString());
                break;

            case OMCLItem.OMCLItemType.Bool:
                Write(item.AsBool());
                break;

            case OMCLItem.OMCLItemType.Int:
                Write(item.AsInt());
                break;

            case OMCLItem.OMCLItemType.Float:
                Write(item.AsFloat());
                break;
            }

            _writer.Flush();
            _writer.Close();
        }
コード例 #2
0
        private object ConvertItemToValue(Type targetType, OMCLItem item)
        {
            var tags       = item.Tags;
            var sourceType = item.Type;

            switch (sourceType)
            {
            case OMCLItem.OMCLItemType.None:
                return(ConvertNone(targetType, tags));

            case OMCLItem.OMCLItemType.String:
                return(ConvertString(targetType, tags, item.AsString()));

            case OMCLItem.OMCLItemType.Int:
                return(Convert.ChangeType(item.AsInt(), targetType));

            case OMCLItem.OMCLItemType.Bool:
                return(item.AsBool());

            case OMCLItem.OMCLItemType.Float:
                return(Convert.ChangeType(item.AsFloat(), targetType));

            case OMCLItem.OMCLItemType.Object:
                return(ConvertObject(targetType, tags, item.AsObject()));

            case OMCLItem.OMCLItemType.Array:
                return(ConvertArray(targetType, tags, item.AsArray()));

            default:
                throw new NotImplementedException();
            }
        }
コード例 #3
0
        private OMCLItem DoParseObject(List <string> tags)
        {
            SkipNewlines();
            if (!Expect(TokenType.OpenBrace))
            {
                ReportError("Failed to parse object. Expected '{'");
            }

            if (CheckToken(TokenType.ClosingBrace))
            {
                NextToken();
                return(new OMCLObject());
            }

            var resultObject = DoParseObject(TokenType.ClosingBrace);

            if (!Expect(TokenType.ClosingBrace))
            {
                ReportError("Failed to parse object. Expected '}}'");
            }

            OMCLItem result = resultObject;

            result.Tags = tags;
            return(result);
        }
コード例 #4
0
        private OMCLItem DoParseArray(List <string> tags)
        {
            OMCLArray resultArray = new OMCLArray();

            if (!Expect(TokenType.OpenBracket))
            {
                ReportError("Failed to parse array. Expected '['");
            }

            SkipNewlines();

            var next = PeekToken();

            while (true)
            {
                if (next.Type == TokenType.EOF)
                {
                    ReportError("Unexpected end of file in array");
                    return(null);
                }

                if (next.Type == TokenType.ClosingBracket)
                {
                    break;
                }

                var item = ParseItem();
                resultArray.Add(item);

                bool nl = SkipNewlines();
                next = PeekToken();
                if (next.Type == TokenType.ClosingBracket)
                {
                    break;
                }
                else if (next.Type == TokenType.Comma)
                {
                    NextToken();
                    SkipNewlines();
                    next = PeekToken();
                }
                else if (!nl)
                {
                    ReportError("Failed to parse array. Expected '\\n' or ',' after value in array");
                    return(null);
                }
            }

            if (!Expect(TokenType.ClosingBracket))
            {
                ReportError("Failed to parse array. Expected ']'");
                return(null);
            }

            OMCLItem result = resultArray;

            result.Tags = tags;
            return(result);
        }
コード例 #5
0
ファイル: Serializer.cs プロジェクト: Nimaoth/OMCL
        private void WriteValue(OMCLItem item)
        {
            var prev = _indentationLevel++;

            try {
                foreach (var t in item.Tags)
                {
                    _writer.Write($"!{t} ");
                }

                switch (item.Type)
                {
                case OMCLItem.OMCLItemType.Object:
                    Write(item.AsObject());
                    break;

                case OMCLItem.OMCLItemType.Array:
                    Write(item.AsArray());
                    break;

                case OMCLItem.OMCLItemType.String:
                    var str     = item.AsString();
                    var parts   = str.Split('"');
                    var escaped = string.Join("\" '\"' \"", parts);
                    Write(escaped);
                    break;

                case OMCLItem.OMCLItemType.Bool:
                    Write(item.AsBool());
                    break;

                case OMCLItem.OMCLItemType.Int:
                    Write(item.AsInt());
                    break;

                case OMCLItem.OMCLItemType.Float:
                    Write(item.AsFloat());
                    break;

                case OMCLItem.OMCLItemType.None:
                    Write(item.AsNone());
                    break;
                }
            }
            finally {
                _indentationLevel = prev;
            }
        }
コード例 #6
0
        private void SetField(MemberInfo info, object obj, OMCLItem item)
        {
            switch (info)
            {
            case PropertyInfo pi: {
                object val = ConvertItemToValue(pi.PropertyType, item);
                pi.SetValue(obj, val);
                break;
            }

            case FieldInfo fi: {
                object val = ConvertItemToValue(fi.FieldType, item);
                fi.SetValue(obj, val);
                break;
            }
            }
        }
コード例 #7
0
        public OMCLItem ParseItem()
        {
            var tags = ParseTags();

            SkipNewlines();

            var next = PeekToken();

            switch (next.Type)
            {
            case TokenType.OpenBrace:
                return(DoParseObject(tags));

            case TokenType.OpenBracket:
                return(DoParseArray(tags));

            case TokenType.String: {
                NextToken();

                var sb = new StringBuilder();
                sb.Append(next.value as string);

                while (true)
                {
                    next = PeekToken();
                    if (next.Type == TokenType.String)
                    {
                        sb.Append(next.value as string);
                        NextToken();
                    }
                    else
                    {
                        break;
                    }
                }

                OMCLItem result = sb.ToString();
                result.Tags = tags;
                return(result);
            }

            case TokenType.KwFalse: goto case TokenType.KwTrue;

            case TokenType.KwTrue: {
                NextToken();
                OMCLItem result = next.Type == TokenType.KwTrue;
                result.Tags = tags;
                return(result);
            }

            case TokenType.KwNone: {
                NextToken();
                OMCLItem result = new OMCLNone();
                result.Tags = tags;
                return(result);
            }

            case TokenType.Int: {
                NextToken();
                OMCLItem result = (long)next.value;
                result.Tags = tags;
                return(result);
            }

            case TokenType.Float: {
                NextToken();
                OMCLItem result = (double)next.value;
                result.Tags = tags;
                return(result);
            }
            }

            throw new NotImplementedException(nameof(ParseItem));
        }