Example #1
0
        public static UnparsedTableauInput ResolveForm(IFormCollection requestForm)
        {
            var  formRows = new List <FormRow>();
            uint index    = 0;

            while (TryGetFormRow(out var formRow, index, requestForm))
            {
                formRows.Add(formRow);
                ++index;
            }

            var formulaParseRequests =
                from row in formRows
                let formulaParseRequest = new FormulaParseRequest()
            {
                ErrorResponse       = row.ErrorResponse,
                UnparsedTableauNode = new UnparsedTableauNode()
                {
                    Formula = row.Formula, TruthLabel = row.TruthLabel
                }
            }
            select formulaParseRequest;

            if (!(requestForm.TryGetValue($"{nameof(UnparsedTableauInput.ExpectedTableauType)}", out var expectedType) &&
                  Enum.TryParse(typeof(TableauType), expectedType[0], out var tableauExpectedType)))
            {
                throw new FormResolverException();
            }

            var unparsedTableauInput = new UnparsedTableauInput()
            {
                FormulaParseRequests = new List <FormulaParseRequest>(formulaParseRequests),
                ExpectedTableauType  = (TableauType)tableauExpectedType
            };

            if (unparsedTableauInput.HasAtleastOneParseRequest())
            {
                return(unparsedTableauInput);
            }
            else
            {
                throw new FormResolverException();
            }
        }
        ParseTableauInput(UnparsedTableauInput unparsedTableauInput)
        {
            if (!unparsedTableauInput.HasAtleastOneParseRequest())
            {
                throw new ConversionException("Unparsed tableau input must contain atleast one formula to parse");
            }

            if ((from request in unparsedTableauInput.FormulaParseRequests
                 where request.UnparsedTableauNode.Formula == null
                 select request).Any())
            {
                throw new ConstraintException("Unparsed tableau input contains null string as formula's string representation");
            }

            var parsedTableauNodes = new List <ParsedTableauNode>();

            try {
                foreach (var request in unparsedTableauInput.FormulaParseRequests)
                {
                    if (request.ErrorResponse != string.Empty)
                    {
                        continue;
                    }

                    try {
                        var formula = FormulaFactory.Parse(request.UnparsedTableauNode.Formula);
                        parsedTableauNodes.Add(new ParsedTableauNode()
                        {
                            Formula    = formula,
                            TruthLabel = request.UnparsedTableauNode.TruthLabel
                        });
                    }
                    catch (ParseException ex) {
                        request.ErrorResponse = ex.Message;
                    }
                }
            }
            catch (Exception ex) {
                throw new ConversionException($"Formula parser exception {ex.Message}");
            }

            if (unparsedTableauInput.HasErrorResponse())
            {
                return(new TableauInput(), unparsedTableauInput);
            }

            var tableauInput = new TableauInput()
            {
                TableauRoot = new TableauInputNode()
                {
                    Formula    = parsedTableauNodes[0].Formula,
                    TruthLabel = parsedTableauNodes[0].TruthLabel
                },
                TheoryAxioms = (from request in parsedTableauNodes.Skip(1)
                                let axiom = new TableauInputNode()
                {
                    Formula = request.Formula, TruthLabel = request.TruthLabel
                } select axiom).ToList()
            };

            return(tableauInput, new UnparsedTableauInput());
        }