示例#1
0
        public GameWindowPresenter(IGameView view)
        {
            this.gameView = view;
            int themeID = 0;

            try
            {
                Lexemes.Clear();
                themeID = GetSelectedThemeID();
                if (themeID == -1)
                {
                    throw new Exception("Selected theme for game could not be found, please, select existing one in the Settings menu");
                }

                Lexemes.LexemeDictionary = LexemGateway.GetLexemes(themeID);
                if (Lexemes.LexemeDictionary.Count < 3)
                {
                    throw new Exception("The theme should contain at least 3 words to start a game");
                }
            }
            catch (Exception ex)
            {
                this.HandleException("", ex);
                CanBeStarted = false;
                return;
            }
            this.GameView.OnPlayEnd    += new PlayEnd(GameView_OnPlayEnd);
            this.GameView.OnThrowBegin += new ThrowBegin(GameView_OnThrowBegin);
            this.GameView.OnThrowEnd   += new ThrowEnd(GameView_OnThrowEnd);
            CanBeStarted = true;
        }
示例#2
0
        public static Entry[]  ProcessQuery(QueryPostfixForm postfixForm, TermIndexAccessor termIndex, bool appendIdMappings)
        {
            Stack opStack = new Stack();

            Entry[] result = null;
            Error = ErrorStatus.NoError;
            MappedInstances.Clear();

            if (!appendIdMappings)
            {
                Lexemes.Clear();
                Stopwords.Clear();
            }

            try
            {
                IteratePostfixExpression(postfixForm, termIndex, opStack);

                //-----------------------------------------------------------------
                //  Now only one Entry[] must remain on the top of the stack. It may
                //  be null if no document correspond to the query
                //-----------------------------------------------------------------
                if (opStack.Count != 1)
                {
                    throw new ApplicationException("QueryParser -- Illegal query statement found");
                }

                if (!(opStack.Peek() is StopwordTerm))
                {
                    result = ExtractOperandFromStack(opStack);
                    if (result != null)
                    {
                        Array.Sort(result, new CompareByTfIdf());
                    }
                }
            }
            catch (Exception exc)
            {
                Trace.WriteLine("QueryProcessor -- exception [" + exc.Message + "] occured.");
                //  Exception is raised if the expression was constructed with
                //  the syntactic errors.
                //  Clear the stack and put special marker on the top of it
                Error  = ErrorStatus.IllegalQuerySyntax;
                result = null;
            }
            opStack.Clear();
            return(result);
        }
示例#3
0
        void DisplayLexims(int themeID)
        {
            Lexemes.Clear();
            System.GC.Collect();
            ILexemGateway lexemGateway = Gateway.LexemGateway;

            Lexemes.LexemeDictionary = lexemGateway.GetLexemes(themeID);
            this.ThemeView.LeximListBox.ClearAllItems();
            foreach (Lexeme lex in Lexemes.LexemeCollection)
            {
                LeximDTView ldt = new LeximDTView(lex.ID, lex.ParentThemeID, lex.Word, lex.Picture, lex.Sound);
                this.ThemeView.LeximListBox.AddDisplayLexim(ldt, this.ThemeView.Play);
            }
            if (Lexemes.LexemeCollection.Count > 0)
            {
                this.ThemeView.LeximListBox.SetSelectionAt(0);
            }
            else
            {
                this.ThemeView.DisplayLexim(new LeximDTView(0, themeID, string.Empty, null, null), this.ThemeView.Play);
            }
        }
