2010-09-29 6 views
0

Si les deux chaînes d'entrée suivantes sont inputed:par des règles de grammaire de l'analyseur de descente récursive comment peut-on valider la chaîne source

1)<id> + <id> * <id> 
2) <id> * <id> <id> 

E ::= T{+T}* 
T ::= V{*V}* 
V ::= <id> 

Ensuite, en appliquant les règles de grammaire ci-dessus de l'analyseur de descente récursive comment valider ci-dessus chaîne source. Quel type d'erreur sera indiqué par l'analyseur de descente récursif?

... Merci

+0

Ce genre de question est-il typique des programmes CS? Je m'ennuyais aux larmes à mi-chemin en le lisant ... – ChaosPandion

+0

@Chaos Oui. Ça me donne envie de me tirer plusieurs fois. – NullUserException

Répondre

1

Vos règles de grammaire ressemblent notation infixe arithmétique. Pyparsing (un module complémentaire d'analyse syntaxique Python) a une méthode intégrée pour créer des expressions d'analyseur pour ce type de notation, appelée operatorPrecedence. Voici comment un analyseur de pyparsing serait analyser vos deux exemples:

from pyparsing import operatorPrecedence, opAssoc, ParseException 

expr = operatorPrecedence("<id>", 
    [ 
    ('*', 2, opAssoc.LEFT), 
    ('+', 2, opAssoc.LEFT), 
    ]) 

tests = """\ 
<id> + <id> * <id> 
<id> * <id> <id>""".splitlines() 

for t in tests: 
    print t 
    try: 
     print expr.parseString(t, parseAll=True).asList() 
    except ParseException,pe: 
     print "parsing failed" 
    print 

Prints:

<id> + <id> * <id> 
[['<id>', '+', ['<id>', '*', '<id>']]] 

<id> * <id> <id> 
parsing failed 

espoir que cela vous aide dans vos études.

+0

Merci Paul, pour votre réponse ... – user460920

+0

Paul pouvez-vous m'aider à réaliser cet exemple étape par étape selon le livre DM Dhamdhere Systems Programming .. Au lieu de l'algorithme en Pascal ou Java je veux voir comment fonctionne CSF est prédite et SSM est incrémenté puisaprès ... – user460920

Questions connexes