public abstract void StaticDeclaration(Symbol variable);
Пример #2
0
        private void ParseLocalVarDecl()
        {
            Contract.Requires(IsNextTokenLocalVarDecl());

            Match(new Token(TokenType.Keyword, "var"));
            Token varType = NextToken();

            while (true)
            {
                Token varName = NextToken();

                Symbol variable = new Symbol(
                    varType.Value, varName.Value, SymbolKind.Local, _currentClassName);

                //Locals can't clash with parameter names. This will fail when
                //adding to the symbol table, but crash explicitly:
                if (_methodSymTable.HasSymbol(variable.Name))
                {
                    ThrowCompilationException(
                        "Variable name '" + variable.Name +
                        "' conflicts with existing local variable or formal parameter");
                }

                _methodSymTable.AddSymbol(variable);
                _currentSub.Locals.Add(variable);

                //NOTE: We don't notify the CG of the local declaration,
                //because we include this information when declaring the whole
                //subroutine to the CG.

                if (LookAheadToken.Value != ",")
                {
                    break;
                }
                Match(new Token(TokenType.Symbol, ","));
            }

            Match(new Token(TokenType.Symbol, ";"));
        }
 public abstract void FieldDeclaration(Symbol variable);
Пример #4
0
        private void ParseClassVarDecl()
        {
            Contract.Requires(IsNextTokenClassVarDecl());

            Token varKind = NextToken();
            bool isStatic = varKind.Value == "static";
            Token varType = NextToken();
            Token varName = NextToken();

            do
            {
                if (isStatic)
                {
                    Symbol variable = new Symbol(
                        varType.Value, varName.Value, SymbolKind.Static, _currentClassName);
                    _classSymTable.AddSymbol(variable);
                    _codeGenerator.StaticDeclaration(variable);
                }
                else
                {
                    Symbol variable = new Symbol(
                        varType.Value, varName.Value, SymbolKind.Field, _currentClassName);
                    _classSymTable.AddSymbol(variable);
                    _codeGenerator.FieldDeclaration(variable);
                }
            } while (LookAheadToken.Value == ",");

            Match(new Token(TokenType.Symbol, ";"));
        }
Пример #5
0
        //formal-param-list ::= ((<type> <var-name>) (',' <type> <var-name>)*)?
        private void ParseFormalParamList()
        {
            while (LookAheadToken.Value != ")")
            {
                Token paramType = NextToken();
                Token paramName = NextToken();

                if (paramType.Type != TokenType.Keyword &&
                    paramType.Type != TokenType.Ident)
                {
                    ThrowCompilationException("Invalid parameter type '" + paramType.Value + "'");
                }
                if (paramName.Type != TokenType.Ident)
                {
                    ThrowCompilationException("Invalid parameter name '" + paramName.Value + "'");
                }

                Symbol parameter = new Symbol(paramType.Value, paramName.Value,
                    SymbolKind.Parameter, _currentClassName);
                _currentSub.Parameters.Add(parameter);
                _methodSymTable.AddSymbol(parameter);

                if (LookAheadToken.Value == ",")
                {
                    NextToken();//Skip the comma
                }
            }
        }
 public override void FieldDeclaration(Symbol variable)
 {
     Output.WriteLine(
         "FIELD {0} {1}.{2}",
         variable.Type, variable.DeclaringClassName, variable.Name);
 }
 public override void StaticDeclaration(Symbol variable)
 {
     Output.WriteLine(
         "STATIC {0} {1}.{2}",
         variable.Type, variable.DeclaringClassName, variable.Name);
 }
Пример #8
0
        public void AddSymbol(Symbol symbol)
        {
            Contract.Requires(symbol != null &&
                              symbol.Name != null &&
                              symbol.Type != null);
            Contract.Requires(!HasSymbol(symbol.Name));

            _symbols.Add(symbol.Name, symbol);
        }
 public override void StaticDeclaration(Symbol variable)
 {
     Output.WriteLine(
         "static __WORD {0};",
         FormatStaticName(variable.Name));
 }
 public override void FieldDeclaration(Symbol variable)
 {
     _fields.Add(variable);
 }
Пример #11
0
 public override void FieldDeclaration(Symbol variable)
 {
     Output.WriteLine(
         "FIELD {0} {1}.{2}",
         variable.Type, variable.DeclaringClassName, variable.Name);
 }
Пример #12
0
 public override void StaticDeclaration(Symbol variable)
 {
     Output.WriteLine(
         "STATIC {0} {1}.{2}",
         variable.Type, variable.DeclaringClassName, variable.Name);
 }