agtest/gen.py

44 lines
1,020 B
Python
Raw Normal View History

2021-06-09 00:56:30 +00:00
import textwrap
import os
from lark import Lark
from agast import *
from agtypeck import *
2021-06-09 05:10:45 +00:00
p = Lark(open("grammar.lark").read(), start="program", parser="lalr")
2021-06-09 00:56:30 +00:00
if __name__ == "__main__":
with open("arith.ag") as f:
data = f.read()
cst = p.parse(data)
# print("cst", cst)
trans = Parser()
ast = trans.transform(cst)
print("ast", ast)
2021-06-09 06:48:34 +00:00
res = typecheck(ast)
2021-06-09 00:56:30 +00:00
if not os.path.exists("gen"):
os.makedirs("gen")
with open("gen/arith.py", "w") as f:
f.write(textwrap.dedent(f"""
2021-06-09 06:48:34 +00:00
from typing import Generic, TypeVar, Optional, Callable
from lark import Lark, Transformer
2021-06-09 00:56:30 +00:00
T = TypeVar('T')
class Thunk(Generic[T]):
2021-06-09 06:48:34 +00:00
''' A thunk represents a value that may be computed lazily. '''
value: Optional[T]
def __init__(self, func: Callable[[], T]):
self.func = func
self.value = None
def get(self) -> T:
if self.value is None:
self.value = self.func()
return self.value
parser = Lark('''{res.parser_data}''')
class Trans(Transformer[None]):
2021-06-09 00:56:30 +00:00
pass
"""))