private void ParseVar(Token token) { // Get variable name token = Lexer.GetNext(); if (token.Type != TokenType.Symbol) { Error(ErrorCode.ExpectedSymbol, token); return; } // Check if variable already exists int varId = GetVariableId(token.Value, false); if (varId != -1) { Error(ErrorCode.VariableAlreadyDefined, token); NextLine(); return; } if (InHeader) { // Create global variable varId = GetVariableId(token.Value); Debug.Assert(((ByteCodeVariableFlag)varId).HasFlag(ByteCodeVariableFlag.Global)); // Process any assignment if (Lexer.PeekNext().Type == TokenType.Equal) { // Consume equal sign Lexer.GetNext(); // Parse value (only literal value allowed here) if (!ParseLiteral(out Variable variable)) { return; } // Assign value to variable Variables[ByteCodeUtils.GetVariableIndex(varId)] = variable; } } else { // Create local variable varId = GetVariableId(token.Value); // Process any assignment if (Lexer.PeekNext().Type == TokenType.Equal) { // Consume equal sign Lexer.GetNext(); Writer.Write(ByteCode.OpCode.Assign, varId); if (!ParseExpression()) { return; } } } }
private Variable GetVariable(int varId) { if (ByteCodeUtils.IsGlobalVariable(varId)) { return(Variables[ByteCodeUtils.GetVariableIndex(varId)]); } var context = GetFunctionContext(); if (ByteCodeUtils.IsLocalVariable(varId)) { return(context.Variables[ByteCodeUtils.GetVariableIndex(varId)]); } // Function parameter return(context.Parameters[ByteCodeUtils.GetVariableIndex(varId)]); }