Пример #1
0
 private bool isLiteral(EScriptToken token)
 {
     switch (token)
     {
     case EScriptToken.ESCRIPTTOKEN_LOCALSTRING:
     case EScriptToken.ESCRIPTTOKEN_STRING:
     case EScriptToken.ESCRIPTTOKEN_INTEGER:
     case EScriptToken.ESCRIPTTOKEN_FLOAT:
         return(true);
     }
     return(false);
 }
Пример #2
0
        public async Task <List <TokenEntry> > ReadBuffer()
        {
            List <TokenEntry> objects = new List <TokenEntry>();

            while (true)
            {
                EScriptToken symbol = GetNextToken();
                if (symbol == EScriptToken.ESCRIPTTOKEN_ENDOFFILE)
                {
                    break;
                }
                object value = await GetSymbolValue(symbol);

                objects.Add(new TokenEntry {
                    type = symbol, value = value
                });
                if (printTokens)
                {
                    Console.WriteLine("Got token" + symbol.ToString() + " " + (value == null ? "null" : value.ToString()));
                }
            }
            return(objects);
        }
Пример #3
0
        private async Task <object> GetSymbolValue(EScriptToken type)
        {
            switch (type)
            {
            case EScriptToken.ESCRIPTTOKEN_FLOAT:
                return(_bs.ReadSingle());

            case EScriptToken.ESCRIPTTOKEN_INTEGER:
                return(_bs.ReadInt32());

            case EScriptToken.ESCRIPTTOKEN_NAME:
                var checksum = _bs.ReadUInt32();
                try
                {
                    return(await _resolver.ResolveChecksum(checksum));
                } catch
                {
                    return(checksum);
                }

            case EScriptToken.ESCRIPTTOKEN_LOCALSTRING:
            case EScriptToken.ESCRIPTTOKEN_STRING:

                var    length = _bs.ReadInt32();
                string s      = "";
                while (length-- > 0)
                {
                    var c = _bs.ReadChar();
                    if (c != 0)
                    {
                        s += c;
                    }
                }
                return(s);

            case EScriptToken.ESCRIPTTOKEN_KEYWORD_SCRIPT:
                _bs.ReadByte();          //function size
                return(_bs.ReadInt32()); //script name

            //case EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDSCRIPT:
            case EScriptToken.ESCRIPTTOKEN_COMMA:
            case EScriptToken.ESCRIPTTOKEN_ENDOFLINE:
            case EScriptToken.ESCRIPTTOKEN_EQUALS:
            case EScriptToken.ESCRIPTTOKEN_STARTSTRUCT:
            case EScriptToken.ESCRIPTTOKEN_ENDSTRUCT:
            case EScriptToken.ESCRIPTTOKEN_STARTARRAY:
            case EScriptToken.ESCRIPTTOKEN_ENDARRAY:
            case EScriptToken.ESCRIPTTOKEN_OPENPARENTH:
            case EScriptToken.ESCRIPTTOKEN_CLOSEPARENTH:
            case EScriptToken.ESCRIPTTOKEN_ARG:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_ALLARGS:
            case EScriptToken.ESCRIPTTOKEN_GREATERTHAN:
            case EScriptToken.ESCRIPTTOKEN_GREATERTHANEQUAL:
            case EScriptToken.ESCRIPTTOKEN_LESSTHAN:
            case EScriptToken.ESCRIPTTOKEN_LESSTHANEQUAL:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDIF:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDSCRIPT:
            case EScriptToken.ESCRIPTTOKEN_MULTIPLY:
            case EScriptToken.ESCRIPTTOKEN_DIVIDE:
            case EScriptToken.ESCRIPTTOKEN_DOT:
            case EScriptToken.ESCRIPTTOKEN_ADD:
            case EScriptToken.ESCRIPTTOKEN_MINUS:
            case EScriptToken.ESCRIPTTOKEN_OR:
            case EScriptToken.ESCRIPTTOKEN_AND:
            case EScriptToken.ESCRIPTTOKEN_COLON:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_SWITCH:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDSWITCH:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_NOT:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_RANDOM:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_BEGIN:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_REPEAT:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_CASE:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_DEFAULT:
            case EScriptToken.ESCRIPTTOKEN_KEYWORD_RETURN:
                return(null);

            case EScriptToken.ESCRIPTTOKEN_RUNTIME_RELATIVE_JUMP:
                return(_bs.ReadInt16());

            case EScriptToken.ESCRIPTTOKEN_RUNTIME_IF2:
            case EScriptToken.ESCRIPTTOKEN_RUNTIME_ELSE2:
                return(_bs.ReadInt16());    //jump length

            case EScriptToken.ESCRIPTTOKEN_ENDOFLINENUMBER:
                return(null);

            case EScriptToken.ESCRIPTTOKEN_CHECKSUM_NAME:
                var    checksum_number = _bs.ReadUInt32();
                string checksum_name   = "";
                while (true)
                {
                    var c = _bs.ReadChar();
                    if (c == 0)
                    {
                        break;
                    }
                    checksum_name += c;
                }
                if (insertChecksums)
                {
                    var generated_checksum = await _resolver.GenerateChecksum(checksum_name);

                    if (generated_checksum != checksum_number)
                    {
                        throw new ArgumentException("Checksum mismatch", checksum_name);
                    }
                }

                return(checksum_name);

            case EScriptToken.ESCRIPTTOKEN_VECTOR:
                var res = new float[3];
                res[0] = _bs.ReadSingle();
                res[1] = _bs.ReadSingle();
                res[2] = _bs.ReadSingle();
                return(res);

            default:
                throw new ArgumentException("Got unhandled symbol", type.ToString());
            }
        }
