Ocaml 在漂亮的打印机中自动缩进
我已经实现了一个漂亮的打印机,它在复杂的语法树上运行得很好。由于语法很复杂,有时给出一个Ocaml 在漂亮的打印机中自动缩进,ocaml,indentation,pretty-print,Ocaml,Indentation,Pretty Print,我已经实现了一个漂亮的打印机,它在复杂的语法树上运行得很好。由于语法很复杂,有时给出一个语句或表达式,因此打印构造函数有助于理解其结构。为此,我添加了一个参数constructor\u print。当此变量为false时,通常打印语句或表达式;否则,将以良好的顺序打印所有相关构造函数。下面是代码的一小部分(实际上有很多函数pp.): 例如,3+(-2)被解析为表达式e。当!构造函数\u print为falsepp_e标准输出e返回3+(-2);否则pp_e标准输出e返回 ADD_E_E ( In
语句
或表达式
,因此打印构造函数有助于理解其结构。为此,我添加了一个参数constructor\u print
。当此变量为false时,通常打印语句
或表达式
;否则,将以良好的顺序打印所有相关构造函数。下面是代码的一小部分(实际上有很多函数pp.
):
例如,3+(-2)
被解析为表达式e
。当<代码>!构造函数\u print为falsepp_e标准输出e
返回3+(-2)
;否则pp_e标准输出e
返回
ADD_E_E (
Int 3,
PARENTHESIZED_E UMINUS_E INT 2)
然而,问题是,我想在必要时打印缩进,以使其更具可读性。例如,我希望以前的输出可以是:
ADD_E_E (
INT 3,
PARENTHESIZED_E UMINUS_E INT 2)
规则很简单:当有一对(或三重或更多)构造函数(例如ADD_e_e
)时,它会为其参数打印一行新行,每行有另外2个缩进空间;当存在一元构造函数(例如,umius\u e
)时,它不会打印新行
几乎所有的行都有这种结构Printf.fprintf chan(tercs…)。
,因为它们很多,我真的需要以一种巧妙的方式自动缩进
我想到的一种方法是使用ref变量I
,它表示当前缩进的空格数。我们合并了i:=!i+2和i:=!i-2
之前和之后Printf.fprintf chan(tercs…)
。我们还需要修改tercs
返回的格式:一旦出现\n
,我们将在\n
之后添加i
空格
但是我也听说过
格式
模块提供的框
,提示
等。有人很了解它们吗?有没有更直接的解决方案可以满足我的要求?您可以向函数传递一个整数参数,该参数将包含您应该在每行开头写入的空格数。如果要执行递归调用,则应增加该值。这对学习如何使用格式模块也很有帮助String.make offset“”
如果当前缩进为offset
,则在换行后将生成要打印的字符串。
ADD_E_E (
INT 3,
PARENTHESIZED_E UMINUS_E INT 2)