Source code for fosf.parsers.base
#!/usr/bin/env python3
"""
Parser for the basic elements of (fuzzy) OSF logic: sorts, disjunctive sorts, tags, and
features.
"""
from lark import Lark, Transformer
from fosf.syntax import Sort, FrozenDisjunctiveSort
BASE_GRAMMAR = "grammars/base_osf.lark"
class _BaseOSFTransformer(Transformer):
def sort(self, tree):
if isinstance(tree[0], (FrozenDisjunctiveSort)):
return tree[0]
return Sort(tree[0].value)
def disjunctive_sort(self, tree):
return FrozenDisjunctiveSort(*(t.value for t in tree))
[docs]
class BaseOSFParser:
def __init__(self):
self.parser = Lark.open_from_package("fosf.parsers", BASE_GRAMMAR,
parser="lalr", start="sort")
self.transformer = _BaseOSFTransformer()
[docs]
def parse(self, expression: str, **kwargs) -> Sort:
parse_tree = self.parser.parse(expression)
return self.transformer.transform(parse_tree, **kwargs)