我想解析一组表达式,例如: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
。我试着添加print:
index:
| INTEGER { $1 }
| MINUS INTEGER { Printf.printf "%n" $2; 0 - $2 }
但解析时没有打印出来。
有人能告诉我如何打印信息或调试信息吗?
答案 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)