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)
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)
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