Пример #4
0
        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            writer.WriteStartObject();
            var qList = (List <TokenEntry>)value;

            bool         inAssignment    = false;
            bool         hasDoubleObject = false;
            bool         skipFunction    = false;
            bool         inArray         = false;
            EScriptToken lastToken       = EScriptToken.ESCRIPTTOKEN_ENDOFFILE;

            for (var i = 0; i < qList.Count; i++)
            {
                var item = qList[i];
                if (skipFunction && item.type != EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDSCRIPT)
                {
                    continue;
                }
                switch (item.type)
                {
                case EScriptToken.ESCRIPTTOKEN_NAME:
                    if (inAssignment || inArray)
                    {
                        writer.WriteValue(item.value.ToString());
                        inAssignment = false;
                    }
                    else
                    {
                        writer.WritePropertyName(item.value.ToString());
                        if (qList[i + 1].type != EScriptToken.ESCRIPTTOKEN_EQUALS /*&& qList[i + 2].type != EScriptToken.ESCRIPTTOKEN_EQUALS*/)
                        {
                            writer.WriteValue(true);
                        }
                    }

                    break;

                case EScriptToken.ESCRIPTTOKEN_INTEGER:
                    if (isLiteral(lastToken))
                    {
                        continue;
                    }
                    inAssignment = false;
                    try
                    {
                        writer.WriteValue((int)item.value);
                    } catch
                    {
                        writer.WritePropertyName("unnamed");
                        writer.WriteValue((int)item.value);
                    }
                    break;

                case EScriptToken.ESCRIPTTOKEN_FLOAT:
                    if (isLiteral(lastToken))
                    {
                        continue;
                    }
                    inAssignment = false;
                    writer.WriteValue((float)item.value);
                    break;

                case EScriptToken.ESCRIPTTOKEN_STRING:
                case EScriptToken.ESCRIPTTOKEN_LOCALSTRING:
                    if (isLiteral(lastToken))
                    {
                        continue;
                    }
                    inAssignment = false;
                    writer.WriteValue((string)item.value);
                    break;

                case EScriptToken.ESCRIPTTOKEN_ARRAY:
                case EScriptToken.ESCRIPTTOKEN_STARTARRAY:
                    inAssignment = false;
                    inArray      = true;
                    try
                    {
                        writer.WriteStartArray();
                    } catch
                    {
                        writer.WritePropertyName("unnamed");
                        writer.WriteStartArray();
                    }

                    break;

                case EScriptToken.ESCRIPTTOKEN_ENDARRAY:
                    inArray = false;
                    writer.WriteEndArray();
                    break;

                case EScriptToken.ESCRIPTTOKEN_STARTSTRUCT:
                    if (lastToken == item.type)
                    {
                        hasDoubleObject = true;
                        continue;
                    }
                    try
                    {
                        writer.WriteStartObject();
                        inAssignment = false;
                        inArray      = false;
                    } catch
                    {
                        writer.WritePropertyName("unnamed");

                        writer.WriteStartObject();
                    }
                    break;

                case EScriptToken.ESCRIPTTOKEN_ENDSTRUCT:
                    if (lastToken == item.type && hasDoubleObject)
                    {
                        hasDoubleObject = false;
                        continue;
                    }
                    writer.WriteEndObject();
                    break;

                case EScriptToken.ESCRIPTTOKEN_EQUALS:
                    inAssignment = true;
                    break;

                case EScriptToken.ESCRIPTTOKEN_ENDOFLINE:
                    break;

                case EScriptToken.ESCRIPTTOKEN_KEYWORD_SCRIPT:
                    skipFunction = true;
                    break;

                case EScriptToken.ESCRIPTTOKEN_KEYWORD_ENDSCRIPT:
                    skipFunction = false;
                    break;

                case EScriptToken.ESCRIPTTOKEN_CHECKSUM_NAME:
                case EScriptToken.ESCRIPTTOKEN_ENDOFFILE:
                case EScriptToken.ESCRIPTTOKEN_COMMA:
                    break;

                case EScriptToken.ESCRIPTTOKEN_VECTOR:
                    inAssignment = false;
                    writer.WriteStartObject();
                    float[] v = (float[])item.value;
                    writer.WritePropertyName("x");
                    writer.WriteValue(v[0]);
                    writer.WritePropertyName("y");
                    writer.WriteValue(v[1]);
                    writer.WritePropertyName("z");
                    writer.WriteValue(v[2]);
                    writer.WriteEndObject();
                    break;

                default:
                    throw new NotImplementedException();
                    break;
                }
                if (item.type != EScriptToken.ESCRIPTTOKEN_ENDOFLINE)
                {
                    lastToken = item.type;
                }
            }
            writer.WriteEndObject();
        }