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

Parsing 通过打印有用信息来调试解析器,parsing,lexical-analysis,ocamllex,ocamlyacc,menhir,Parsing,Lexical Analysis,Ocamllex,Ocamlyacc,Menhir,我想解析一组表达式,例如:X[3],X[-3],XY[-2],X[4]Y[2],等等 在我的parser.mly中,索引(位于[]内)定义如下: index: | INTEGER { $1 } | MINUS INTEGER { 0 - $2 } 标记整数,减等在lexer中定义为正常 我试图分析一个例子,但失败了。但是,如果我注释|减去整数{0-$2},则效果良好。因此,问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么是减去整数。我尝试添加打印: index: | INT

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

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

index:
| INTEGER { $1 }
| MINUS INTEGER { 0 - $2 }
标记
整数
等在lexer中定义为正常

我试图分析一个例子,但失败了。但是,如果我注释
|减去整数{0-$2}
,则效果良好。因此,问题肯定与此有关。为了调试,我想获得更多信息,换句话说,我想知道什么是
减去整数。我尝试添加打印:

index:
| INTEGER { $1 }
| MINUS INTEGER { Printf.printf "%n" $2; 0 - $2 }
但解析时不会打印任何内容


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

我试着想出一个你描述的例子,并能用下面的内容得到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 } 

--verbose--debug
包含在
yacc
的命令行中。对不起,我刚刚意识到我正在使用
menhir
。您的问题缺少重要的细节。你写的整数和负数被定义为“正常”,但我们不知道你认为什么是正常的。你写了“它失败了”,但你没有写它是如何失败的。您有异常,或者程序终止但结果奇怪?谢谢您的评论。“示例中的调试字符串结尾没有新行”==>我也没有看到代码结尾的
新行
…我相信新行不会强制在Printf.Printf中刷新。使用“%!”进行显式刷新。生成输出不需要\n。我建议在执行Printf.Printf时显示输出,而不是稍后。然而,我检查了一下,发现我错了。正如@camlspotter所说,它是%!这将导致刷新,而不是\n
open Test;;
open Ytest;;
open Lexing;;
let lexbuf = Lexing.from_channel stdin in
ignore (Ytest.item Test.test lexbuf)