Example #1
0
        private void OnStateChanged(StringBuilder lexemeBuilder)
        {
            var lexeme = lexemeBuilder.ToString();
            var token  = Tokenize(lexeme);

            if (token == Token.Unknown)
            {
                var error = CategorizeError(lexeme);
                ErrorTable.Add(new ErrorRecord
                {
                    Lexeme = lexeme,
                    Error  = error
                });

                return;
            }

            if (IgnoredTokensLookup.ContainsKey(token))
            {
                return;
            }

            TokensTable.Add(new TokenRecord
            {
                Lexeme = lexeme,
                Token  = token
            });
        }
Example #2
0
        public void Analysis(string inputText)
        {
            inputText = deleteReturnCorret(inputText);
            int lineCount  = 1;
            int spaceCount = 0;

            for (int i = 0; i < inputText.Length;)
            {
                while (i < inputText.Length && inputText[i] == ' ' && inputText[i] == '\t')
                {
                    spaceCount++;
                    if (inputText[i] == '\t')
                    {
                        spaceCount += 3;
                    }
                    i++;
                }

                if (Char.IsLetter(inputText[i]) || inputText[i] == '_')
                {
                    string temp = "";
                    while (i < inputText.Length && !symbols.ContainsKey(inputText[i]))
                    {
                        temp += inputText[i];
                        ++i;
                    }
                    if (words.ContainsKey(temp))
                    {
                        TokensTable.Add(new Token(Token.TokenType.WORD, temp, lineCount, spaceCount));
                    }
                    else
                    {
                        SymbolsTable.Add(new Symbol(temp));
                        TokensTable.Add(new Token(Token.TokenType.ID, (SymbolsTable.Count - 1).ToString(), lineCount, spaceCount));
                    }
                }
                else if (Char.IsDigit(inputText[i]))
                {
                    string temp = "";
                    while (i < inputText.Length && !symbols.ContainsKey(inputText[i]))
                    {
                        temp += inputText[i];
                        ++i;
                    }
                    TokensTable.Add(new Token(Token.TokenType.CONST, temp, lineCount, spaceCount));
                    if (temp.Contains('.'))
                    {
                        TokensTable[TokensTable.Count - 1].ConstType = Symbol.SymType.FLOAT;
                    }
                }
                else if (symbols.ContainsKey(inputText[i]))
                {
                    if (symbols[inputText[i]] == Symbols.QMARK || symbols[inputText[i]] == Symbols.QQMARK)
                    {
                        i++;
                        string temp = "";
                        while (i < inputText.Length && symbols[inputText[i]] != Symbols.QMARK && symbols[inputText[i]] != Symbols.QQMARK)
                        {
                            temp += inputText[i];
                            i++;
                        }
                        TokensTable.Add(new Token(Token.TokenType.CONST, temp, lineCount, spaceCount, Symbol.SymType.STRING));
                        i++;
                        spaceCount = 0;
                        continue;
                    }

                    if (symbols[inputText[i]] == Symbols.SRET)
                    {
                        lineCount++;
                    }
                    TokensTable.Add(new Token(Token.TokenType.SYMBOL, inputText[i].ToString(), lineCount, spaceCount));
                    i++;
                }
                else
                {
                    ErrorsTable.Add(new ErrorMessage($"Unexpected symbol: {inputText[i]}", lineCount));
                    return;
                }
                spaceCount = 0;
            }
        }