Mercurial > repos > shellac > guppy_basecaller
diff env/lib/python3.7/site-packages/rdflib/plugins/sparql/parserutils.py @ 5:9b1c78e6ba9c draft default tip
"planemo upload commit 6c0a8142489327ece472c84e558c47da711a9142"
| author | shellac |
|---|---|
| date | Mon, 01 Jun 2020 08:59:25 -0400 |
| parents | 79f47841a781 |
| children |
line wrap: on
line diff
--- a/env/lib/python3.7/site-packages/rdflib/plugins/sparql/parserutils.py Thu May 14 16:47:39 2020 -0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,283 +0,0 @@ - -from types import MethodType - -from rdflib.plugins.sparql.compat import OrderedDict - -from pyparsing import TokenConverter, ParseResults - -from rdflib import BNode, Variable, URIRef - -DEBUG = True -DEBUG = False -if DEBUG: - import traceback - -""" - -NOTE: PyParsing setResultName/__call__ provides a very similar solution to this -I didn't realise at the time of writing and I will remove a -lot of this code at some point - -Utility classes for creating an abstract-syntax tree out with pyparsing actions - -Lets you label and group parts of parser production rules - -For example: - -# [5] BaseDecl ::= 'BASE' IRIREF -BaseDecl = Comp('Base', Keyword('BASE') + Param('iri',IRIREF)) - -After parsing, this gives you back an CompValue object, -which is a dict/object with the paramters specified. -So you can access the parameters are attributes or as keys: - -baseDecl.iri - -Comp lets you set an evalFn that is bound to the eval method of -the resulting CompValue - - -""" - - -# This is an alternative - -# Comp('Sum')( Param('x')(Number) + '+' + Param('y')(Number) ) - -def value(ctx, val, variables=False, errors=False): - - """ - utility function for evaluating something... - - Variables will be looked up in the context - Normally, non-bound vars is an error, - set variables=True to return unbound vars - - Normally, an error raises the error, - set errors=True to return error - - """ - - if isinstance(val, Expr): - return val.eval(ctx) # recurse? - elif isinstance(val, CompValue): - raise Exception("What do I do with this CompValue? %s" % val) - - elif isinstance(val, list): - return [value(ctx, x, variables, errors) for x in val] - - elif isinstance(val, (BNode, Variable)): - r = ctx.get(val) - if isinstance(r, SPARQLError) and not errors: - raise r - if r is not None: - return r - - # not bound - if variables: - return val - else: - raise NotBoundError - - elif isinstance(val, ParseResults) and len(val) == 1: - return value(ctx, val[0], variables, errors) - else: - return val - - -class ParamValue(object): - """ - The result of parsing a Param - This just keeps the name/value - All cleverness is in the CompValue - """ - def __init__(self, name, tokenList, isList): - self.isList = isList - self.name = name - if isinstance(tokenList, (list, ParseResults)) and len(tokenList) == 1: - tokenList = tokenList[0] - - self.tokenList = tokenList - - def __str__(self): - return "Param(%s, %s)" % (self.name, self.tokenList) - - -class Param(TokenConverter): - """ - A pyparsing token for labelling a part of the parse-tree - if isList is true repeat occurrences of ParamList have - their values merged in a list - """ - def __init__(self, name, expr, isList=False): - self.name = name - self.isList = isList - TokenConverter.__init__(self, expr) - self.addParseAction(self.postParse2) - - def postParse2(self, tokenList): - return ParamValue(self.name, tokenList, self.isList) - - -class ParamList(Param): - """ - A shortcut for a Param with isList=True - """ - def __init__(self, name, expr): - Param.__init__(self, name, expr, True) - - -class plist(list): - """this is just a list, but we want our own type to check for""" - - pass - - -class CompValue(OrderedDict): - - """ - The result of parsing a Comp - Any included Params are avaiable as Dict keys - or as attributes - - """ - - def __init__(self, name, **values): - OrderedDict.__init__(self) - self.name = name - self.update(values) - - def clone(self): - return CompValue(self.name, **self) - - def __str__(self): - return self.name + "_" + OrderedDict.__str__(self) - - def __repr__(self): - return self.name + "_" + dict.__repr__(self) - - def _value(self, val, variables=False, errors=False): - if self.ctx is not None: - return value(self.ctx, val, variables) - else: - return val - - def __getitem__(self, a): - return self._value(OrderedDict.__getitem__(self, a)) - - def get(self, a, variables=False, errors=False): - return self._value(OrderedDict.get(self, a, a), variables, errors) - - def __getattr__(self, a): - # Hack hack: OrderedDict relies on this - if a in ('_OrderedDict__root', '_OrderedDict__end'): - raise AttributeError - try: - return self[a] - except KeyError: - # raise AttributeError('no such attribute '+a) - return None - - -class Expr(CompValue): - """ - A CompValue that is evaluatable - """ - - def __init__(self, name, evalfn=None, **values): - super(Expr, self).__init__(name, **values) - - self._evalfn = None - if evalfn: - self._evalfn = MethodType(evalfn, self) - - def eval(self, ctx={}): - try: - self.ctx = ctx - return self._evalfn(ctx) - except SPARQLError as e: - return e - finally: - self.ctx = None - - -class Comp(TokenConverter): - - """ - A pyparsing token for grouping together things with a label - Any sub-tokens that are not Params will be ignored. - - Returns CompValue / Expr objects - depending on whether evalFn is set. - """ - - def __init__(self, name, expr): - TokenConverter.__init__(self, expr) - self.name = name - self.evalfn = None - - def postParse(self, instring, loc, tokenList): - - if self.evalfn: - res = Expr(self.name) - res._evalfn = MethodType(self.evalfn, res) - else: - res = CompValue(self.name) - - for t in tokenList: - if isinstance(t, ParamValue): - if t.isList: - if not t.name in res: - res[t.name] = plist() - res[t.name].append(t.tokenList) - else: - res[t.name] = t.tokenList - # res.append(t.tokenList) - # if isinstance(t,CompValue): - # res.update(t) - return res - - def setEvalFn(self, evalfn): - self.evalfn = evalfn - return self - - -def prettify_parsetree(t, indent='', depth=0): - out = [] - if isinstance(t, ParseResults): - for e in t.asList(): - out.append(prettify_parsetree(e, indent, depth + 1)) - for k, v in sorted(t.items()): - out.append("%s%s- %s:\n" % (indent, ' ' * depth, k)) - out.append(prettify_parsetree(v, indent, depth + 1)) - elif isinstance(t, CompValue): - out.append("%s%s> %s:\n" % (indent, ' ' * depth, t.name)) - for k, v in list(t.items()): - out.append("%s%s- %s:\n" % (indent, ' ' * (depth + 1), k)) - out.append(prettify_parsetree(v, indent, depth + 2)) - elif isinstance(t, dict): - for k, v in list(t.items()): - out.append("%s%s- %s:\n" % (indent, ' ' * (depth + 1), k)) - out.append(prettify_parsetree(v, indent, depth + 2)) - elif isinstance(t, list): - for e in t: - out.append(prettify_parsetree(e, indent, depth + 1)) - else: - out.append("%s%s- %r\n" % (indent, ' ' * depth, t)) - return "".join(out) - - -if __name__ == '__main__': - from pyparsing import Word, nums - import sys - - Number = Word(nums) - Number.setParseAction(lambda x: int(x[0])) - Plus = Comp('plus', Param('a', Number) + '+' + Param('b', Number)) - Plus.setEvalFn(lambda self, ctx: self.a + self.b) - - r = Plus.parseString(sys.argv[1]) - print(r) - print(r[0].eval({})) - -# hurrah for circular imports -from rdflib.plugins.sparql.sparql import SPARQLError, NotBoundError
