Source code for sexpr.types.terminal
from types import *
from ..matcher import Matcher
[docs]class Terminal(Matcher):
def __init__(self, value):
self.value = value
[docs] def pop(self, sexp):
if sexp and isinstance(sexp, list):
return sexp[1:] if self.matches(sexp[0]) else None
def __repr__(self):
return '(terminal %s)' % self.value
[docs]class ValueTerminal(Terminal):
[docs] def matches(self, sexp):
return self.value == sexp
[docs]class RegexpTerminal(Terminal):
[docs] def matches(self, sexp):
if isinstance(sexp, (str, bytes)):
return self.value.matches(sexp)
return False
[docs]class TypeTerminal(Terminal):
def __init__(self, value, strict):
self.value = value
self.strict = strict
self.type_cls = eval(self.value)
[docs] def matches(self, sexp):
if self.strict:
return type(sexp) is self.type_cls
return isinstance(sexp, self.type_cls)