d
This commit is contained in:
parent
a1bcb8946a
commit
0fea420749
6 changed files with 139 additions and 154 deletions
4
Pipfile.lock
generated
4
Pipfile.lock
generated
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"_meta": {
|
"_meta": {
|
||||||
"hash": {
|
"hash": {
|
||||||
"sha256": "3c94591e63af431c312ac30f7f7e19d0f406f796ce447837cc5edd363ff2764d"
|
"sha256": "1a84fb4e4ea0b66ca791e226c4da40bd974bc5eceec5868bb5752aad478c55e8"
|
||||||
},
|
},
|
||||||
"pipfile-spec": 6,
|
"pipfile-spec": 6,
|
||||||
"requires": {
|
"requires": {
|
||||||
|
@ -259,7 +259,7 @@
|
||||||
"sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6",
|
"sha256:94078db9184491e15bce0a56d9186e0aec95f16ac20b12d00e06d4e36f1058a6",
|
||||||
"sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"
|
"sha256:98a535c62a4fcfcc362528592f69b26f7caec587d32cd55688db580be0287ae0"
|
||||||
],
|
],
|
||||||
"markers": "python_version >= '3.6'",
|
"index": "pypi",
|
||||||
"version": "==4.2.0"
|
"version": "==4.2.0"
|
||||||
},
|
},
|
||||||
"sphinxcontrib-applehelp": {
|
"sphinxcontrib-applehelp": {
|
||||||
|
|
|
@ -34,11 +34,12 @@ class ParseEquation:
|
||||||
|
|
||||||
|
|
||||||
class GenResult:
|
class GenResult:
|
||||||
def __init__(self, pd: str = "", ex: str = ""):
|
def __init__(self, program: List[Decl]):
|
||||||
|
self.program = program
|
||||||
self.literals: Dict[str, str] = dict()
|
self.literals: Dict[str, str] = dict()
|
||||||
self.parse_rules: defaultdict[str, List[ParseEquation]] = defaultdict(list)
|
self.parse_rules: defaultdict[str, List[ParseEquation]] = defaultdict(list)
|
||||||
self.starts: Set[str] = set()
|
self.starts: Set[str] = set()
|
||||||
self.extra = ex
|
self.extra: str = ""
|
||||||
self.nonterminal_map: Dict[str, str] = dict()
|
self.nonterminal_map: Dict[str, str] = dict()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
@ -77,9 +78,7 @@ class GenResult:
|
||||||
return "\n".join(s)
|
return "\n".join(s)
|
||||||
|
|
||||||
|
|
||||||
def gen(program: List[Decl]) -> GenResult:
|
def gen(self) -> None:
|
||||||
res = GenResult()
|
|
||||||
|
|
||||||
def v(name: str) -> str:
|
def v(name: str) -> str:
|
||||||
return f"__ag_{name}"
|
return f"__ag_{name}"
|
||||||
|
|
||||||
|
@ -92,14 +91,14 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
ifaces: Dict[str, Iface] = dict(
|
ifaces: Dict[str, Iface] = dict(
|
||||||
map(
|
map(
|
||||||
lambda c: (c.name, cast(Iface, c)),
|
lambda c: (c.name, cast(Iface, c)),
|
||||||
filter(lambda c: isinstance(c, Iface), program),
|
filter(lambda c: isinstance(c, Iface), self.program),
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
# list of node -> iface mappings
|
# list of node -> iface mappings
|
||||||
what_ifaces: Dict[str, Set[str]] = dict()
|
what_ifaces: Dict[str, Set[str]] = dict()
|
||||||
what_fields: Dict[str, Dict[str, str]] = dict()
|
what_fields: Dict[str, Dict[str, str]] = dict()
|
||||||
for node in filter(lambda c: isinstance(c, Node), program):
|
for node in filter(lambda c: isinstance(c, Node), self.program):
|
||||||
node = cast(Node, node)
|
node = cast(Node, node)
|
||||||
# all_fields = dict()
|
# all_fields = dict()
|
||||||
what_ifaces[node.name] = set(node.ifaces)
|
what_ifaces[node.name] = set(node.ifaces)
|
||||||
|
@ -148,14 +147,14 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
|
|
||||||
node_map: Dict[str, NodeDesc] = dict()
|
node_map: Dict[str, NodeDesc] = dict()
|
||||||
|
|
||||||
for _node in filter(lambda c: isinstance(c, Node), program):
|
for _node in filter(lambda c: isinstance(c, Node), self.program):
|
||||||
nd = NodeDesc(cast(Node, _node))
|
nd = NodeDesc(cast(Node, _node))
|
||||||
node_map[_node.name] = nd
|
node_map[_node.name] = nd
|
||||||
res.nonterminal_map[nd.name] = nd.nonterminal
|
self.nonterminal_map[nd.name] = nd.nonterminal
|
||||||
|
|
||||||
for node_desc in node_map.values():
|
for node_desc in node_map.values():
|
||||||
assert isinstance(node_desc, NodeDesc)
|
assert isinstance(node_desc, NodeDesc)
|
||||||
res.starts.add(node_desc.nonterminal)
|
self.starts.add(node_desc.nonterminal)
|
||||||
|
|
||||||
class_fields = []
|
class_fields = []
|
||||||
for field_name, field_ty in what_fields[node_desc.name].items():
|
for field_name, field_ty in what_fields[node_desc.name].items():
|
||||||
|
@ -169,7 +168,7 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
pass
|
pass
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
res.extra += class_decl
|
self.extra += class_decl
|
||||||
|
|
||||||
print(node_desc.name, node_desc.node.ifaces)
|
print(node_desc.name, node_desc.node.ifaces)
|
||||||
|
|
||||||
|
@ -180,7 +179,7 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
class {v_class_name}({node_desc.nonterminal}): pass
|
class {v_class_name}({node_desc.nonterminal}): pass
|
||||||
"""
|
"""
|
||||||
)
|
)
|
||||||
res.extra += class_decl
|
self.extra += class_decl
|
||||||
|
|
||||||
prod_name = gensym(node_desc.nonterminal + "_")
|
prod_name = gensym(node_desc.nonterminal + "_")
|
||||||
print("PRODUCTION", prod_name, variant.prod)
|
print("PRODUCTION", prod_name, variant.prod)
|
||||||
|
@ -199,12 +198,12 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
)
|
)
|
||||||
elif isinstance(sym.ty, NodeRegex):
|
elif isinstance(sym.ty, NodeRegex):
|
||||||
sym_name = gensym("sym")
|
sym_name = gensym("sym")
|
||||||
res.literals[sym_name] = f"/{sym.ty.pat.pattern}/"
|
self.literals[sym_name] = f"/{sym.ty.pat.pattern}/"
|
||||||
return sym_name
|
return sym_name
|
||||||
elif isinstance(sym, SymLit):
|
elif isinstance(sym, SymLit):
|
||||||
sym_name = gensym("lit")
|
sym_name = gensym("lit")
|
||||||
# hack to make repr have double quotes
|
# hack to make repr have double quotes
|
||||||
res.literals[sym_name] = json.dumps(sym.lit)
|
self.literals[sym_name] = json.dumps(sym.lit)
|
||||||
return sym_name
|
return sym_name
|
||||||
raise Exception(f"unhandled {sym.__class__}")
|
raise Exception(f"unhandled {sym.__class__}")
|
||||||
|
|
||||||
|
@ -212,7 +211,7 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
for sym in variant.prod:
|
for sym in variant.prod:
|
||||||
n = resolve_production(sym)
|
n = resolve_production(sym)
|
||||||
seq.append(n)
|
seq.append(n)
|
||||||
res.parse_rules[node_desc.nonterminal].append(
|
self.parse_rules[node_desc.nonterminal].append(
|
||||||
ParseEquation(prod_name, seq, v_class_name)
|
ParseEquation(prod_name, seq, v_class_name)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -233,4 +232,3 @@ def gen(program: List[Decl]) -> GenResult:
|
||||||
print("RHS", eq.rhs, eq.rhs.id)
|
print("RHS", eq.rhs, eq.rhs.id)
|
||||||
collect_required_thunks(copy.deepcopy(env), eq.rhs)
|
collect_required_thunks(copy.deepcopy(env), eq.rhs)
|
||||||
|
|
||||||
return res
|
|
||||||
|
|
|
@ -4,6 +4,7 @@ from os import path
|
||||||
import json
|
import json
|
||||||
import importlib
|
import importlib
|
||||||
from lark import Lark
|
from lark import Lark
|
||||||
|
import sys
|
||||||
|
|
||||||
from agtest.ast import *
|
from agtest.ast import *
|
||||||
from agtest.gen import *
|
from agtest.gen import *
|
||||||
|
|
0
docs/_static/.gitkeep
vendored
Normal file
0
docs/_static/.gitkeep
vendored
Normal file
|
@ -4,14 +4,6 @@ agtest package
|
||||||
Submodules
|
Submodules
|
||||||
----------
|
----------
|
||||||
|
|
||||||
agtest.ast module
|
|
||||||
-----------------
|
|
||||||
|
|
||||||
.. automodule:: agtest.ast
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
agtest.gen module
|
agtest.gen module
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
@ -20,14 +12,6 @@ agtest.gen module
|
||||||
:undoc-members:
|
:undoc-members:
|
||||||
:show-inheritance:
|
:show-inheritance:
|
||||||
|
|
||||||
agtest.main module
|
|
||||||
------------------
|
|
||||||
|
|
||||||
.. automodule:: agtest.main
|
|
||||||
:members:
|
|
||||||
:undoc-members:
|
|
||||||
:show-inheritance:
|
|
||||||
|
|
||||||
Module contents
|
Module contents
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ Welcome to agtest's documentation!
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
:caption: Contents:
|
:caption: Contents:
|
||||||
|
|
||||||
|
agtest
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
|
|
Loading…
Reference in a new issue