Source code for sexpr.grammar

from .matcher import Matcher
from .sexpr import Sexpr

_str_format = '''
(grammar
    path:
        {}
    root:
        {}
    rules:
        {}
)'''


[docs]class Grammar(Matcher): def __init__(self, source, options = None): rules = source.get('rules', {}) self.options = options or {} self.path = self.options.get('path', None) self.rules = self.compile_rules(rules) try: self.root = self.options.get('root', None) self.root = self.root or list(rules.items())[0][0] except IndexError: raise ValueError('Cannot load root node. Grammar is ill-formed.')
[docs] def sexpr(self, sexpr): if isinstance(sexpr, Sexpr): return sexpr return Sexpr(sexpr, self) if self.matches(sexpr) else None
def __repr__(self): print_rule = lambda r: '{} = {}'.format(r.name, r.body) return _str_format.format( self.path or '-', self.root, '\n '.join(print_rule(r) for r in self.rules.values()) )