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()); }