예제 #1
0
파일: rparse.py 프로젝트: emidln/pathod
    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))
예제 #2
0
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)
예제 #3
0
 def expr(klass):
     e = pp.Literal("i").suppress()
     e += Offset
     e += pp.Literal(",").suppress()
     e += Value
     return e.setParseAction(lambda x: klass(*x))
예제 #4
0
 def expr(klass):
     e = pp.Literal("d").suppress()
     e += Offset
     return e.setParseAction(lambda x: klass(*x))
예제 #5
0
 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))
예제 #6
0
 def expr(klass):
     e = pp.Literal("m").suppress()
     e = e + Value
     return e.setParseAction(lambda x: klass(*x))
예제 #7
0
 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))
예제 #8
0
 def expr(klass):
     e = pp.Literal("<").suppress()
     e = e + v_naked_literal
     return e.setParseAction(lambda x: klass(*x))
예제 #9
0
        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