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)