コード例 #1
0
        public void WriteExpr(CompilationUnit compUnit)
        {
            var compUnits = compUnit.CompUnits;

            if (compUnits.Count == 1)
            {
                Token token = compUnits[0];
                if (token.TokenType == TokenType.INT_CONST)
                {
                    _vmWriter.WritePush("constant", Convert.ToInt32(token.Value));
                }
                else if (token.TokenType == TokenType.IDENTIFIER)
                {
                    var sbUnit = SymbolTableManager.Find(token.Value);
                    _vmWriter.WritePush(sbUnit.Kind.ToString(), sbUnit.Number);
                }
            }
        }
コード例 #2
0
        //
        // subroutineBody: '{' varDec* statements '}'
        public void CompileSubroutineBody(int depth, string subType, string subName, string className)
        {
            // compile: '{'
            var leftBraceToken = Eat("{");

            // compile: varDec*
            while (_tokenizer.CurrentToken.Value == "var")
            {
                CompileVarDec(depth + 1);
            }
            _vmWriter.WriteFunction(string.Format("{0}.{1}", className, subName), SymbolTableManager.GetLocalsNum());
            // if constructor -> allocate
            if (subType == "constructor")
            {
                int wordsToAllocate = SymbolTableManager.GetFieldsNum();
                _vmWriter.WritePush("constant", wordsToAllocate);
                _vmWriter.WriteCall("Memory.alloc", 1);
                _vmWriter.WritePop("pointer", 0);
            }
            else if (subType == "method")
            {
                _vmWriter.WritePush("argument", 0);
                _vmWriter.WritePop("pointer", 0);
            }

            // compile: statements
            CompileStatements(depth + 1);

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