//解析区域代码内容 ({} 之间的内容) private void ParseStatement() { Token token = ReadToken(); switch (token.Type) { case TokenType.Var: ParseVar(); break; case TokenType.LeftBrace: ParseBlock(); break; case TokenType.If: ParseIf(); break; case TokenType.For: ParseFor(); break; case TokenType.Foreach: ParseForeach(); break; case TokenType.While: ParseWhile(); break; case TokenType.Switch: ParseSwtich(); break; case TokenType.Try: ParseTry(); break; case TokenType.Throw: ParseThrow(); break; case TokenType.Return: ParseReturn(); break; case TokenType.Sharp: ParseSharp(); break; case TokenType.Identifier: case TokenType.Increment: case TokenType.Decrement: case TokenType.Eval: ParseExpression(); break; case TokenType.Break: m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.BREAK, new CodeObject(m_strBreviary, token.SourceLine))); break; case TokenType.Continue: m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.CONTINUE, new CodeObject(m_strBreviary, token.SourceLine))); break; case TokenType.Function: ParseFunction(); break; case TokenType.SemiColon: break; default: throw new ParserException("不支持的语法 ", token); } }
//解析区域代码内容 ({} 之间的内容) private void ParseStatement() { Token token = ReadToken(); switch (token.Type) { case TokenType.Var: { string str = ReadIdentifier(); m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.VAR, str)); Token peek = PeekToken(); if (peek.Type == TokenType.Assign) { UndoToken(); ParseStatement(); } else if (peek.Type == TokenType.Comma) { while (PeekToken().Type == TokenType.Comma) { ReadToken(); m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.VAR, ReadIdentifier())); } } } break; case TokenType.LeftBrace: ParseBlock(); break; case TokenType.If: ParseIf(); break; case TokenType.For: ParseFor(); break; case TokenType.Foreach: ParseForeach(); break; case TokenType.While: ParseWhile(); break; case TokenType.Switch: ParseSwtich(); break; case TokenType.Try: ParseTry(); break; case TokenType.Throw: ParseThrow(); break; case TokenType.Return: { Token peek = PeekToken(); if (peek.Type == TokenType.RightBrace || peek.Type == TokenType.SemiColon || peek.Type == TokenType.Finished) { m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.RET, new CodeScriptObject(m_script, null))); } else { m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.RET, GetObject())); } } break; case TokenType.Identifier: case TokenType.Increment: case TokenType.Decrement: case TokenType.Eval: UndoToken(); ParseExpression(); break; case TokenType.Break: m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.BREAK, new CodeObject(m_strBreviary, token.SourceLine))); break; case TokenType.Continue: m_scriptExecutable.AddScriptInstruction(new ScriptInstruction(Opcode.CONTINUE, new CodeObject(m_strBreviary, token.SourceLine))); break; case TokenType.Function: ParseFunction(); break; case TokenType.SemiColon: break; default: throw new ParserException("不支持的语法 ", token); } }