top, data = d nodes, edges = [], [] for node, _edges in data: nodes.append(node) edges.extend(_edges) return Eds(top=top, nodes=nodes, edges=edges) def _make_nodedata(d): nid = d[0] node = Node(nid, pred=d[1], sortinfo=d[4], lnk=d[2], carg=d[3]) edges = [(nid, rarg, tgt) for rarg, tgt in d[5]] return (node, edges) _COLON = regex(r'\s*:\s*', value=Ignore) _COMMA = regex(r',\s*') _SPACES = regex(r'\s+', value=Ignore) _SYMBOL = regex(r'[-+\w]+') _PRED = regex(r'((?!<-?\d|\("|\{|\[)\w)+', value=Pred.string_or_grammar_pred) _EDS = nt('EDS', value=_make_eds) _TOP = opt(nt('TOP'), default=None) _TOPID = opt(_SYMBOL, default=None) _FLAG = opt(regex(r'\s*\(fragmented\)', value=Ignore)) _NODE = nt('NODE', value=_make_nodedata) _DSCN = opt(lit('|', value=Ignore)) _LNK = opt(nt('LNK', value=lambda d: Lnk.charspan(*d)), default=None) _CARG = opt(nt('CARG'), default=None) _PROPS = opt(nt('PROPS', value=lambda d: d[0] + d[1]), default=None) _EDGES = nt('EDGES') _TYPE = opt(_SYMBOL, value=lambda i: [(CVARSORT, i)], default=[])
def _make_eds(d): top, data = d nodes, edges = [], [] for node, _edges in data: nodes.append(node) edges.extend(_edges) return Eds(top=top, nodes=nodes, edges=edges) def _make_nodedata(d): nid = d[0] node = Node(nid, pred=d[1], sortinfo=d[4], lnk=d[2], carg=d[3]) edges = [(nid, rarg, tgt) for rarg, tgt in d[5]] return (node, edges) _COLON = regex(r'\s*:\s*', value=Ignore) _COMMA = regex(r',\s*') _SPACES = regex(r'\s+', value=Ignore) _SYMBOL = regex(r'[-+\w]+') _PRED = regex(r'((?!<-?\d|\("|\{|\[)\w)+', value=Pred.string_or_grammar_pred) _EDS = nt('EDS', value=_make_eds) _TOP = opt(nt('TOP'), default=None) _TOPID = opt(_SYMBOL, default=None) _FLAG = opt(regex(r'\s*\(fragmented\)', value=Ignore)) _NODE = nt('NODE', value=_make_nodedata) _DSCN = opt(lit('|', value=Ignore)) _LNK = opt(nt('LNK', value=lambda d: Lnk.charspan(*d)), default=None) _CARG = opt(nt('CARG'), default=None) _PROPS = opt(nt('PROPS', value=lambda d: d[0] + d[1]), default=None) _EDGES = nt('EDGES')
top, data = d nodes, edges = [], [] for node, _edges in data: nodes.append(node) edges.extend(_edges) return Eds(top=top, nodes=nodes, edges=edges) def _make_nodedata(d): nid = d[0] node = Node(nid, pred=d[1], sortinfo=d[4], lnk=d[2], carg=d[3]) edges = [(nid, rarg, tgt) for rarg, tgt in d[5]] return (node, edges) _COLON = regex(r'\s*:\s*', value=Ignore) _COMMA = regex(r',\s*') _SPACES = regex(r'\s+', value=Ignore) _SYMBOL = regex(r'[-+\w]+') _PRED = regex(r'((?!<-?\d|\("|\{|\[|\s).)+', value=Pred.surface_or_abstract) _EDS = nt('EDS', value=_make_eds) _TOP = opt(nt('TOP'), default=None) _TOPID = opt(_SYMBOL, default=None) _FLAG = opt(regex(r'\s*\(fragmented\)', value=Ignore)) _NODE = nt('NODE', value=_make_nodedata) _DSCN = opt(lit('|', value=Ignore)) _LNK = opt(nt('LNK', value=lambda d: Lnk.charspan(*d)), default=None) _CARG = opt(nt('CARG'), default=None) _PROPS = opt(nt('PROPS', value=lambda d: d[0] + d[1]), default=None) _EDGES = nt('EDGES')
Float, DQString, Peg, ) # escapes from https://en.wikipedia.org/wiki/S-expression#Use_in_Lisp _SExpr_escape_chars = r'"\s\(\)\[\]\{\}\\;' def _SExpr_unescape_symbol(s): return re.sub(r'\\([{}])'.format(_SExpr_escape_chars), r'\1', s) def _SExpr_unescape_string(s): return re.sub(r'\\(["\\])', r'\1', s) _SExpr = nonterminal('SExpr') _Symbol = regex(r'(?:[^{ec}]+|\\.)+'.format(ec=_SExpr_escape_chars), value=_SExpr_unescape_symbol) # dummy choice around DQString just to get character unescaping _String = choice(DQString, value=_SExpr_unescape_string) SExpr = Peg( grammar=dict( start=sequence(Spacing, _SExpr, value=lambda xs: xs[1]), SExpr=choice( # atom sequence(choice(Float, Integer, _String, _Symbol), Spacing, value=lambda xs: xs[0]), # Expression bounded( regex(r'\(\s*'), choice( # DotPair
top, data = d nodes, edges = [], [] for node, _edges in data: nodes.append(node) edges.extend(_edges) return Eds(top=top, nodes=nodes, edges=edges) def _make_nodedata(d): nid = d[0] node = Node(nid, pred=d[1], sortinfo=d[4], lnk=d[2], carg=d[3]) edges = [(nid, rarg, tgt) for rarg, tgt in d[5]] return (node, edges) _COLON = regex(r'\s*:\s*', value=Ignore) _COMMA = regex(r',\s*') _SPACES = regex(r'\s+', value=Ignore) _SYMBOL = regex(r'[-+\w]+') _PRED = regex(r'((?!<-?\d|\("|\{|\[)[^<>])+', value=Pred.string_or_grammar_pred) _EDS = nt('EDS', value=_make_eds) _TOP = opt(nt('TOP'), default=None) _TOPID = opt(_SYMBOL, default=None) _FLAG = opt(regex(r'\s*\((?:cyclic )?fragmented\)', value=Ignore)) _NODE = nt('NODE', value=_make_nodedata) _DSCN = opt(lit('|', value=Ignore)) _LNK = opt(nt('LNK', value=lambda d: Lnk.charspan(*d)), default=None) _CARG = opt(nt('CARG'), default=None) _PROPS = opt(nt('PROPS', value=lambda d: d[0] + d[1]), default=None) _EDGES = nt('EDGES')