Example #1
0
def demo():
    from nodebox_linguistics_extended.parser.nltk_lite.parse import cfg
    nonterminals = 'S VP NP PP P N Name V Det'
    (S, VP, NP, PP, P, N, Name, V,
     Det) = [cfg.Nonterminal(s) for s in nonterminals.split()]

    grammar = cfg.parse_grammar("""
    S -> NP VP
    PP -> P NP
    PP -> 'up' 'over' NP
    NP -> Det N
    NP -> NP PP
    VP -> V NP
    VP -> VP PP
    Det -> 'a'
    Det -> 'the'
    Det -> 'my'
    NP -> 'I'
    N -> 'dog'
    N -> 'man'
    N -> 'park'
    N -> 'statue'
    V -> 'saw'
    P -> 'in'
    P -> 'with'
    """)

    def cb(grammar):
        print(grammar)

    top = Tk()
    editor = CFGEditor(top, grammar, cb)
    Label(top, text='\nTesting CFG Editor\n').pack()
    Button(top, text='Quit', command=top.destroy).pack()
    top.mainloop()
Example #2
0
def demo2():
    from nodebox_linguistics_extended.parser.nltk_lite.parse import cfg
    nonterminals = 'S VP NP PP P N Name V Det'
    (S, VP, NP, PP, P, N, Name, V,
     Det) = [cfg.Nonterminal(s) for s in nonterminals.split()]
    productions = (
        # Syntactic Productions
        cfg.Production(S, [NP, VP]),
        cfg.Production(NP, [Det, N]),
        cfg.Production(NP, [NP, PP]),
        cfg.Production(VP, [VP, PP]),
        cfg.Production(VP, [V, NP, PP]),
        cfg.Production(VP, [V, NP]),
        cfg.Production(PP, [P, NP]),
        cfg.Production(PP, []),
        cfg.Production(PP, ['up', 'over', NP]),

        # Lexical Productions
        cfg.Production(NP, ['I']),
        cfg.Production(Det, ['the']),
        cfg.Production(Det, ['a']),
        cfg.Production(N, ['man']),
        cfg.Production(V, ['saw']),
        cfg.Production(P, ['in']),
        cfg.Production(P, ['with']),
        cfg.Production(N, ['park']),
        cfg.Production(N, ['dog']),
        cfg.Production(N, ['statue']),
        cfg.Production(Det, ['my']),
    )
    grammar = cfg.Grammar(S, productions)

    text = 'I saw a man in the park'.split()
    d = CFGDemo(grammar, text)
    d.mainloop()
def _child_names(tree):
    names = []
    for child in tree:
        if isinstance(child, Tree):
            names.append(cfg.Nonterminal(child.node))
        else:
            names.append(child)
    return names
Example #4
0
 def _trace_stack(self, stack, remaining_text, marker=' '):
     """
     Print trace output displaying the given stack and text.
     
     @rtype: C{None}
     @param marker: A character that is printed to the left of the
         stack.  This is used with trace level 2 to print 'S'
         before shifted stacks and 'R' before reduced stacks.
     """
     str = '  ' + marker + ' [ '
     for elt in stack:
         if isinstance(elt, Tree):
             str += repr(cfg.Nonterminal(elt.node)) + ' '
         else:
             str += repr(elt) + ' '
     str += '* ' + ' '.join(remaining_text) + ']'
     print(str)
Example #5
0
def grammar(terminals):
    (S, Star, Plus, Qmk, Paren) = [cfg.Nonterminal(s) for s in 'S*+?(']
    rules = [pcfg.Production(S, [Star], prob=0.2),
             pcfg.Production(S, [Plus], prob=0.2),
             pcfg.Production(S, [Qmk], prob=0.2),
             pcfg.Production(S, [Paren], prob=0.2),
             pcfg.Production(S, [S, S], prob=0.1),
             pcfg.Production(Star, [S, '*'], prob=1),
             pcfg.Production(Plus, [S, '+'], prob=1),
             pcfg.Production(Qmk, [S, '?'], prob=1),
             pcfg.Production(Paren, ['(', S, ')'], prob=1)]

    prob_term = 0.1/len(terminals) # divide remaining pr. mass
    for terminal in terminals:
        rules.append(pcfg.Production(S, [terminal], prob=prob_term))

    return pcfg.Grammar(S, rules)
Example #6
0
    def _trace_fringe(self, tree, treeloc=None):
        """
        Print trace output displaying the fringe of C{tree}.  The
        fringe of C{tree} consists of all of its leaves and all of
        its childless subtrees.

        @rtype: C{None}
        """

        if treeloc == (): print("*", end=' ')
        if isinstance(tree, Tree):
            if len(tree) == 0: print(repr(cfg.Nonterminal(tree.node)), end=' ')
            for i in range(len(tree)):
                if treeloc is not None and i == treeloc[0]:
                    self._trace_fringe(tree[i], treeloc[1:])
                else:
                    self._trace_fringe(tree[i])
        else:
            print(repr(tree), end=' ')
    def productions(self):
        """
        Generate the productions that correspond to the non-terminal nodes of the tree.
        For each subtree of the form (P: C1 C2 ... Cn) this produces a production of the
        form P -> C1 C2 ... Cn.

        @rtype: list of C{cfg.Production}s
        """

        if not isinstance(self.node, str):
            raise TypeError, 'Productions can only be generated from trees having node labels that are strings'

        prods = [
            cfg.Production(cfg.Nonterminal(self.node), _child_names(self))
        ]
        for child in self:
            if isinstance(child, Tree):
                prods += child.productions()
        return prods
def demo():
    """
    Create a shift reduce parser demo, using a simple grammar and
    text. 
    """
    
    from nodebox_linguistics_extended.parser.nltk_lite.parse import cfg
    nonterminals = 'S VP NP PP P N Name V Det'
    (S, VP, NP, PP, P, N, Name, V, Det) = [cfg.Nonterminal(s)
                                           for s in nonterminals.split()]
    
    productions = (
        # Syntactic Productions
        cfg.Production(S, [NP, VP]),
        cfg.Production(NP, [Det, N]),
        cfg.Production(NP, [NP, PP]),
        cfg.Production(VP, [VP, PP]),
        cfg.Production(VP, [V, NP, PP]),
        cfg.Production(VP, [V, NP]),
        cfg.Production(PP, [P, NP]),

        # Lexical Productions
        cfg.Production(NP, ['I']),   cfg.Production(Det, ['the']),
        cfg.Production(Det, ['a']),  cfg.Production(N, ['man']),
        cfg.Production(V, ['saw']),  cfg.Production(P, ['in']),
        cfg.Production(P, ['with']), cfg.Production(N, ['park']),
        cfg.Production(N, ['dog']),  cfg.Production(N, ['statue']),
        cfg.Production(Det, ['my']),
        )

    grammar = cfg.Grammar(S, productions)

    # tokenize the sentence
    sent = list(tokenize.whitespace('my dog saw a man in the park with a statue'))

    ShiftReduceDemo(grammar, sent).mainloop()