Source code for fosf.parsers.taxonomy
#!/usr/bin/env python3
from collections import defaultdict
from lark import Lark
from fosf.parsers.base import BaseOSFParser
from fosf.parsers.graph import _GraphTransformer
from fosf.syntax.base import Sort
from fosf.syntax.taxonomy import SortTaxonomy, FuzzySortTaxonomy
TAXONOMY_GRAMMAR = "grammars/taxonomy.lark"
class _TaxonomyTransformer(_GraphTransformer):
def __init__(self):
super().__init__()
self._instances = defaultdict(dict)
def baseinstance(self, tree):
return tree[0].value, 1.0
def fuzzyinstance(self, tree):
degree = float(tree[0].value)
instance = tree[1].value
return instance, degree
def instance(self, tree):
return tree[0]
def instances(self, tree):
return tree
def instance_dec(self, tree):
instances = tree[0]
sorts = tree[1]
for instance, degree in instances:
for sort in sorts:
self._instances[instance][Sort(sort)] = degree
def declarations(self, _) -> SortTaxonomy:
if self.fuzzy:
return FuzzySortTaxonomy(self.decs, instances=self._instances)
return SortTaxonomy(self.decs, instances=self._instances)
def transform(self, parse_tree):
self.decs = []
self.fuzzy = False
return super().transform(parse_tree)
[docs]
class TaxonomyParser(BaseOSFParser):
def __init__(self):
self.parser = Lark.open_from_package("fosf.parsers",
TAXONOMY_GRAMMAR, parser="lalr")
self.transformer = _TaxonomyTransformer()
[docs]
def parse(self, expression: str) -> SortTaxonomy:
parse_tree = self.parser.parse(expression)
return self.transformer.transform(parse_tree)