2013-07-23 4 views
-1

Je voudrais analyser un ensemble d'expressions, par exemple: X[3], X[-3], XY[-2], X[4]Y[2], etc.analyseur de débogage en imprimant des informations utiles

Dans mon parser.mly, index (qui est à l'intérieur []) est défini comme suit:

index: 
| INTEGER { $1 } 
| MINUS INTEGER { 0 - $2 } 

Le INTEGER jeton, etc. MINUS sont définis dans lexer comme normal.

J'essaye d'analyser un exemple, il échoue. Cependant, si je commente | MINUS INTEGER { 0 - $2 }, cela fonctionne bien. Donc, le problème est certainement lié à cela. Pour déboguer, je veux obtenir plus d'informations, en d'autres termes je veux savoir ce qui est considéré comme MINUS INTEGER. J'ai essayé d'ajouter l'impression:

index: 
| INTEGER { $1 } 
| MINUS INTEGER { Printf.printf "%n" $2; 0 - $2 } 

Mais rien n'est imprimé lors de l'analyse.

Quelqu'un pourrait-il me dire comment imprimer des informations ou déboguer cela?

+0

Inclure 'verbose - -debug' dans la ligne de commande de 'yacc'. –

+0

désolé, je viens de réaliser que j'utilise «menhir» ... – SoftTimur

+0

Votre question manque de détails importants. Vous avez écrit INTEGER et MOINS sont définis "comme normal" mais nous n'avons aucune idée de ce que vous pensez normal. Vous avez écrit "ça échoue" mais vous n'avez rien écrit sur l'échec. Vous avez des exceptions, ou le programme se termine mais avec un résultat étrange? – camlspotter

Répondre

0

J'ai essayé de trouver un exemple de ce que vous décrivez et j'ai pu obtenir une sortie de 8 avec ce que je montre ci-dessous. [Cet exemple est complètement supprimé pour qu'il ne fonctionne que pour [1] et [- 1], mais je crois que c'est logiquement équivalent à ce que vous avez dit.]

Cependant, je remarque également que la chaîne de débogage de votre exemple dans votre exemple n'a pas un vidage explicite avec%! à la fin, de sorte que la sortie de débogage ne puisse être vidée vers le terminal que plus tard que prévu.

Voici ce que je:

Test.mll:

{ 
    open Ytest 
    open Lexing 
} 
rule test = 
parse 
"-" { MINUS } 
| "1" { ONE 1 } 
| "[" { LB } 
| "]" { RB } 
| [ ' ' '\t' '\r' '\n' ] { test lexbuf } 
| eof { EOFTOKEN } 

Ytest.mly:

%{ 
%} 
%token <int> ONE 
%token MINUS LB RB EOFTOKEN 
%start item 
%type <int> index item 
%% 
index: 
    ONE { 2 } 
    | MINUS ONE { Printf.printf "%n" 8; $2 } 
item : LB index RB EOFTOKEN { $2 } 

Parse.ml

open Test;; 
open Ytest;; 
open Lexing;; 
let lexbuf = Lexing.from_channel stdin in 
ignore (Ytest.item Test.test lexbuf) 
+0

Merci pour votre commentaire. "La chaîne de débogage de votre exemple dans votre exemple n'a pas de nouvelle ligne à la fin" ==> Je ne vois pas non plus la "nouvelle ligne à la fin" dans votre code ... – SoftTimur

+1

Je crois qu'une nouvelle ligne ne force pas rinçage dans Printf.printf. Utilisation "%!" pour un rinçage explicite. – camlspotter

+0

Le \ n n'est pas requis pour la sortie à produire. Je suggérais que cela ferait apparaître la sortie lorsque Printf.printf serait exécuté au lieu de plus tard. Cependant, j'ai vérifié et j'avais tort. Comme dit @camlspotter, c'est%! cela causerait le rinçage, pas \ n – sesquized

Questions connexes