53 lines
1,009 B
Python
53 lines
1,009 B
Python
# This document is generated by agtest.
|
|
# type: ignore
|
|
|
|
__all__ = ["parse"]
|
|
import re
|
|
from typing import Generic, TypeVar, Optional, Callable, Dict, Any
|
|
from lark import Lark, Transformer
|
|
|
|
T = TypeVar("T")
|
|
builtins: Dict[str, Any] = {{"parseInt": lambda s: int(s)}}
|
|
|
|
|
|
class Thunk(Generic[T]):
|
|
"""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(
|
|
"""
|
|
{pd}
|
|
""",
|
|
parser="lalr",
|
|
start={starts},
|
|
debug=True,
|
|
)
|
|
|
|
{ex}
|
|
|
|
|
|
class Trans(Transformer[None]):
|
|
{transdef}
|
|
|
|
|
|
__agNonterminals = {ntmap}
|
|
|
|
|
|
def parse(input: str, start: Optional[str] = None) -> Any:
|
|
if start is not None:
|
|
start = __agNonterminals[start]
|
|
tree = parser.parse(input, start)
|
|
trans = Trans()
|
|
res = trans.transform(tree)
|
|
return res
|