2013-07-07 2 views
1

Quelqu'un peut-il brièvement comment puis-je mettre en œuvre si alors dans Ocamlyacc. J'ai défini des jetons à partir d'un analyseur lexical (ocamllex), à savoir IF, THEN, ELSE. Pour l'instruction if, j'ai défini des jetons: GREATERTHAN, LESSERTHAN, EQUALTO pour les entiers. J'ai cherché de nombreux tutoriels, mais en vain!si alors d'autre dans ocamlyacc

MISE À JOUR:

Je veux interpréter le résultat et retourner la valeur de l'expression dictée par l'instruction if-else.

Répondre

3

Vous devez définir des règles:

ifthenelse :  
| IF condition THEN statement ELSE statement { IfThenElse($1,$2,$3) } 


condition :  
| INT EQUALTO INT { Cond(EqualTo,$1,$3) } 
| INT LESSERTHAN INT { Cond(LesserThan,$1,$3) } 
| INT GREATERTHAN INT { Cond(GeaterThan,$1,$3) } 

Ne pas oublier de définir l'expression régulière pour int, dans votre fil lex

+0

Pourriez-vous également définir les fonctions IfThenElse, Cond pour moi? Merci d'avance! – user2352241

+0

C'est juste un type que vous définissez: Cond de op * int * int etc. – Ontologiae

+0

Puis-je utiliser Ocaml pour évaluer cela - comme un interpréteur? – user2352241

0

Peut-être que vous l'avez vu, mais le manuel OCaml donne une complète ocamllex/ocamlyacc exemple qui calcule les valeurs des expressions: Desk Calculator Example.

L'exemple montre que vous pouvez calculer votre résultat dans les actions ocamlyacc si vous le souhaitez. Pour un exemple simple, ce n'est pas du tout difficile à suivre. Dans un cas plus réaliste, vous voudrez probablement construire une arborescence de syntaxe abstraite pour un traitement ultérieur (comme l'évaluation). Le code a une saveur similaire sauf que les cas sont donnés par les différents constructeurs de votre type AST plutôt que par les différentes règles de grammaire.