-1

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

在我的parser.mly, index(里面[])定义如下:

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

tokenINTEGERMINUS在词法分析器中正常定义。

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

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

但是解析时没有打印任何内容。

谁能告诉我如何打印信息或调试它?

4

1 回答 1

0

我尝试提出一个您所描述的示例,并且能够通过我在下面显示的内容获得 8 的输出。[此示例已完全精简,因此它仅适用于 [1] 和 [- 1],但我相信它在逻辑上与您所说的相同。]

但是,我还注意到您的示例中的示例调试字符串没有与 %! 的显式刷新。最后,这样调试输出可能不会刷新到终端,直到比您预期的晚。

这是我使用的:

测试.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 } 

解析.ml

open Test;;
open Ytest;;
open Lexing;;
let lexbuf = Lexing.from_channel stdin in
ignore (Ytest.item Test.test lexbuf)
于 2013-07-23T21:29:04.773 回答