54 lines
1.1 KiB
Python
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)
|