Source code for fosf.parsers.similarity
#!/usr/bin/env python3
import networkx as nx
from lark import Lark
from fosf.config import FOSF_GRAMMAR
from fosf.parsers.base import BaseOSFParser, _BaseOSFTransformer
from fosf.syntax.similarity import Similarity
class _SimilarityTransformer(_BaseOSFTransformer):
def __init__(self):
super().__init__()
self.sim = []
def sim_equation(self, tree):
"Handle a similarity equation."
alpha = float(tree[-1].value)
for i, _ in enumerate(tree[:-2]):
sort_u = tree[i]
sort_v = tree[i + 1]
self.sim.append((sort_u, sort_v, alpha))
def sim_equations(self, tree):
g = nx.Graph()
for u, v, w in self.sim:
g.add_edge(u, v, weight=w)
return Similarity(g, alpha=0, strict=True)
def transform(self, tree):
self.sim = []
return super().transform(tree)
[docs]
class SimilarityParser(BaseOSFParser):
def __init__(self):
self.parser = Lark.open_from_package(
"fosf", FOSF_GRAMMAR, start="sim_equations"
)
self.transformer = _SimilarityTransformer()
[docs]
def parse(self, expression: str) -> Similarity:
parse_tree = self.parser.parse(expression)
return self.transformer.transform(parse_tree)