/// <summary> /// Ctr. /// </summary> public QueryParser(DataContainerDescriptor containerDescriptor, int maxConcurrency) { if (containerDescriptor == null) { throw new ArgumentNullException("containerDescriptor"); } m_parsers = new ObjectPool <Irony.Parsing.Parser>(maxConcurrency, null); for (var i = 0; i < maxConcurrency; i++) { m_parsers.Return(new Irony.Parsing.Parser(LangData, PqlNonTerminal)); } m_containerDescriptor = containerDescriptor; m_preprocessor = new QueryPreprocessor(containerDescriptor); // these predefined instances of ParseTreeNode are substituted when parsing "select * from .." statement, // in order to avoid allocating them every time m_simpleFieldAccessorNodes = new Dictionary <int, ParseTreeNode>(); foreach (var field in m_containerDescriptor.EnumerateFields()) { // generate columnItem -> columnSource -> Id -> id_simple hierarchy, exactly same structure as it comes out of grammar-based parser var idNode = new ParseTreeNode(new NonTerminal("Id"), new SourceSpan()); idNode.ChildNodes.Add(new ParseTreeNode(new Token(new Terminal("id_simple"), new SourceLocation(), field.Name, field.Name))); var columnSourceNode = new ParseTreeNode(new NonTerminal("columnSource"), new SourceSpan()); columnSourceNode.ChildNodes.Add(idNode); var columnItemNode = new ParseTreeNode(new NonTerminal("columnItem"), new SourceSpan()); columnItemNode.ChildNodes.Add(columnSourceNode); m_simpleFieldAccessorNodes.Add(field.FieldId, columnItemNode); } }
public static INode Compile(string input) { input = QueryPreprocessor.Process(input); if (input.Contains(' ')) { var parts = Cut(input); // Infix, left hand side, right hand side return(Compile(parts[1]).SetChildren(Compile(parts[0]), Compile(parts[2]))); } switch (input.ToLower()) { case ">": case "greaterthan": return(new GreaterThan()); case "<": case "lessthan": return(new LessThan()); case "==": case "equals": return(new Equals()); case "&&": case "and": return(new And()); case "or": case "||": return(new Or()); } return(new DynamicOperand(input)); }
/// <summary> /// Ctr. /// </summary> public QueryParser(DataContainerDescriptor containerDescriptor, int maxConcurrency) { if (containerDescriptor == null) { throw new ArgumentNullException("containerDescriptor"); } m_parsers = new ObjectPool<Irony.Parsing.Parser>(maxConcurrency, null); for (var i = 0; i < maxConcurrency; i++) { m_parsers.Return(new Irony.Parsing.Parser(LangData, PqlNonTerminal)); } m_containerDescriptor = containerDescriptor; m_preprocessor = new QueryPreprocessor(containerDescriptor); // these predefined instances of ParseTreeNode are substituted when parsing "select * from .." statement, // in order to avoid allocating them every time m_simpleFieldAccessorNodes = new Dictionary<int, ParseTreeNode>(); foreach (var field in m_containerDescriptor.EnumerateFields()) { // generate columnItem -> columnSource -> Id -> id_simple hierarchy, exactly same structure as it comes out of grammar-based parser var idNode = new ParseTreeNode(new NonTerminal("Id"), new SourceSpan()); idNode.ChildNodes.Add(new ParseTreeNode(new Token(new Terminal("id_simple"), new SourceLocation(), field.Name, field.Name))); var columnSourceNode = new ParseTreeNode(new NonTerminal("columnSource"), new SourceSpan()); columnSourceNode.ChildNodes.Add(idNode); var columnItemNode = new ParseTreeNode(new NonTerminal("columnItem"), new SourceSpan()); columnItemNode.ChildNodes.Add(columnSourceNode); m_simpleFieldAccessorNodes.Add(field.FieldId, columnItemNode); } }