Example #1
0
def mk_punct(s):
    return {'.': terminator('.'),
            '?': terminator('?'),
            '!': terminator('!'),
            ',': separator(','),
            ';': separator(';'),
            '-': sequence(abut, literal('-'), abut),
            '--': literal('--')}[s]
Example #2
0
def mk_punct(s):
    return {
        '.': terminator('.'),
        '?': terminator('?'),
        '!': terminator('!'),
        ',': separator(','),
        ';': separator(';'),
        '-': sequence(abut, literal('-'), abut),
        '--': literal('--')
    }[s]
Example #3
0
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
Example #4
0
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