示例#4
0
        // Сканирование
        public void Scan(string source)
        {
            source = source.Replace('\n', ' ').Replace('\t', ' ');

            Logs.Clear();
            Lexemes.Clear();
            Identifiers.Clear();
            Literals.Clear();

            var  lexeme             = new StringBuilder();
            char character          = ' ';
            int  index              = 0;
            bool GetCharacterResult = false;

            Logs.Add(new ScannerLog(ScannerLogType.Start, null, LexemeType.NA, index, character));

            while (true)
            {
                lexeme.Clear();                                                  // Новая лексема
                GetCharacterResult = GetCharacter(source, index, out character); // Считываем текущий символ
                if (!GetCharacterResult)                                         // Если конец программы - break;
                {
                    Logs.Add(new ScannerLog(ScannerLogType.EndOfFile, lexeme, LexemeType.NA, index, character));
                    break;
                }

                if (IsLetter(character)) // Первый символ - буква
                {                        // <идентификатор> ::= буква | <идентификатор> буква | <идентификатор> цифра
                    Logs.Add(new ScannerLog(ScannerLogType.New, lexeme, LexemeType.IDN, index, character));
                    do
                    {
                        lexeme.Append(character);                                          // Конкатенация
                        Logs.Add(new ScannerLog(ScannerLogType.Concat, lexeme, LexemeType.IDN, index, character));
                        GetCharacterResult = GetCharacter(source, ++index, out character); // Считываем следующий символ
                    }while (GetCharacterResult && IsLetterOrDigit(character));

                    if (IsKeyword(lexeme.ToString()))
                    { // Ключевое слово
                        Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.KEY, index, character));
                        AddLexeme(LexemeType.KEY, lexeme);
                    }
                    else
                    { // Идентификатор
                        Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.IDN, index, character));
                        AddLexeme(LexemeType.IDN, lexeme);
                    }
                }

                else if (IsDigit(character)) // Первый символ - цифра
                {                            // <целое> ::= цифра | <целое> цифра
                    Logs.Add(new ScannerLog(ScannerLogType.New, lexeme, LexemeType.INT, index, character));
                    do
                    {
                        lexeme.Append(character);
                        Logs.Add(new ScannerLog(ScannerLogType.Concat, lexeme, LexemeType.INT, index, character));
                        GetCharacterResult = GetCharacter(source, ++index, out character);
                    }while (GetCharacterResult && IsDigit(character));

                    Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.INT, index, character));
                    AddLexeme(LexemeType.INT, lexeme);
                }

                else if (IsStringDelimiter(character)) // String разделитель
                {
                    int stringStartIndex = index;
                    lexeme.Append(character);
                    Logs.Add(new ScannerLog(ScannerLogType.Concat, lexeme, LexemeType.DLS, index, character));
                    AddLexeme(LexemeType.DLS, lexeme);
                    lexeme.Clear();

                    // Литерал
                    GetCharacterResult = GetCharacter(source, ++index, out character);
                    while (GetCharacterResult && !IsStringDelimiter(character))
                    { // Если мы нашли символ, и это не StringDelimiter
                        lexeme.Append(character);
                        Logs.Add(new ScannerLog(ScannerLogType.Concat, lexeme, LexemeType.STR, index, character));
                        GetCharacterResult = GetCharacter(source, ++index, out character);
                    }

                    Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.STR, index, character));
                    AddLexeme(LexemeType.STR, lexeme);

                    if (GetCharacterResult)
                    { // Если нашли завершающий StringDelimiter
                        lexeme.Clear();
                        lexeme.Append(character);
                        Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.DLS, index, character));
                        AddLexeme(LexemeType.DLS, lexeme);
                        index += 1; // Переход на следующий символ
                    }
                    else
                    {
                        Logs.Add(new ScannerLog(ScannerLogType.EndlessString, lexeme, LexemeType.DLS, index, character));
                        throw new ScannerException(stringStartIndex, ' ', "String termination character cannot be found");
                    }
                }

                else if (IsDelimiter1(character.ToString()))
                {
                    lexeme.Append(character);
                    Logs.Add(new ScannerLog(ScannerLogType.New, lexeme, LexemeType.DL1, index, character));

                    GetCharacterResult = GetCharacter(source, ++index, out character);
                    if (GetCharacterResult && IsDelimiter2(lexeme.ToString() + character))
                    { // Двухпозиционный разделитель
                        lexeme.Append(character);
                        Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.DL2, index, character));
                        AddLexeme(LexemeType.DL2, lexeme);
                        index += 1; // Переход на следующий символ
                    }
                    else
                    { // Однопозиционный разделитель
                        Logs.Add(new ScannerLog(ScannerLogType.Push, lexeme, LexemeType.DL1, index, character));
                        AddLexeme(LexemeType.DL1, lexeme);
                    }
                }

                else if (Char.IsWhiteSpace(character))
                {
                    Logs.Add(new ScannerLog(ScannerLogType.Skip, lexeme, LexemeType.NA, index, character));
                    index += 1;
                }

                else
                {
                    Logs.Add(new ScannerLog(ScannerLogType.Undefined, lexeme, LexemeType.NA, index, character));
                    throw new ScannerException(index, character, "Undefined symbol found");
                }
            }

            Logs.Add(new ScannerLog(ScannerLogType.Success, lexeme, LexemeType.NA, index, character));
        }