public void SET_VARS_TYPES_TEST() { var symbolsTable = new VectorSymbolTable(); for (int i = 0; i < 5; i++) { symbolsTable.Insert(new IdentificatorItem() { Lexeme = "Item " + i, Type = ItemType.Boolean }); } for (int i = 5; i < 8; i++) { symbolsTable.Insert(new IdentificatorItem() { Lexeme = "Item " + i }); } symbolsTable.SetTypeLastestVars(ItemType.Integer); for (int i = 5; i < 8; i++) { var item = symbolsTable.Search("Item " + i) as IdentificatorItem; Assert.IsNotNull(item); Assert.AreEqual(item.Type, ItemType.Integer); } }
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)); }
public void SET_FUNCTION_TYPE_TEST() { var symbolsTable = new VectorSymbolTable(); symbolsTable.Insert(new FunctionItem() { Lexeme = "Func1" }); symbolsTable.Insert(new FunctionItem() { Lexeme = "Func2" }); symbolsTable.SetFunctionType("Func1", ItemType.Boolean); var func = symbolsTable.Search("Func1") as FunctionItem; Assert.IsNotNull(func); Assert.AreEqual(func.Lexeme, "Func1"); Assert.AreEqual(ItemType.Boolean, func.Type); }
private ItemType GetIdentificatorType(string lexeme) { var item = _symbolTable.Search(lexeme); if (item != null) { var identificator = item as IdentificatorItem; if (identificator != null) { return(identificator.Type); } var func = item as FunctionItem; if (func != null) { return(func.Type); } } throw new ExpressionException(lexeme); }
private void AnalyzeSimpleCommand(bool isFunction = false) { if (_token.Symbol == Symbols.SIdentificador) { var item = _symbolTable.Search(_token.Lexeme); if (item == null) { RaiseNotFoundIdentificatorError(_token.Lexeme); } _analyzingLexeme = _token.Lexeme; var funcItem = item as FunctionItem; if (_funcInfo != null && funcItem?.Lexeme == _funcInfo.Name) { NextToken(); if (_token.Symbol == Symbols.SAtribuicao) { AnalyzeAttribution(); } else { throw new CompilationException(string.Format(WrongFunctionCall, _lexical.Position.Line, _lexical.Position.Column)); } if (isFunction) { _currentNode = _rootNode; } if (_currentNode != null) { _currentNode.Children.Add(new SyntaxTreeNode { Parent = _currentNode, Value = Symbols.SRetorno }); } _codeGenerator.GenerateInstruction(RETURNF, _funcInfo.FirstVarAddress, _funcInfo.VarsCount); } else { NextToken(); if (_token.Symbol == Symbols.SAtribuicao) { AnalyzeAttribution(); } else { AnalyzeProcCall(); } } } else if (_token.Symbol == Symbols.SSe) { AnalyzeIf(); } else if (_token.Symbol == Symbols.SEnquanto) { AnalyzeWhile(); } else if (_token.Symbol == Symbols.SLeia) { AnalyzeRead(); } else if (_token.Symbol == Symbols.SEscreva) { AnalyzeWrite(); } else { AnalyzeCommands(); } }