コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        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);
        }
コード例 #5
0
        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();
            }
        }