Пример #1
0
        /// <summary>
        /// Experimenta a leitura de um polinómio univariável a partir de uma lista de símbolos.
        /// </summary>
        /// <param name="symbolListToParse">A lista de símbolos.</param>
        /// <param name="value">O valor que receberá o polinómio lido.</param>
        /// <returns>Verdadeiro caso a leitura seja bem-sucedida e falso caso contrário.</returns>
        public bool TryParse(
            ISymbol <string, string>[] symbolListToParse,
            out UnivariatePolynomialNormalForm <CoeffType> value)
        {
            var arrayReader = new ArraySymbolReader <string, string>(symbolListToParse, "eof");

            return(this.polynomialReader.TryParsePolynomial(arrayReader, this.conversion, out value));
        }
Пример #2
0
        public bool TryParse(
            ISymbol <string, ESymbolSetType>[] symbolListToParse,
            out HashSet <ObjectType> value)
        {
            var openSymbol = -1;

            for (int i = 0; i < symbolListToParse.Length; ++i)
            {
                var currentSymbol = symbolListToParse[i];
                if (currentSymbol.SymbolType == ESymbolSetType.LBRACE)
                {
                    openSymbol = i;
                    i          = symbolListToParse.Length;
                }
                else if (currentSymbol.SymbolType != ESymbolSetType.SPACE && currentSymbol.SymbolType != ESymbolSetType.CHANGE_LINE)
                {
                    i = symbolListToParse.Length;
                }
            }

            if (openSymbol == -1)
            {
                value = default(HashSet <ObjectType>);
                return(false);
            }
            else
            {
                var closeSymbol = -1;
                for (int i = symbolListToParse.Length - 1; i > openSymbol; --i)
                {
                    var currentSymbol = symbolListToParse[i];
                    if (currentSymbol.SymbolType == ESymbolSetType.RBRACE)
                    {
                        closeSymbol = i;
                        i           = openSymbol;
                    }
                    else if (currentSymbol.SymbolType != ESymbolSetType.SPACE && currentSymbol.SymbolType != ESymbolSetType.CHANGE_LINE)
                    {
                        i = openSymbol;
                    }
                }

                if (closeSymbol == -1)
                {
                    value = default(HashSet <ObjectType>);
                    return(false);
                }
                else
                {
                    var elementsNumber = closeSymbol - openSymbol - 1;
                    var elementsArray  = new ISymbol <string, ESymbolSetType> [elementsNumber];
                    Array.Copy(symbolListToParse, openSymbol + 1, elementsArray, 0, elementsNumber);
                    var arraySymbolReader = new ArraySymbolReader <string, ESymbolSetType>(elementsArray, ESymbolSetType.EOF);
                    return(this.expressionReader.TryParse(arraySymbolReader, out value));
                }
            }
        }
Пример #3
0
        /// <summary>
        /// Realiza a leitura.
        /// </summary>
        /// <remarks>
        /// Se a leitura não for bem-sucedida, os erros de leitura serão registados no diário
        /// e será retornado o objecto por defeito.
        /// </remarks>
        /// <param name="symbolListToParse">O vector de símbolos a ser lido.</param>
        /// <param name="errorLogs">O objecto que irá manter o registo do diário da leitura.</param>
        /// <returns>O valor lido.</returns>
        public int Parse(
            ISymbol <string, string>[] symbolListToParse,
            ILogStatus <string, EParseErrorLevel> errorLogs)
        {
            var arrayReader = new ArraySymbolReader <string, string>(
                symbolListToParse,
                Utils.GetStringSymbolType(EStringSymbolReaderType.EOF));
            var value = this.expressionReader.Parse(arrayReader, errorLogs);

            return(value);
        }
        /// <summary>
        /// Realiza a leitura.
        /// </summary>
        /// <remarks>
        /// Se a leitura não for bem-sucedida, os erros de leitura serão registados no diário
        /// e será retornado o objecto por defeito.
        /// </remarks>
        /// <param name="symbolListToParse">O vector de símbolos a ser lido.</param>
        /// <param name="errorLogs">O objecto que irá manter o registo do diário da leitura.</param>
        /// <returns>O valor lido.</returns>
        public virtual ObjectType Parse(
            ISymbol <string, string>[] symbolListToParse,
            ILogStatus <string, EParseErrorLevel> errorLogs)
        {
            var arrayReader = new ArraySymbolReader <string, string>(
                symbolListToParse,
                Utils.GetStringSymbolType(EStringSymbolReaderType.EOF));
            var value = default(ObjectType);

            this.expressionReader.TryParsePolynomial(
                arrayReader,
                errorLogs,
                out value);
            return(value);
        }
