Esempio n. 1
0
        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);
        }
Esempio n. 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));
        }