コード例 #1
0
        //
        // letStatement: 'let' varName ('[' expression ']')? '=' expression ';'
        public void CompileLetStatement(int depth)
        {
            bool isLeftArray = false;

            // compile: 'let'
            var letToken = Eat("let");

            // compile: varName
            var varNameToken = EatIdentifier();
            var sbVarName    = SymbolTableManager.Find(varNameToken.Value);

            // compile: ('[' expression ']')?
            if (_tokenizer.CurrentToken.Value == "[")
            {
                isLeftArray = true;
                // compile: '['
                var leftBracketToken = Eat("[");

                // compile: expression
                CompileExpression(depth + 1, AssignmentType.LEFT);

                // write array
                _vmWriter.WritePush(sbVarName.KindDisplay, sbVarName.Number);
                _vmWriter.WriteOp(new Token {
                    Value = "+"
                });

                // compile: ']'
                var rightBracketToken = Eat("]");
            }

            // compile: '='
            var assignmentToken = Eat("=");

            // compile: expression
            CompileExpression(depth + 1, AssignmentType.RIGHT);

            // pop varAssigned
            if (isLeftArray)
            {
                _vmWriter.WritePop("temp", 0);
                _vmWriter.WritePop("pointer", 1);
                _vmWriter.WritePush("temp", 0);
                _vmWriter.WritePop("that", 0);
            }
            else
            {
                _vmWriter.WritePop(sbVarName.KindDisplay, sbVarName.Number);
            }

            // compile: ';'
            var semiColonToken = Eat(";");
        }