Пример #5
0
        /// <summary>
        /// Realiza a leitura.
        /// </summary>
        /// <remarks>
        /// Se a leitura não for bem-sucedida, os erros de leitura serão registados no diário
        /// e será retornado o objecto por defeito.
        /// </remarks>
        /// <param name="symbolListToParse">O vector de símbolos a ser lido.</param>
        /// <param name="errorLogs">O objecto que irá manter o registo do diário da leitura.</param>
        /// <returns>O valor lido.</returns>
        public Polynomial <CoeffType> Parse(
            ISymbol <string, string>[] symbolListToParse,
            ILogStatus <string, EParseErrorLevel> errorLogs)
        {
            var arrayReader = new ArraySymbolReader <string, string>(
                symbolListToParse,
                Utils.GetStringSymbolType(EStringSymbolReaderType.EOF));
            var value = default(Polynomial <CoeffType>);

            this.polynomialReader.TryParsePolynomial(
                arrayReader,
                this.conversion,
                errorLogs,
                out value);
            return(value);
        }
Пример #6
0
        /// <summary>
        /// Tenta efectuar a leitura.
        /// </summary>
        /// <param name="symbolListToParse">A lista de símbolos a ler.</param>
        /// <param name="value">O valor que contém a leitura.</param>
        /// <returns>Verdadeiro caso a leitura seja bem-sucedida e falso caso contrário.</returns>
        public bool TryParse(ISymbol <string, string>[] symbolListToParse, out int value)
        {
            var arrayReader = new ArraySymbolReader <string, string>(symbolListToParse, "eof");

            return(this.expressionReader.TryParse(arrayReader, out value));
        }
Пример #7
0
        /// <summary>
        /// Realiza a leitura.
        /// </summary>
        /// <remarks>
        /// Se a leitura não for bem-sucedida, os erros de leitura serão registados no diário
        /// e será retornado o objecto por defeito.
        /// </remarks>
        /// <param name="symbolListToParse">O vector de símbolos a ser lido.</param>
        /// <param name="errorLogs">O objecto que irá manter o registo do diário da leitura.</param>
        /// <returns>O valor lido.</returns>
        public HashSet <ObjectType> Parse(
            ISymbol <string, ESymbolSetType>[] symbolListToParse,
            ILogStatus <string, EParseErrorLevel> errorLogs)
        {
            var value      = default(HashSet <ObjectType>);
            var openSymbol = -1;

            for (int i = 0; i < symbolListToParse.Length; ++i)
            {
                var currentSymbol = symbolListToParse[i];
                if (currentSymbol.SymbolType == ESymbolSetType.LBRACE)
                {
                    openSymbol = i;
                    i          = symbolListToParse.Length;
                }
                else if (currentSymbol.SymbolType != ESymbolSetType.SPACE && currentSymbol.SymbolType != ESymbolSetType.CHANGE_LINE)
                {
                    i = symbolListToParse.Length;
                }
            }

            if (openSymbol == -1)
            {
                errorLogs.AddLog(
                    "Found no open symbol.",
                    EParseErrorLevel.ERROR);
            }
            else
            {
                var closeSymbol = -1;
                for (int i = symbolListToParse.Length - 1; i > openSymbol; --i)
                {
                    var currentSymbol = symbolListToParse[i];
                    if (currentSymbol.SymbolType == ESymbolSetType.RBRACE)
                    {
                        closeSymbol = i;
                        i           = openSymbol;
                    }
                    else if (currentSymbol.SymbolType != ESymbolSetType.SPACE && currentSymbol.SymbolType != ESymbolSetType.CHANGE_LINE)
                    {
                        i = openSymbol;
                    }
                }

                if (closeSymbol == -1)
                {
                    errorLogs.AddLog(
                        "Found no close symbol.",
                        EParseErrorLevel.ERROR);
                }
                else
                {
                    var elementsNumber = closeSymbol - openSymbol - 1;
                    var elementsArray  = new ISymbol <string, ESymbolSetType> [elementsNumber];
                    Array.Copy(symbolListToParse, openSymbol + 1, elementsArray, 0, elementsNumber);
                    var arraySymbolReader = new ArraySymbolReader <string, ESymbolSetType>(elementsArray, ESymbolSetType.EOF);
                    value = this.expressionReader.Parse(arraySymbolReader, errorLogs);
                }
            }

            return(value);
        }