Esempio n. 1
0
def quoted(char=anychar, quot=charclass('\'"'), esc=lit('\\')):
    charseq = seq(but(state.check), char)
    if esc:
        escseq = seq(skip(esc), alter(quot, esc))
        charseq = alter(escseq, charseq)
    return wrap_parser('quoted')(
                surround(pipe(star(charseq), join), state.push(quot), state.pop)
                )
Esempio n. 2
0
class Indentation(object):

    class Indent:
        pass
    class Dedent:
        pass

    stack = [0]
    spaces = staticmethod(plus(charclass(' \t')))

    def __init__(self, indent=None):
        self.__name__ = 'indent' if indent else 'dedent'
        self.indent = indent

    def __call__(self, inp):
        result = None
        token, rest = self.spaces(inp)
        if token is None:
            token = []

        token = ''.join(token).expandtabs()
        level = len(token)
        try:
            slevel = self.stack[-1]
        except IndexError:
            self.__class__.stack.append(0)
            slevel = 0

        if level == slevel:
            indent = None
            result = []
        elif level > slevel:
            indent = True
            result = [self.Indent]
        elif level < slevel:
            indent = False
            result = [self.Dedent]

        if self.indent is not indent:
            result = None
            rest = inp
        elif indent is not None:
            if indent:
                self.__class__.stack.append(level)
            else:
                self.__class__.stack.pop()

        return result, rest
Esempio n. 3
0
def commalist(parser, comma=lit(','), wsp=charclass('\t ')):
    delim = seq(star(wsp), comma, star(wsp))
    return wrap_parser('commalist')(
            seq(parser, star(seq(skip(delim), parser))))