2013-07-23 5 views
-1

Я хотел бы разобрать набор выражений, например: X[3], X[-3], XY[-2], X[4]Y[2] и т.д.Debug анализатора печатая полезную информацию

В моих parser.mly, index (который находится внутри []) определяются как следующим образом:

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

маркер INTEGER, MINUS т.д. определены в лексере как обычно.

Я пытаюсь разобрать пример, он терпит неудачу. Однако, если я прокомментирую | MINUS INTEGER { 0 - $2 }, он работает хорошо. Поэтому проблема, безусловно, связана с этим. Чтобы отлаживать, я хочу получить дополнительную информацию, другими словами, я хочу знать, что считается MINUS INTEGER. Я попытался добавить печать:

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

Но при разборе ничего не печатается.

Может ли кто-нибудь сказать мне, как распечатать информацию или отладить это?

+0

Включить '--verbose - -debug' в командной строке 'yacc'. –

+0

Извините, я просто понял, что использую 'menhir' ... – SoftTimur

+0

Ваш вопрос не содержит важных деталей. Вы написали INTEGER, а MINUS определены как «нормальные», но мы понятия не имеем, что вы считаете нормальным. Вы написали «это не удается», но вы ничего не писали о том, как это произошло. У вас есть исключения, или программа заканчивается, но со странным результатом? – camlspotter

ответ

0

Я попытался придумать пример того, что вы описали, и смог получить вывод 8 с тем, что я покажу ниже. [Этот пример полностью лишен, так что он работает только для [1] и [- 1], но я считаю, что это эквивалентно логически тому, что вы сказали.]

Однако я также замечаю, что строка отладки вашего примера в вашем примере нет явного флеша с%! в конце, так что вывод отладки не может быть сброшен на терминал дольше, чем вы ожидаете.

Вот что я использовал:

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

Спасибо за ваш комментарий. «строка отладки вашего примера в вашем примере не имеет новой строки в конце» ==> Я не вижу «новую строку в конце» в вашем коде либо ... – SoftTimur

+1

Я считаю, что новая строка не заставляет промывка в Printf.printf. Используйте «%!» для явной промывки. – camlspotter

+0

\ n не требуется для вывода. Я предполагал, что это сделает вывод, когда Printf.printf будет выполнен вместо более позднего. Тем не менее, я проверил, и я ошибся. Как говорит @camlspotter, это%! что приведет к смыванию, а не \ n – sesquized