private Chunk ParseChunk(out bool success) { var reskey = new Tuple2<int, string>(position, "Chunk"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Chunk; } int errorCount = Errors.Count; Chunk chunk = new Chunk(); int start_position = position; ParseSpOpt(out success); while (true) { while (true) { int seq_start_position1 = position; Statement statement = ParseStatement(out success); if (success) { chunk.Statements.Add(statement); } else { break; } while (true) { int seq_start_position2 = position; MatchTerminal(';', out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple3<object, bool, int>(chunk, success, position); return chunk; }
/// <summary> /// LoadContent will be called once per game and is the place to load /// all of your content. /// </summary> protected override void LoadContent() { // Create a new SpriteBatch, which can be used to draw textures. spriteBatch = new SpriteBatch(GraphicsDevice); // TODO: use this.Content to load your game content here m_env = new Env(); m_sunImg = Content.Load<Texture2D>("sun"); string sunSpriteSer = @" {Sprites:[ {Offset:{X:0,Y:0},Rectangle:{Height:122,Width:158,X:0,Y:0}}, {Offset:{X:4,Y:0},Rectangle:{Height:122,Width:135,X:158,Y:0}} ]} "; MemoryStream ms = new MemoryStream(); StreamWriter sw = new StreamWriter(ms); sw.Write(sunSpriteSer); sw.Flush(); ms.Flush(); ms.Seek(0, SeekOrigin.Begin); System.Runtime.Serialization.Json.DataContractJsonSerializer serializer = new System.Runtime.Serialization.Json.DataContractJsonSerializer(typeof(SpriteSheet)); m_sunSS = (SpriteSheet)serializer.ReadObject(ms); m_sun = new Item(m_sunImg, m_sunSS); string script = "a != b"; /* string script = @" item.SetSprite((env.GetTimeMs() / 200) % 2); item.SetSprite = 0; "; */ Parser parser = new Parser(); TextInput ti = new TextInput(script); bool succ; m_script = parser.ParseChunk(ti, out succ); if (!succ) Debug.WriteLine(parser.GetEorrorMessages()); m_globals = new LuaTable(); LuaTable methods = new LuaTable(); methods.SetNameValue("__index", methods); methods.SetNameValue("__newindex", methods); methods.Register("SetSprite", m_sun.SetSprite_FromScript); m_globals.SetNameValue("item", new Language.Lua.LuaUserdata(m_sun, methods)); methods = new LuaTable(); methods.SetNameValue("__index", methods); methods.Register("GetTimeMs", m_env.GetTimeMs); m_globals.SetNameValue("env", new LuaUserdata(m_env, methods)); m_env.TimeMs = 0; }
private Chunk ParseChunk(out bool success) { var reskey = new Tuple<int, string>(position, "Chunk"); if (ParsingResults.ContainsKey(reskey)) { var parsingResult = ParsingResults[reskey]; success = parsingResult.Item2; position = parsingResult.Item3; return parsingResult.Item1 as Chunk; } //[PixelCrushers]int errorCount = Errors.Count; Chunk chunk = new Chunk(); //[PixelCrushers]int start_position = position; ParseSpOpt(out success); while (true) { while (true) { //[PixelCrushers] Don't consume end/else/elseif because control blocks need to see them. if (PeekTerminalString("end") || PeekTerminalString("else") || PeekTerminalString("elseif")) { return chunk; } //[PixelCrushers]int seq_start_position1 = position; Statement statement = ParseStatement(out success); if (success) { chunk.Statements.Add(statement); } else { break; } while (true) { //[PixelCrushers]int seq_start_position2 = position; MatchTerminal(';', out success); if (!success) { break; } ParseSpOpt(out success); break; } success = true; break; } if (!success) { break; } } success = true; ParsingResults[reskey] = new Tuple<object, bool, int>(chunk, success, position); return chunk; }