示例#1
0
        public void SEARCH_BY_LEVEL_TEST()
        {
            var symbolsTable = new VectorSymbolTable();
            var func         = new FunctionItem()
            {
                Lexeme = "Func1"
            };
            var proc = new ProcItem()
            {
                Lexeme = "Proc1"
            };
            var item1 = new IdentificatorItem()
            {
                Lexeme = "x", Type = ItemType.Boolean, Level = 1
            };
            var item2 = new IdentificatorItem()
            {
                Lexeme = "a", Type = ItemType.Integer, Level = 2
            };
            var item3 = new IdentificatorItem()
            {
                Lexeme = "b", Type = ItemType.Integer, Level = 2
            };

            for (int i = 0; i < 5; i++)
            {
                symbolsTable.Insert(new IdentificatorItem()
                {
                    Lexeme = "Item " + i, Type = ItemType.Boolean
                });
            }

            symbolsTable.Insert(func);
            symbolsTable.Insert(item1);
            symbolsTable.Insert(proc);
            symbolsTable.Insert(item2);
            symbolsTable.Insert(item3);

            var result = symbolsTable.SearchByLevel(item1.Lexeme, 1);

            Assert.AreEqual(result, item1);

            result = symbolsTable.SearchByLevel(item2.Lexeme, 1);
            Assert.IsNull(result);

            result = symbolsTable.SearchByLevel(item1.Lexeme, 2);
            Assert.IsNull(result);

            result = symbolsTable.SearchByLevel(item2.Lexeme, 2);
            Assert.AreEqual(result, item2);

            result = symbolsTable.SearchByLevel(item3.Lexeme, 2);
            Assert.AreEqual(result, item3);
        }
示例#2
0
        private uint AnalyzeVars()
        {
            uint count = 0;

            do
            {
                if (_token.Symbol == Symbols.SIdentificador)
                {
                    if (_symbolTable.SearchByLevel(_token.Lexeme, _level) != null)
                    {
                        RaiseDoubleError(Symbols.SIdentificador);
                    }

                    _symbolTable.Insert(new IdentificatorItem()
                    {
                        Lexeme = _token.Lexeme,
                        Level  = _level,
                        Memory = _memory
                    });

                    count++;
                    _memory++;
                    NextToken();

                    if (_token.Symbol == Symbols.SVirgula || _token.Symbol == Symbols.SDoisPontos)
                    {
                        if (_token.Symbol == Symbols.SVirgula)
                        {
                            NextToken();

                            if (_token.Symbol == Symbols.SDoisPontos)
                            {
                                RaiseGeneralErrorMessage($"Esperado identificador no lugar do símbolo '{_token.Lexeme}'");
                            }
                        }
                    }
                    else
                    {
                        RaiseUnexpectedTokenError("\",\" ou \":\"");
                    }
                }
            } while (_token.Symbol != Symbols.SDoisPontos);

            NextToken();
            AnalyzeType();

            return(count);
        }