Source code for fosf.parsers.base

#!/usr/bin/env python3

from lark import Lark

from fosf.config import FOSF_GRAMMAR
from fosf.parsers.rdf import _RDFTransformer
from fosf.syntax import FrozenDisjunctiveSort, Sort
from fosf.syntax.base import Feature, LiteralSort, URIFeature, URISort


class _BaseOSFTransformer(_RDFTransformer):
    def feature(self, tree):
        # TODO: Fix: feature urirefs are first parsed as sorts
        if isinstance(tree[0], URISort):
            return URIFeature(tree[0].value)
        if self.base is not None:
            return URIFeature(self.base[tree[0].value])
        return Feature(tree[0].value)

    def base_sort(self, tree):
        if isinstance(tree[0], (URISort, LiteralSort)):
            return tree[0]
        if self.base is not None:
            return URISort(self.base[tree[0].value])
        return Sort(tree[0].value)

    def disjunctive_sort(self, tree):
        return FrozenDisjunctiveSort(*tree)


[docs] class BaseOSFParser: def __init__(self): self.parser = Lark.open_from_package("fosf", FOSF_GRAMMAR, 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)