Example #1
0
s = Nonterminal("Satz")
art = Nonterminal("Artikel")
nn = Nonterminal("Nomen")
np = Nonterminal("Nominalphrase")
vtr = Nonterminal("Transitives Verb")
adj = Nonterminal("Adjektiv")

# Definiert eine Grammatik, welche Sätze wie "Das alte Haus ist ein Ort" oder
# "Der Kiesweg ist ein Ort" parsen kann.
s >> np + vtr + np 
np >> art + nn 
vtr >> Terminal('ist')
art >> Terminal("der") | Terminal("die") | Terminal("das") | Terminal("ein") | Terminal("eine")
nn >> Terminal("haus") | Terminal("kiesweg") | Terminal("raum") | Terminal("ort")

p = RecursiveDescentParser(s)

def s_action(np1, verb, np2):
    if np2 == 'raum':
        np2 = 'ort'
    if verb == 'ist':
        return [np2, np1]
    else:
        raise ValueError("Kann keinen miniprolog-Fakt erzeugen")
    
def vtr_action(verb):
    return verb

def np_action(artikel, nomen):
    return nomen
Example #2
0
    # ausdruck beteht aus term, operator und ausdruck
    print "term", args[1], "ausdruck -> ausdruck"
    if args[1] == '+':
        print "  (", args[0], "+", args[2], "->", args[0] + args[2], ")"
        return args[0] + args[2]
    elif args[1] == '-':
        print "  (", args[0], "-", args[2], "->", args[0] + args[2], ")"
        return args[0] - args[2]

def satz_action(ausdruck, fragezeichen):
    print "ausdruck -> s"
    print "  (", ausdruck, "->", ausdruck, ")"
    return ausdruck

p = RecursiveDescentParser(s, lambda t: t[0], lambda t: t[1])

p.setParseAction(s, satz_action)

p.setParseAction(zahl, zahl_action)
p.setParseAction(faktor, faktor_action)
p.setParseAction(term, term_action)
p.setParseAction(ausdruck, ausdruck_action)

# Erstellt einen einfachen Lexer
lex = makeLexer(['+','-','*','/','(',')',('ZAHL', r"[0-9]+"), (None, r"\s+")])


while True:
    src = raw_input("Gib etwas ein: ")
    src = src.lower()
Example #3
0
DER = Terminal("der")
DIE = Terminal("die")
DAS = Terminal("das")
HAUS = Terminal("haus")
KIESWEG = Terminal("kiesweg")
ENTE = Terminal("ente")

# Definiert eine Grammatik, welche Sätze wie "Das alte Haus ist ein Ort" oder
# "Der Kiesweg ist ein Ort" parsen kann.
s >> art(gen='?g') + nn(gen = '?g')
art >> DER(gen='m') | DAS(gen='n') | DIE(gen='f')
nn >> HAUS(gen='n') | KIESWEG(gen='m') | ENTE(gen='f')


p = RecursiveDescentParser(s, lambda t: t["word"], lambda t: t)

while True:
    src = raw_input("Gib etwas ein: ")
    src = src.lower()
    tokens = src.split(" ")
    fttokens = [ {'word': x} for x in tokens ]
    g = p.parse(fttokens)
    try:
        semantic = g.next()
        print "Aha, ich verstehe:"
        print semantic
    except StopIteration:
        print "Das verstehe ich leider nicht."
    
        
Example #4
0
DER = Terminal("der")
DIE = Terminal("die")
DAS = Terminal("das")
HAUS = Terminal("haus")
KIESWEG = Terminal("kiesweg")
ENTE = Terminal("ente")

# Definiert mithilfe von Features eine Grammatik, welche die Satzfragmente
# "Das Haus", "Die Ente" und "Der Kiesweg" erkennen kann, aber nicht
# "Die Haus", "Das Ente" usw.
s >> art(gen='?g') + nn(gen = '?g')
art >> DER(gen='m') | DAS(gen='n') | DIE(gen='f')
nn >> HAUS(gen='n') | KIESWEG(gen='m') | ENTE(gen='f')

# Parser, der die oben definierte Sprache erkennt
p = RecursiveDescentParser(s, lambda t: t["word"], lambda t: t)

while True:
    src = raw_input("Gib etwas ein: ")
    src = src.lower()
    tokens = src.split(" ")
    # verwandelt die Liste von Worten in eine Liste von Dictionaries 
    fttokens = [ {'word': x} for x in tokens ]
    semantic = p.first(fttokens)
    if semantic != None:
        print "Aha, ich verstehe:"
        print semantic
    else:
        print "Das verstehe ich leider nicht."
    
        
Example #5
0
        

def extractName(semantic):
    if semantic[0] == 'name':
        return semantic[1]

    if semantic[0] == 'pron':
        if semantic[1] == 'f':
            return femaleReferent
        elif semantic[1] == 'm':
            return maleReferent
        else:
            return 'ich'


p = RecursiveDescentParser(s)

p.setParseAction(name, name_action)
p.setParseAction(perspron, perspron_action)
p.setParseAction(vtr, vtr_action)
p.setParseAction(adj, adj_action)
p.setParseAction(nn, nn_action)
p.setParseAction(np, np_action)
p.setParseAction(pp, pp_action)
p.setParseAction(s, s_action)


while True:
    src = raw_input("Gib etwas ein: ")
    src = src.lower()
    tokens = src.split(" ")
Example #6
0
s = Nonterminal("Satz")
ausdruck = Nonterminal("Ausdruck")
term = Nonterminal("Term")
faktor = Nonterminal("Faktor")
zahl = Nonterminal("Zahl")

# Definiert eine Grammatik, welche Ausdrücke wie 3 * 4 + 2 oder 3 * (4 + 2)
# beschreibt.

s >> ausdruck + Terminal("?")
ausdruck >> term | ausdruck + Terminal("+") + term | ausdruck + Terminal('-') + term 
term >> faktor | faktor + Terminal("*") + term | faktor + Terminal("/") + term
faktor >> zahl | Terminal('(') + ausdruck + Terminal(')')
zahl >> Terminal('1') | Terminal('2') | Terminal('3') | Terminal('4')

p = RecursiveDescentParser(s)

while True:
    src = raw_input("Gib etwas ein: ")
    src = src.lower()
    tokens = src.split(" ")
    g = p.parse(tokens)
    try:
        semantic = g.next()
        print "Aha, ich verstehe:"
        pprint.pprint(semantic, indent=2)
        print
    except StopIteration:
        print "Das verstehe ich nicht."