def mk_punct(s): return {'.': terminator('.'), '?': terminator('?'), '!': terminator('!'), ',': separator(','), ';': separator(';'), '-': sequence(abut, literal('-'), abut), '--': literal('--')}[s]
def mk_punct(s): return { '.': terminator('.'), '?': terminator('?'), '!': terminator('!'), ',': separator(','), ';': separator(';'), '-': sequence(abut, literal('-'), abut), '--': literal('--') }[s]
def parse(grammar): rules = { '-a-': a_an, '-an-': a_an, '-a-an-': a_an, '-adjoining-': abut, '-capitalize-': capitalize } parser = Parser( r""" grammar = _ rules rules = rule rules | rule = name [=] _ exp hug exp = alts mk_choice alts = alt [/] _ alts | alt alt = \[ number \] _ seq mk_weight | seq mk_unit seq = factor seq mk_seq | mk_empty factor = name ![=] mk_ref | punct mk_punct | \( _ exp \) _ | { _ alts } _ mk_shuffle | word { _ alts } _ mk_fixed | word mk_literal punct = ([.,;?!]) _ | (--?)\s _ word = ([A-Za-z0-9']+) _ name = (-[A-Za-z0-9'-]+-) _ number = (\d+) _ int _ = (?:\s|#.*)* """, hug=hug, int=int, mk_choice=lambda *pairs: pairs[0][0] if 1 == len(pairs) else weighted_choice(dict(pairs)), mk_empty=lambda: empty, mk_fixed=lambda tag, *pairs: fixed(tag)(dict(pairs)), mk_literal=literal, mk_punct=mk_punct, mk_ref=lambda name: delay(lambda: rules[name]), mk_seq=lambda p, q: sequence(p, q) if q is not empty else p, mk_shuffle=lambda *pairs: shuffled(dict(pairs)), mk_unit=lambda p: (p, 1), mk_weight=lambda w, p: (p, w), ) rules.update(parser(grammar)) return rules
def parse(grammar): rules = {'-a-': a_an, '-an-': a_an, '-a-an-': a_an, '-adjoining-': abut, '-capitalize-': capitalize} parser = Parser(r""" grammar = _ rules rules = rule rules | rule = name [=] _ exp hug exp = alts mk_choice alts = alt [/] _ alts | alt alt = \[ number \] _ seq mk_weight | seq mk_unit seq = factor seq mk_seq | mk_empty factor = name ![=] mk_ref | punct mk_punct | \( _ exp \) _ | { _ alts } _ mk_shuffle | word { _ alts } _ mk_fixed | word mk_literal punct = ([.,;?!]) _ | (--?)\s _ word = ([A-Za-z0-9']+) _ name = (-[A-Za-z0-9'-]+-) _ number = (\d+) _ int _ = (?:\s|#.*)* """, hug=hug, int=int, mk_choice = lambda *pairs: pairs[0][0] if 1 == len(pairs) else weighted_choice(dict(pairs)), mk_empty = lambda: empty, mk_fixed = lambda tag, *pairs: fixed(tag)(dict(pairs)), mk_literal = literal, mk_punct = mk_punct, mk_ref = lambda name: delay(lambda: rules[name]), mk_seq = lambda p, q: sequence(p, q) if q is not empty else p, mk_shuffle = lambda *pairs: shuffled(dict(pairs)), mk_unit = lambda p: (p, 1), mk_weight = lambda w, p: (p, w), ) rules.update(parser(grammar)) return rules