pns/generate.py
2025-03-21 15:28:24 +01:00

54 lines
1.1 KiB
Python

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)