public abstract void StaticDeclaration(Symbol variable);
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);
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, ";")); }
//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); }
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); }