private ParseTree Parse(string source, List <EqlError> errors) { if (string.IsNullOrWhiteSpace(source)) { throw new EqlException("Source is empty."); } if (errors == null) { errors = new List <EqlError>(); } var grammar = new EqlGrammar(); var language = new LanguageData(grammar); var parser = new Parser(language); var tree = parser.Parse(source); if (tree.HasErrors()) { foreach (var error in tree.ParserMessages.Where(x => x.Level == Irony.ErrorLevel.Error)) { EqlError err = new EqlError { Message = error.Message }; err.Line = error.Location.Line; err.Column = error.Location.Column; errors.Add(err); } } return(tree); }
/// <summary> /// Build EQL to SQL /// </summary> /// <param name="parameters"></param> /// <returns></returns> public EqlBuildResult Build(List <EqlParameter> parameters = null) { if (parameters != null) { Parameters = parameters; } var grammar = new EqlGrammar(); var language = new LanguageData(grammar); var parser = new Parser(language); List <EqlError> errors = new List <EqlError>(); var parseTree = Parse(Text, errors); EqlBuildResult result = new EqlBuildResult(); try { if (errors.Count == 0) { result.Tree = BuildAbstractTree(parseTree); } if (errors.Count == 0) { Entity fromEntity = null; result.Sql = BuildSql(result.Tree, errors, result.Meta, out fromEntity); result.FromEntity = fromEntity; } result.Errors.AddRange(errors); result.Parameters.AddRange(Parameters); result.ExpectedParameters.AddRange(ExpectedParameters); } catch (EqlException) { throw; } catch (Exception ex) { result.Errors.Add(new EqlError { Message = ex.Message }); } return(result); }