""" Transformer merging ================== This example is intended to show how transformers can be merged in order to keep the individual steps clean and simple. .. note:: The imported rules will have to be aliased according to the file it is in. (See `storage.lark` for an implementation of this idea.) """ from lark import Lark, Tree from json import dumps from lark.visitors import Transformer, merge_transformers, v_args class JsonTreeToJson(Transformer): @v_args(inline=True) def string(self, s): return s[1:-1].replace('\\"', '"') array = list pair = tuple object = dict number = v_args(inline=True)(float) null = lambda self, _: None true = lambda self, _: True false = lambda self, _: False class CsvTreeToPandasDict(Transformer): INT = int FLOAT = float SIGNED_FLOAT = float WORD = str NON_SEPARATOR_STRING = str def row(self, children): return children def start(self, children): data = {} header = children[0].children for heading in header: data[heading] = [] for row in children[1:]: for i, element in enumerate(row): data[header[i]].append(element) return data class Base(Transformer): def start(self, children): return children[0] if __name__ == "__main__": merged = merge_transformers(Base(), csv=CsvTreeToPandasDict(), json=JsonTreeToJson()) parser = Lark.open("storage.lark") csv_tree = parser.parse("""# file lines author data.json 12 Robin data.csv 30 erezsh compiler.py 123123 Megalng """) print("CSV data in pandas form:", merged.transform(csv_tree)) json_tree = parser.parse(dumps({"test": "a", "dict": { "list": [1, 1.2] }})) print("JSON data transformed: ", merged.transform(json_tree))