private void AnalyzeProcDcl() { _isAnalyzingFunction = false; NextToken(); if (_token.Symbol != Symbols.SIdentificador) { RaiseUnexpectedTokenError("identificador"); } var item = _symbolTable.Search(_token.Lexeme); if (item != null) { RaiseDoubleError(Symbols.SProcedimento); } _codeGenerator.GenerateLabel(_lastLabel); item = new ProcItem { Lexeme = _token.Lexeme, Level = _level, Label = _codeGenerator.GetStringLabelFor(_lastLabel) }; _symbolTable.Insert(item); _level++; NextToken(); if (_token.Symbol != Symbols.SPontoVirgula) { RaiseMissingSemicolonError(); } AnalyzeBlock(); _symbolTable.CleanUpToLevel(_level); _level--; _codeGenerator.GenerateInstruction(RETURN); }
public void CLEAN_UP_TEST() { var symbolsTable = new VectorSymbolTable(); var item1 = new IdentificatorItem() { Lexeme = "a", Type = ItemType.Boolean, Level = 1 }; var item2 = new IdentificatorItem() { Lexeme = "x", Type = ItemType.Integer, Level = 2 }; var item3 = new IdentificatorItem() { Lexeme = "y", Type = ItemType.Integer, Level = 1 }; var func = new FunctionItem() { Lexeme = "func", Type = ItemType.Integer, }; var proc = new ProcItem() { Lexeme = "proc" }; symbolsTable.Insert(func); symbolsTable.Insert(item1); symbolsTable.Insert(item3); symbolsTable.Insert(proc); symbolsTable.Insert(item2); symbolsTable.CleanUpToLevel(2); Assert.IsNull(symbolsTable.Search(item2.Lexeme)); symbolsTable.CleanUpToLevel(1); Assert.IsNull(symbolsTable.Search(item1.Lexeme)); Assert.IsNull(symbolsTable.Search(item3.Lexeme)); }