from collections import defaultdict data = open('./grammar.txt').read().split() productions = defaultdict(lambda: []) def recurse(prod): prods = [] if prod not in productions.keys(): prods.append(prod) else: for p in productions[prod]: if len(p): prods += recurse(p[0]) return prods while len(data): name = data.pop(0) data.pop(0) # -> symbols = [] while True: symbol = data.pop(0) if symbol == '.': productions[name].append(symbols) break if symbol == '|': productions[name].append(symbols) symbols = [] continue symbols.append(symbol) for prod, defs in productions.items(): func = f"""private void {prod}() {{ Token token = lexAn.peekToken(); switch(token.symbol()) {{ """ for d in defs: for r in recurse(d[0]): func += f" case {r}:\n" func += f' System.out.println("{prod} -> {defs}");' for d2 in d: if d2.isupper(): func += f"check({d2});" func += """ } }""" print(func)