def expr(klass): e = pp.Literal("@").suppress() + v_integer u = reduce(operator.or_, [pp.Literal(i) for i in utils.SIZE_UNITS.keys()]) e = e + pp.Optional(u, default=None) s = pp.Literal(",").suppress() s += reduce(operator.or_, [pp.Literal(i) for i in DATATYPES.keys()]) e += pp.Optional(s, default="bytes") return e.setParseAction(lambda x: klass(*x))
def _make(): # Order is important - multi-char expressions need to come before narrow # ones. parts = [] for klass in filt_unary: f = pp.Literal("~%s"%klass.code) f.setParseAction(klass.make) parts.append(f) simplerex = "".join(c for c in pp.printables if c not in "()~'\"") rex = pp.Word(simplerex) |\ pp.QuotedString("\"", escChar='\\') |\ pp.QuotedString("'", escChar='\\') for klass in filt_rex: f = pp.Literal("~%s"%klass.code) + rex.copy() f.setParseAction(klass.make) parts.append(f) for klass in filt_int: f = pp.Literal("~%s"%klass.code) + pp.Word(pp.nums) f.setParseAction(klass.make) parts.append(f) # A naked rex is a URL rex: f = rex.copy() f.setParseAction(FUrl.make) parts.append(f) atom = pp.MatchFirst(parts) expr = pp.operatorPrecedence( atom, [ (pp.Literal("!").suppress(), 1, pp.opAssoc.RIGHT, lambda x: FNot(*x)), (pp.Literal("&").suppress(), 2, pp.opAssoc.LEFT, lambda x: FAnd(*x)), (pp.Literal("|").suppress(), 2, pp.opAssoc.LEFT, lambda x: FOr(*x)), ] ) expr = pp.OneOrMore(expr) return expr.setParseAction(lambda x: FAnd(x) if len(x) != 1 else x)
def expr(klass): e = pp.Literal("i").suppress() e += Offset e += pp.Literal(",").suppress() e += Value return e.setParseAction(lambda x: klass(*x))
def expr(klass): e = pp.Literal("d").suppress() e += Offset return e.setParseAction(lambda x: klass(*x))
def expr(klass): e = pp.Literal("p").suppress() e += Offset e += pp.Literal(",").suppress() e += pp.MatchFirst([v_integer, pp.Literal("f")]) return e.setParseAction(lambda x: klass(*x))
def expr(klass): e = pp.Literal("m").suppress() e = e + Value return e.setParseAction(lambda x: klass(*x))
def expr(klass): e = pp.Literal("u").suppress() u = reduce(operator.or_, [pp.Literal(i[1]) for i in http_uastrings.UASTRINGS]) e += u | Value return e.setParseAction(lambda x: klass(*x))
def expr(klass): e = pp.Literal("<").suppress() e = e + v_naked_literal return e.setParseAction(lambda x: klass(*x))
return "<'%s'" % self.path.encode("string_escape") Value = pp.MatchFirst( [ValueGenerate.expr(), ValueFile.expr(), ValueLiteral.expr()]) NakedValue = pp.MatchFirst([ ValueGenerate.expr(), ValueFile.expr(), ValueLiteral.expr(), ValueNakedLiteral.expr(), ]) Offset = pp.MatchFirst([v_integer, pp.Literal("r"), pp.Literal("a")]) class Raw(_Token): @classmethod def expr(klass): e = pp.Literal("r").suppress() return e.setParseAction(lambda x: klass(*x)) def spec(self): return "r" def freeze(self, settings): return self