Exemplo n.º 1
0
class Framework():
    def __init__(self):
        self.istream = InputStream("123456\n")
        self.lexer = langLexer(self.istream)
        self.tstream = CommonTokenStream(self.lexer)
        self.parser = langParser(self.tstream)
        self.parser.setTrace(True)
        self.vis = evalVisitor(self.parser)
        tree = self.parser.statement()
        self.vis.visitStatement(tree)

    def interpret(self, inputString):
        self.istream.strdata = inputString
        self.istream._loadString()
        print("Input:")
        print(self.istream)
        self.lexer.tokens = []
        self.lexer.indents = []
        self.lexer.opened = 0
        self.lexer.lastToken = None
        self.lexer.reset()

        for t in self.lexer.getAllTokens():
            print(t)

        self.tstream.reset()
        self.parser.reset()
        self.parser._input = self.tstream

        tree = self.parser.statement()
        print("Tree Print:")
        print(vars(tree))
        print(tree.toStringTree())
        return self.vis.visitStatement(tree)
Exemplo n.º 2
0
class Loader:
    def __init__(self, inputstream=None):
        self.input = inputstream
        self.lexer = Lexer(self.input)
        self.filter = IndentTokenFilter(self.lexer)
        self.cts = CommonTokenStream(self.filter)
        self.parser = Parser(self.cts)

    def set_input(self, inputstream):
        self.input = inputstream
        self.lexer.inputStream = self.input
        self.reset()

    def reset(self):
        self.lexer.reset()
        self.filter.reset()
        self.cts.reset()
        self.parser.reset()

    def load(self):
        tree = self.parser.r()
        return self.tree2dict(tree)

    def load_file(self, filename):
        try:
            self.set_input(FileStream(filename))
        except UnicodeDecodeError:
            self.set_input(FileStream(filename, encoding="Latin-1"))
        return self.load()

    @staticmethod
    def tree2dict(tree):
        def obj2dict(obj_node):
            obj_dict = OrderedDict()
            for p in obj_node.pair():
                key = p.ID().symbol.text
                value = get_value(p.value())
                obj_dict[key] = value
            return obj_dict
        def get_value(val):
            if val.obj():
                return obj2dict(val.obj())
            elif val.VALUE():
                return val.VALUE().symbol.text
            elif val.listItem():
                return [get_value(item.value()) for item in val.listItem()]
        return obj2dict(tree.obj())
    def run(self):
        due_date = datetime.now(
        ) + self.time_limit if self.time_limit else None
        input = InputStream(self.code)
        lexer = self.Lexer(input)
        tokens = CommonTokenStream(lexer)

        self.parser = self.Parser(tokens)
        self.parser.due_date = due_date
        self.parser._interp.predictionMode = PredictionMode.SLL

        try:
            try:
                tree = self.start_rule(self.parser)
            except:
                tokens.reset()  # rewind
                self.parser.reset()
                self.parser._interp.predictionMode = PredictionMode.LL
                tree = self.start_rule(self.parser)
        except CancellationException:
            return

        self.visitor = self.Visitor()
        self.visitor.visit(tree)
Exemplo n.º 4
0
class Loader:
    def __init__(self, inputstream=None):
        self.input = inputstream
        self.lexer = Lexer(self.input)
        self.cts = CommonTokenStream(self.lexer)
        self.parser = Parser(self.cts)

    def set_input(self, inputstream):
        self.input = inputstream
        self.lexer.inputStream = self.input
        self.reset()

    def reset(self):
        self.lexer.reset()
        self.cts.reset()
        self.parser.reset()

    def load(self):
        tree = self.parser.r()
        return self.tree2dict(tree)

    def load_file(self, filename):
        try:
            self.set_input(FileStream(filename))
        except UnicodeDecodeError:
            self.set_input(FileStream(filename, encoding="Latin-1"))
        return self.load()

    @staticmethod
    def tree2dict(tree):
        data = {}
        metadata = OrderedDict()
        for metadatum in tree.pair():
            key = metadatum.ID().symbol.text
            value = metadatum.VALUE().symbol.text
            if key not in metadata:
                # first occurence; just assign directly
                metadata[key] = value;
            else:
                # we've already have value(s) with this key, 
                # so append to list of existing values
                if type(metadata[key]) is not list:
                    # this is the second value, so we need to
                    # convert existing lone value to list of itself
                    metadata[key] = [metadata[key]]
                # append new value to list
                metadata[key].append(value)
        data['metadata'] = metadata
        data['rows'] = [[f.symbol.text for f in row.FIELD()] for row in tree.row()]
        return data

    @staticmethod
    def flattened_dict(d, record_name='rows'):
        result = OrderedDict(d['metadata'])
        result[record_name] = d['rows']
        return result

    @staticmethod
    def with_field_names(d, field_names, record_name='rows'):
        result = d.copy()
        result[record_name] = []
        for r in d[record_name]:
            result[record_name].append( OrderedDict(zip(field_names, r)) )
        return result