Ejemplo n.º 1
0
        TjsArray ParseArray(TextReader r)
        {
            TjsParser.Token token = null;

            List <TjsValue> inner = new List <TjsValue>();

            do
            {
                // 读取一个值
                TjsValue val = Parse(r);

                // 直接返回错误
                if (val == null)
                {
                    return(null);
                }

                inner.Add(val);

                // 读取其后的符号
                token = GetNext(r);
                if (token.t == TokenType.Symbol)
                {
                    if (token.val == "]")
                    {
                        // 读取完毕
                        TjsArray ret = new TjsArray(inner);
                        return(ret);
                    }
                    else if (token.val != ",")
                    {
                        // 错误的符号
                        ShowError("Expect a Comma");
                        break;
                    }
                }
                else
                {
                    // 错误的符号
                    ShowError("Expect a Symbol");
                    break;
                }
            } while (token.t != TokenType.Unknow);

            ShowError("Array Parsing Failed");
            ShowError(token);
            return(null);
        }
Ejemplo n.º 2
0
        public TjsValue Parse(TextReader r)
        {
            TjsParser.Token token = null;
            do
            {
                token = GetNext(r);
                if (token.t == TokenType.Number)
                {
                    // 解析出数字
                    TjsNumber ret = token.ToTjsNumber();
                    if (ret == null)
                    {
                        // 数字格式错误
                        ShowError("Invalid Number");
                        break;
                    }
                    return(ret);
                }
                else if (token.t == TokenType.String)
                {
                    // 解析出字符串
                    TjsString ret = token.ToTjsString();
                    if (ret == null)
                    {
                        // 字符串格式错误
                        ShowError("Invalid String");
                        break;
                    }
                    return(ret);
                }
                else if (token.t == TokenType.Symbol)
                {
                    // 兼容2.28
                    if (token.val == "(const)" || token.val == "int" || token.val == "string")
                    {
                        // 啥也不干
                    }
                    else if (token.val == "void")
                    {
                        // 解析出空值
                        return(new TjsVoid());
                    }
                    else if (token.val == "%[")
                    {
                        // 返回字典
                        TjsDict ret = ParseDict(r);
                        return(ret);
                    }
                    else if (token.val == "[")
                    {
                        // 返回数组
                        TjsArray ret = ParseArray(r);
                        return(ret);
                    }
                    else
                    {
                        // 无效的符号
                        ShowError("Invalid Symbol");
                        break;
                    }
                }
            } while (token.t != TokenType.Unknow);

            if (token.t != TokenType.Unknow)
            {
                ShowError("Value Parsing Failed");
                ShowError(token);
            }

            return(null);
        }