通过打印有用信息来调试解析器

时间:2013-07-23 19:59:34

标签: parsing lexical-analysis ocamllex ocamlyacc menhir

我想解析一组表达式,例如:X[3]X[-3]XY[-2]X[4]Y[2]等。

在我的parser.mly中,index(位于[]内)定义如下:

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

令牌INTEGERMINUS等在词法分析器中正常定义。

我尝试解析一个例子,但它失败了。但是,如果我发表评论| MINUS INTEGER { 0 - $2 },它就会运作良好。所以问题肯定与此有关。为了调试,我希望获得更多信息,换句话说,我想知道什么被认为是MINUS INTEGER。我试着添加print:

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

但解析时没有打印出来。

有人能告诉我如何打印信息或调试信息吗?

1 个答案:

答案 0 :(得分:0)

我试着想出你所描述的一个例子,并且能够通过我在下面显示的内容获得8的输出。 [这个例子完全被删除,所以它只适用于[1]和[ - 1],但我相信它与你所说的相符。{/ p>

但是,我也注意到你的示例中的示例调试字符串没有显式刷新%!最后,调试输出可能不会被刷新到终端,直到超出预期。

以下是我使用的内容:

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)