view python/parserlib.py @ 307:e609d5296ee9

Massive rewrite of codegenerator
author Windel Bouwman
date Thu, 12 Dec 2013 20:42:56 +0100
parents 62386bcee1ba
children
line wrap: on
line source




class Token:
    pass

# Base functions:
class Pbase:
    def __init__(self):
        self.pa = None
    def parse(self, txt):
        r = self.do(txt)
        if r:
            match, rest = r
            # Apply action:
            if self.ParseAction:
                match = self.ParseAction(match)
            return match, rest
        else:
            # TODO: fail in some way
            pass
    def getParseAction(self):
        return self.pa
    def setParseAction(self, pa):
        self.pa = pa

    ParseAction = property(getParseAction, setParseAction)

# basic elements:

class Literal(Pbase):
    def __init__(self, s):
        super().__init__()
        self.pat = s
    def do(self, txt):
        if txt.startswith(self.pat):
            return self.pat, txt[len(self.pat):]

class Or(Pbase):
    def __init__(self, options):
        super().__init__()
        self.options = options
    def do(self, txt):
        for option in self.options:
            r = option.parse(txt)
            if r:
                return r

class And:
    def __init__(self, options):
        self.options = options

class Sequence(Pbase):
    def __init__(self, seq):
        super().__init__()
        self.seq = seq
    def do(self, txt):
        results = []
        for thung in self.seq:
            r = thung.parse(txt)
            if r:
                res, txt = r
                results.append(res)
            else:
                return
        return results, txt

class Optional(Pbase):
    def __init__(self, thung):
        super().__init__()
        self.thung = thung
    def do(self, txt):
        r = self.thung.do(txt)
        if r:
            return r
        return (0, txt)

# Contraptions of basic blocks:

def OneOrMore():
    def __init__(self, thingy):
        pass