Отладка парсера путем вывода полезной информации

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

В моем 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 }

Но при синтаксическом анализе ничего не печатается.

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

1 ответ

Решение

Я попытался придумать пример того, что вы описываете, и смог получить результат 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)
Другие вопросы по тегам