def _make_simple_parser(): ParserElement.setDefaultWhitespaceChars(" \n\t\r'") wordchars = printables for specialchar in ':+-"': wordchars = wordchars.replace(specialchar, "") wordtoken = Combine(Word(wordchars) + ZeroOrMore("." + Word(wordchars))) # A word-like thing generalWord = Group(wordtoken).setResultsName("Word") # A quoted phrase quotedPhrase = Group(Suppress('"') + CharsNotIn('"') + Suppress('"')).setResultsName("Quotes") # Units of content fieldableUnit = quotedPhrase | generalWord fieldedUnit = Group(Word(alphanums) + Suppress(':') + fieldableUnit).setResultsName("Field") unit = fieldedUnit | fieldableUnit # A unit may be "not"-ed. operatorNot = Group(Suppress(Literal("-")) + unit).setResultsName("Not") # A unit may be required operatorReqd = Group(Suppress(Literal("+")) + unit).setResultsName("Required") generalUnit = operatorNot | operatorReqd | unit expression = (OneOrMore(generalUnit) | Empty()) toplevel = Group(expression).setResultsName("Toplevel") + StringEnd() return toplevel.parseString
def _make_simple_parser(): ParserElement.setDefaultWhitespaceChars(" \n\t\r'") wordToken = Regex(r"(\w|/)+(\.?(\w|\-|/)+)*", re.UNICODE) # A word-like thing generalWord = Group(wordToken).setResultsName("Word") # A quoted phrase quotedPhrase = Group(Suppress('"') + CharsNotIn('"') + Suppress('"')).setResultsName("Quotes") # Units of content fieldableUnit = quotedPhrase | generalWord fieldedUnit = Group(Word(alphanums) + Suppress(':') + fieldableUnit).setResultsName("Field") unit = fieldedUnit | fieldableUnit # A unit may be "not"-ed. operatorNot = Group(Suppress(Literal("-")) + unit).setResultsName("Not") # A unit may be required operatorReqd = Group(Suppress(Literal("+")) + unit).setResultsName("Required") generalUnit = operatorNot | operatorReqd | unit expression = (OneOrMore(generalUnit) | Empty()) toplevel = Group(expression).setResultsName("Toplevel") + StringEnd() return toplevel.parseString
def _make_default_parser(): ParserElement.setDefaultWhitespaceChars(" \n\t\r'") #wordToken = Word(self.wordChars) wordToken = Regex(r"(\w|/)+(\.?(\w|\-|/)+)*", re.UNICODE) # A plain old word. plainWord = Group(wordToken).setResultsName("Word") # A word ending in a star (e.g. 'render*'), indicating that # the search should do prefix expansion. prefixWord = Group(Combine(wordToken + Suppress('*'))).setResultsName("Prefix") # A wildcard word containing * or ?. wildcard = Group(Regex(r"\w*(?:[\?\*]\w*)+")).setResultsName("Wildcard") # A range of terms range = Group(plainWord + Suppress("..") + plainWord).setResultsName("Range") # A word-like thing generalWord = range | prefixWord | wildcard | plainWord # A quoted phrase quotedPhrase = Group(Suppress('"') + CharsNotIn('"') + Suppress('"')).setResultsName("Quotes") expression = Forward() # Parentheses can enclose (group) any expression parenthetical = Group((Suppress("(") + expression + Suppress(")"))).setResultsName("Group") boostableUnit = quotedPhrase | generalWord boostedUnit = Group(boostableUnit + Suppress("^") + Word("0123456789", ".0123456789")).setResultsName("Boost") # The user can flag that a parenthetical group, quoted phrase, or word # should be searched in a particular field by prepending 'fn:', where fn is # the name of the field. fieldableUnit = parenthetical | boostedUnit | boostableUnit fieldedUnit = Group(Word(alphanums) + Suppress(':') + fieldableUnit).setResultsName("Field") # Units of content unit = fieldedUnit | fieldableUnit # A unit may be "not"-ed. operatorNot = Group(Suppress(Keyword("not", caseless=True)) + unit).setResultsName("Not") generalUnit = operatorNot | unit andToken = Keyword("and", caseless=True) orToken = Keyword("or", caseless=True) operatorAnd = Group(generalUnit + Suppress(andToken) + expression).setResultsName("And") operatorOr = Group(generalUnit + Suppress(orToken) + expression).setResultsName("Or") expression << (OneOrMore(operatorAnd | operatorOr | generalUnit) | Empty()) toplevel = Group(expression).setResultsName("Toplevel") + StringEnd() return toplevel.parseString